• 售前

  • 售后

热门帖子
入门百科

简易版三子棋

[复制链接]
_阿乐哥哥 显示全部楼层 发表于 2022-1-13 12:34:23 |阅读模式 打印 上一主题 下一主题
目录
一、菜单栏
二、初始化棋盘
三、打印棋盘
四、玩家下棋
五、电脑下棋
六、判断输赢
七、调用玩家、电脑下棋函数和判断输赢函数
八、全部代码

一、菜单栏
1.制作一个简易版的菜单,并附上选项提示

 2.因为该程序想至少运行一次,所有选择用do while循环,而选择玩与不玩游戏时,则采用switch case语句比较合适,然后调用相应的函数即可

 二、初始化棋盘
1.先创建一个棋盘
为了便于更改棋盘大小,所有采用宏定义的方式来定义其行与列

 
2.对棋盘进行初始化
起初未下棋时,棋盘应该是空白的,所有将其全部元素初始化为空格

 三、打印棋盘
 
 
 四、玩家下棋
由于玩家不知道数组下标以0开头,所有在用棋盘数组时,行与列都应该-1
而下棋时,可能会出现写错坐标或者写的坐标已经有棋子的情况,所有采用循环
 
 五、电脑下棋
电脑下棋采用随机数的方法,就需要用到时间戳和随机数的函数:rand(),time()两个函数,而调用rand()函数时需要调用srand()函数
由于随机数不确定,所有采用取模的方法,将其范围改成棋盘数组行标和列标的范围
由于不知道所下棋的地方是否有棋子,同样采用循环的方式

六、判断输赢
1.判断输赢的四种结果
如果玩家赢——返回  '*'
如果电脑赢——返回 '#'
如果平局    ——返回 'Q'
游戏继续    ——返回 'C'
2.判断行是否相等

 3.判断列是否相等

4.判断对角线是否相等
 如果棋盘比较大时,就需要采取循环的方式来判断
5.判断平局或者游戏继续时得看棋盘是否满了

 
 七、调用玩家、电脑下棋函数和判断输赢函数
 由于下棋是多步操作,所有采用循环
 每下一步棋都应该打印棋盘,同时还有判断游戏是否还需要继续,不继续,则跳出,判断输赢

 八、全部代码
  1. //测试文件
  2. #include"game.h"
  3. void menu()
  4. {
  5.         printf("*****************************\n");
  6.         printf("*****    1.play    **********\n");
  7.         printf("*****    0.exit    **********\n");
  8.         printf("*****************************\n");
  9. }
  10. void game()
  11. {
  12.         //创建一个棋盘数组
  13.         char board[ROW][COL];
  14.         //对棋盘进行初始化
  15.         InitBoard(board, ROW, COL);
  16.         //打印棋盘
  17.         DisplayBoard(board, ROW, COL);
  18.         char ret = '\0';
  19.         while (1)
  20.         {
  21.                 //玩家下棋
  22.                 PlayerMove(board, ROW, COL);
  23.                 DisplayBoard(board, ROW, COL);
  24.                 ret = IsWin(board, ROW, COL);
  25.                 //游戏继续
  26.                 if (ret != 'C')
  27.                 {
  28.                         break;
  29.                 }
  30.                 //电脑下棋
  31.                 ComputerMove(board, ROW, COL);
  32.                 DisplayBoard(board, ROW, COL);
  33.                 ret = IsWin(board, ROW, COL);
  34.                 //游戏继续
  35.                 if (ret != 'C')
  36.                 {
  37.                         break;
  38.                 }
  39.         }
  40.         if (ret == '*')
  41.         {
  42.                 printf("玩家赢\n");
  43.         }
  44.         else if (ret == '#')
  45.         {
  46.                 printf("电脑赢\n");
  47.         }
  48.         else
  49.         {
  50.                 printf("平局\n");
  51.         }
  52. }
  53. int main()
  54. {
  55.         int input = 0;
  56.         srand((unsigned int)time(NULL));
  57.         do
  58.         {
  59.                 menu();
  60.                 printf("请选择:");
  61.                 scanf("%d", &input);
  62.                 switch (input)
  63.                 {
  64.                 case 1:
  65.                         game();//玩游戏
  66.                         break;
  67.                 case 0:
  68.                         printf("退出游戏\n");
  69.                         break;
  70.                 default:
  71.                         printf("选择错误,请重新选择\n");
  72.                         break;
  73.                 }
  74.         } while (input);
  75.         return 0;
  76. }
  77. //声明文件
  78. #include<stdio.h>
  79. #include<stdlib.h>
  80. #include<time.h>
  81. //用宏定义的方法定义行与列,便于修改棋盘
  82. #define ROW 3  
  83. #define COL 3
  84. //初始化棋盘
  85. void InitBoard(char board[ROW][COL],int row,int col);
  86. //打印棋盘
  87. void DisplayBoard(char board[ROW][COL], int row, int col);
  88. //玩家下棋
  89. void PlayerMove(char board[ROW][COL], int row, int col);
  90. //电脑下棋
  91. void ComputerMove(char board[ROW][COL], int row, int col);
  92. //判断输赢
  93. char IsWin(char board[ROW][COL], int row, int col);
  94. //函数定义文件
  95. #include"game.h"
  96. //初始化棋盘
  97. void InitBoard(char board[ROW][COL], int row, int col)
  98. {
  99.         int i = 0;
  100.         for (i = 0; i < row; i++)
  101.         {
  102.                 int j = 0;
  103.                 for (j = 0; j < col; j++)
  104.                 {
  105.                         board[i][j] = ' ';//初始化为空格
  106.                 }
  107.         }
  108. }
  109. //打印棋盘
  110. void DisplayBoard(char board[ROW][COL], int row, int col)
  111. {
  112.         int i = 0;
  113.         for (i = 0; i < row; i++)
  114.         {
  115.                 int j = 0;
  116.                 //打印每一行
  117.                 for (j = 0; j < col; j++)
  118.                 {
  119.                         printf(" %c ",board[i][j]);
  120.                         //向右最外面的不打印(|)
  121.                         if (j < col - 1)
  122.                         {
  123.                                 printf("|");
  124.                         }
  125.                 }
  126.                 printf("\n");
  127.                 //打印分隔行,但最下面不用打印(---|)
  128.                 if (i < row - 1)
  129.                 {
  130.                         for (j = 0; j < col; j++)
  131.                         {
  132.                                 printf("---");
  133.                                 //向右最外面的不打印(|)
  134.                                 if (j < col - 1)
  135.                                 {
  136.                                         printf("|");
  137.                                 }
  138.                         }
  139.                         printf("\n");
  140.                 }
  141.         }
  142. }
  143. //玩家下棋
  144. void PlayerMove(char board[ROW][COL], int row, int col)
  145. {
  146.         int x = 0;
  147.         int y = 0;
  148.         printf("玩家下棋,输入坐标:");
  149.         while (1)
  150.         {
  151.                 scanf("%d %d", &x, &y);
  152.                 if (x <= row && x > 0 && y <= col && y > 0 )
  153.                 {
  154.                         if (board[x - 1][y - 1] == ' ')
  155.                         {
  156.                                 board[x - 1][y - 1] = '*';
  157.                                 break;
  158.                         }
  159.                         else
  160.                         {
  161.                                 printf("坐标已经被占用,请重新输入\n");
  162.                         }
  163.                 }
  164.                 else
  165.                 {
  166.                         printf("坐标非法,请重新输入\n");
  167.                 }
  168.         }
  169. }
  170. //电脑下棋
  171. void ComputerMove(char board[ROW][COL], int row, int col)
  172. {
  173.         int x = 0;
  174.         int y = 0;
  175.         printf("电脑下棋:");
  176.         while (1)
  177.         {
  178.                 x = rand() % row;
  179.                 y = rand() % col;
  180.                 if (board[x][y] == ' ')
  181.                 {
  182.                         board[x][y] = '#';
  183.                         printf("\n");
  184.                         break;
  185.                 }
  186.         }
  187. }
  188. //判断输赢
  189. //玩家赢  -- 返回‘*’
  190. //电脑赢  -- 返回‘#’
  191. //平局    -- 返回‘Q’
  192. //游戏继续-- 返回‘C’
  193. //判断棋盘是否满了
  194. int IsFull(char board[ROW][COL], int row, int col)
  195. {
  196.         int i = 0;
  197.         for (i = 0; i < row; i++)
  198.         {
  199.                 int j = 0;
  200.                 for (j = 0; j < col; j++)
  201.                 {
  202.                         if (board[i][j] == ' ')
  203.                         {
  204.                                 return 0;//棋盘未满
  205.                         }
  206.                 }
  207.         }
  208.         return 1;//棋盘满了
  209. }
  210. char IsWin(char board[ROW][COL], int row, int col)
  211. {
  212.         //行相等
  213.         int i = 0;
  214.         for (i = 0; i < row; i++)
  215.         {
  216.                 if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
  217.                 {
  218.                         return board[i][1];
  219.                 }
  220.         }
  221.         //列相等
  222.         for (i = 0; i < row; i++)
  223.         {
  224.                 if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
  225.                 {
  226.                         return board[1][i];
  227.                 }
  228.         }
  229.         //对角线相等
  230.         if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  231.         {
  232.                 return board[1][1];
  233.         }
  234.         if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  235.         {
  236.                 return board[1][1];
  237.         }
  238.         //平局
  239.         if (IsFull(board, row, col) == 1)
  240.         {
  241.                 return 'Q';
  242.         }
  243.         //游戏继续
  244.         else
  245.         {
  246.                 return 'C';
  247.         }
  248. }
复制代码

 

来源:https://blog.caogenba.net/weixin_58867976/article/details/122451574
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作