该游戏为c语言写的练手小游戏
大致分为两部分:
主程序
首先加载菜单
用户选择人机或者双人,进入游戏函数
选择退出时,退出程序
选择不合法选项时,再次加载菜单供用户选择
菜单代码
- /**
- * @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;
- }
复制代码 游戏部分
首先加载棋盘
然后让用户输入位置坐标
判断坐标合法性
判断游戏状态:输赢及继续状态
加载棋盘
棋盘设置如下:
此处我设置了一个全局变量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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |