井字棋

该游戏为c语言写的练手小游戏

大致分为两部分:

  • 菜单显示
  • 游戏部分

主程序

首先加载菜单

image

用户选择人机或者双人,进入游戏函数

选择退出时,退出程序

选择不合法选项时,再次加载菜单供用户选择

菜单代码

/**
 * @brief 菜单函数
 *
 * @return 无返回值
 *
 * @code
 * Menu();
 * @endcode
 */
void Menu()
{
	printf("******************************\n");
	printf("******      井字棋      ******\n");
	printf(" 1.人机练习 2.双人对弈 3.退出 \n");
	printf("******************************\n\n\n");
}

主程序代码

/**
 * @brief 程序入口
 *
 * @return 返回0
 *
 */
int main(void)
{
	int chChoose = 0;//存储用户选项
	char isError = 0;//提示类别:0常规提示,1错误提示,默认值为0

	srand((unsigned)time(NULL));

	while (1)
	{
		memcpy(m_ChessboardArr, m_ChessboardArr_ori, sizeof(m_ChessboardArr));
		Menu();//显示菜单

		if (!isError)
			printf("请输入你的选择:");
		else
			printf("输入错误,请重新输入:");

		isError = 0;//在用户重新输入选项时,该值恢复默认值
		scanf("%d", &chChoose);//用户输入选项

		switch (chChoose)
		{
		case 1://人机练习
			Game(1);
			break;
		case 2://双人对弈
			Game(2);
			break;
		case 3://退出
			printf("即将退出游戏");
			Sleep(500);
			return 0;
		default:
			isError = 1;
		}
	}
	
	return 0;
}

游戏部分

首先加载棋盘

然后让用户输入位置坐标

判断坐标合法性

判断游戏状态:输赢及继续状态

加载棋盘

棋盘设置如下:

image

此处我设置了一个全局变量m_ChessboardArr来作为棋盘数组,其默认值为{ { ' ', ' ', ' ' }, { '_', '_', '_' }, { '_', '_', '_' } };

加载棋盘时,我是一行一行的加载

加载棋盘的代码

void ShowChessboard()
{
	for (int i = 2; i >= 0; --i)
		printf("%c|%c|%c\n", m_ChessboardArr[i][0], m_ChessboardArr[i][1], m_ChessboardArr[i][2]);//一次加载一行
}

提示用户输入位置坐标

此处直接用printf以及scanf函数来提示用户输入

判断坐标合法性

  • 坐标不超过棋盘大小
  • 坐标是默认值,即没有玩家在此处下棋

满足以上两点,则坐标合法

坐标不超过棋盘大小

if ((x > 3) || (y > 3))
{
	isError = 1;
	continue;
}

坐标是默认值

if (('*' == m_ChessboardArr[x - 1][y - 1]) || ('O' == m_ChessboardArr[x - 1][y - 1]))
{
	isError = 2;
	continue;
}

判断游戏状态

  • 判断每行是否一致
  • 判断每列是否一致
  • 判断对角线是否一致

如若有一个是一致的,且不是默认值,则有玩家赢得游戏

还需判断棋盘是否下满,如若下满则是平局

如若以上情况都不满足,则继续游戏

代码

/**
 * @brief 判断棋盘情况
 *
 *
 * @param m_ChessboardArr 棋盘数组
 * @return 返回1是玩家1赢;返回2是玩家2赢;返回3是未分胜负,继续游戏;返回0是棋盘下满,两人平局,游戏结束
 *
 * @code
 * int iResult = Judge();
 * @endcode
 */
int Judge()
{
	//判断每行每列情况
	for (int i = 0; i < 3; ++i)
	{
		if ((m_ChessboardArr[i][1] == m_ChessboardArr[i][0]) && (m_ChessboardArr[i][1] == m_ChessboardArr[i][2]))//判断每一行是否一致
		{
			if ('*' == m_ChessboardArr[i][1])//为*则是一号玩家获胜
				return 1;

			if ('O' == m_ChessboardArr[i][1])//为O则是二号玩家获胜
				return 2;
			//否则就是默认值,代表没有玩家在该处下棋
		}

		if ((m_ChessboardArr[1][i] == m_ChessboardArr[0][i]) && (m_ChessboardArr[1][i] == m_ChessboardArr[2][i]))//判断每一列是否一致
		{
			if ('*' == m_ChessboardArr[1][i])//为*则是一号玩家获胜
				return 1;

			if ('O' == m_ChessboardArr[1][i])//为O则是二号玩家获胜
				return 2;
			//否则就是默认值,代表没有玩家在该处下棋
		}
	}

	//判断对角线情况
	if (((m_ChessboardArr[1][1] == m_ChessboardArr[0][1]) && (m_ChessboardArr[1][1] == m_ChessboardArr[2][2])) ||
		((m_ChessboardArr[1][1] == m_ChessboardArr[0][2]) && (m_ChessboardArr[1][1] == m_ChessboardArr[2][0])))//判断对角线是否一致
	{
		if ('*' == m_ChessboardArr[1][1])//为*则是一号玩家获胜
			return 1;

		if ('O' == m_ChessboardArr[1][1])//为O则是二号玩家获胜
			return 2;
		//否则就是默认值,代表没有玩家在该处下棋
	}

	//判断棋盘是否下满
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			if ((m_ChessboardArr[i][j] != '*') && (m_ChessboardArr[i][j] != 'O'))//棋盘不为玩家值,即棋盘为默认值,则代表没有下满,还需继续游戏
				return 3;
		}
	}

	return 0;//棋盘下满,退出游戏
}

以上就是该小游戏的主要程序了,仅供分享学习用

游戏源码

https://gitee.com/EricsT/game/tree/master/Tic-Tac-Toe

posted @ 2025-08-17 15:51  EricsT  阅读(89)  评论(0)    收藏  举报