当前位置:   article > 正文

用c语言实现简易三子棋

用c语言实现简易三子棋

本篇适用于C语言初学者。

目录

完整代码: 

分步介绍:

声明:

代码主体部分:

模块功能实现:


完整代码: 

  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define ROW 3
  5. #define COL 3
  6. void InitBorad(char borad[ROW][COL], int row, int col);
  7. void DisplayBorad(char borad[ROW][COL], int row, int col);
  8. void PlayerMove(char borad[ROW][COL], int row, int col);
  9. void ComputerMove(char borad[ROW][COL], int row, int col);
  10. char IsWin(char borad[ROW][COL], int row, int col);
  11. void InitBorad(char borad[ROW][COL], int row, int col)
  12. {
  13. int i = 0;
  14. for (i = 0; i < row; i++)
  15. {
  16. int j = 0;
  17. for (j = 0; j < col; j++)
  18. {
  19. borad[i][j] = ' ';
  20. }
  21. }
  22. }
  23. void DisplayBorad(char borad[ROW][COL], int row, int col)
  24. {
  25. int i = 0;
  26. for (i = 0; i < row; i++)
  27. {
  28. int j = 0;
  29. for (j = 0; j < col; j++)
  30. {
  31. printf(" %c ", borad[i][j]);
  32. if(j < col - 1)
  33. printf("|");
  34. }
  35. printf("\n");
  36. if (i < row - 1)
  37. {
  38. for (j = 0; j < col; j++)
  39. {
  40. printf("---");
  41. if (j < col - 1)
  42. printf("|");
  43. }
  44. }
  45. printf("\n");
  46. }
  47. }
  48. void PlayerMove(char borad[ROW][COL], int row, int col)
  49. {
  50. int x = 0;
  51. int y = 0;
  52. while (1)
  53. {
  54. printf("玩家下棋:>");
  55. scanf("%d %d", &x, &y);
  56. if (x >= 1 && x <= row && y >= 1 && y <= col)
  57. {
  58. if (borad[x - 1][y - 1] == ' ')
  59. {
  60. borad[x - 1][y - 1] = '*';
  61. break;
  62. }
  63. else
  64. {
  65. printf("该位置已被占有,请重新选择!\n");
  66. }
  67. }
  68. else
  69. {
  70. printf("输入错误,请重新选择!\n");
  71. }
  72. }
  73. }
  74. void ComputerMove(char borad[ROW][COL], int row, int col)
  75. {
  76. printf("电脑下棋:>\n");
  77. while (1)
  78. {
  79. int x = rand() % row;
  80. int y = rand() % col;
  81. if (borad[x][y] == ' ')
  82. {
  83. borad[x][y] = '#';
  84. break;
  85. }
  86. }
  87. }
  88. //'*'玩家赢
  89. //'#'电脑赢
  90. //'C'继续游戏
  91. //'Q'平局
  92. //char IsWin(char borad[ROW][COL], int row, int col)
  93. //{
  94. // int i = 0;
  95. // for (i = 0; i < row; i++)
  96. // {
  97. // if (borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2] && borad[i][0] != ' ')
  98. // return borad[i][0];
  99. // }
  100. // for (i = 0; i < col; i++)
  101. // {
  102. // if (borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i] && borad[0][i] != ' ')
  103. // return borad[0][i];
  104. // }
  105. // if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ')
  106. // return borad[0][0];
  107. // if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ')
  108. // return borad[0][2];
  109. // for (i = 0; i < row; i++)
  110. // {
  111. // int j = 0;
  112. // for (j = 0; j < col; j++)
  113. // {
  114. // if (borad[i][j] == ' ')
  115. // return 'C';
  116. // }
  117. // }
  118. // return 'Q';
  119. //}
  120. //判断优化
  121. char IsWin(char borad[ROW][COL], int row, int col)
  122. {
  123. int i = 0;
  124. int flag = 1;
  125. //行
  126. for (i = 0; i < row; i++)
  127. {
  128. flag = 1;
  129. int n = 0;
  130. if (borad[i][0] != ' ')
  131. {
  132. while (n < row - 1)
  133. {
  134. if (borad[i][n] != borad[i][n + 1])
  135. {
  136. flag = 0;
  137. break;
  138. }
  139. n++;
  140. }
  141. if (flag)
  142. return borad[i][0];
  143. }
  144. }
  145. //列
  146. for (i = 0; i < col; i++)
  147. {
  148. flag = 1;
  149. int n = 0;
  150. if (borad[0][i] != ' ')
  151. {
  152. while (n < col - 1)
  153. {
  154. if (borad[n][i] != borad[n + 1][i])
  155. {
  156. flag = 0;
  157. break;
  158. }
  159. n++;
  160. }
  161. if (flag)
  162. return borad[0][i];
  163. }
  164. }
  165. //左对角线
  166. if (borad[0][0] != ' ')
  167. {
  168. flag = 1;
  169. int n = 0;
  170. while (n < row - 1)
  171. {
  172. if (borad[n][n] != borad[n + 1][n + 1])
  173. {
  174. flag = 0;
  175. break;
  176. }
  177. n++;
  178. }
  179. if (flag)
  180. return borad[0][0];
  181. }
  182. //右对角线
  183. int r = 0;
  184. int c = col - 1;
  185. if (borad[r][c] != ' ')
  186. {
  187. flag = 1;
  188. while (r < row - 1)
  189. {
  190. if (borad[r][c] != borad[r + 1][c - 1])
  191. {
  192. flag = 0;
  193. break;
  194. }
  195. r++;
  196. c--;
  197. }
  198. if (flag)
  199. return borad[r][c];
  200. }
  201. //继续
  202. for (i = 0; i < row; i++)
  203. {
  204. int j = 0;
  205. for (j = 0; j < col; j++)
  206. {
  207. if (borad[i][j] == ' ')
  208. return 'C';
  209. }
  210. }
  211. //平局
  212. return 'Q';
  213. }
  214. void menu()
  215. {
  216. printf("**********************************\n");
  217. printf("********** 1.play ***********\n");
  218. printf("********** 0.exit ***********\n");
  219. printf("**********************************\n");
  220. }
  221. void game()
  222. {
  223. char borad[ROW][COL] = { 0 };
  224. char ch = 0;
  225. //初始化
  226. InitBorad(borad, ROW, COL);
  227. //打印棋盘
  228. DisplayBorad(borad, ROW, COL);
  229. //玩家下棋
  230. while (1)
  231. {
  232. //玩家下棋
  233. PlayerMove(borad, ROW, COL);
  234. DisplayBorad(borad, ROW, COL);
  235. //判断
  236. ch = IsWin(borad, ROW, COL);
  237. if (ch != 'C')
  238. break;
  239. //电脑下棋
  240. ComputerMove(borad, ROW, COL);
  241. DisplayBorad(borad, ROW, COL);
  242. ch = IsWin(borad, ROW, COL);
  243. if (ch != 'C')
  244. break;
  245. }
  246. if (ch == '*')
  247. printf("玩家赢!\n");
  248. else if (ch == '#')
  249. printf("电脑赢!\n");
  250. else if (ch == 'Q')
  251. printf("平局!\n");
  252. }
  253. int main()
  254. {
  255. int input = 0;
  256. srand((unsigned int)time(NULL));
  257. do
  258. {
  259. menu();
  260. printf("请选择:>");
  261. scanf("%d", &input);
  262. switch (input)
  263. {
  264. case 1:
  265. game();
  266. break;
  267. case 0:
  268. printf("退出游戏!\n");
  269. break;
  270. default:
  271. printf("输入错误,请重新选择!\n");
  272. break;
  273. }
  274. } while (input);
  275. return 0;
  276. }

分步介绍:

声明:

  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. //定义表示符常量分别表示行(ROW)和列(COL)
  5. #define ROW 3
  6. #define COL 3
  7. //初始化棋盘
  8. void InitBorad(char borad[ROW][COL], int row, int col);
  9. //打印棋盘
  10. void DisplayBorad(char borad[ROW][COL], int row, int col);
  11. //玩家移动
  12. void PlayerMove(char borad[ROW][COL], int row, int col);
  13. //电脑移动
  14. void ComputerMove(char borad[ROW][COL], int row, int col);
  15. //判断输赢实现
  16. char IsWin(char borad[ROW][COL], int row, int col);

代码主体部分:

  1. //游戏菜单
  2. void menu()
  3. {
  4. printf("**********************************\n");
  5. printf("********** 1.play ***********\n");
  6. printf("********** 0.exit ***********\n");
  7. printf("**********************************\n");
  8. }
  9. void game()
  10. {
  11. //定义一个模拟棋盘的二维数组
  12. char borad[ROW][COL] = { 0 };
  13. char ch = 0;
  14. //调用函数初始化棋盘(二维数组)
  15. InitBorad(borad, ROW, COL);
  16. //调用函数打印棋盘(二维数组)
  17. DisplayBorad(borad, ROW, COL);
  18. while (1)
  19. {
  20. //调用函数玩家下棋
  21. PlayerMove(borad, ROW, COL);
  22. DisplayBorad(borad, ROW, COL);
  23. //进行输赢判断
  24. ch = IsWin(borad, ROW, COL);
  25. //C表示继续游戏
  26. if (ch != 'C')
  27. break;
  28. //调用函数电脑下棋
  29. ComputerMove(borad, ROW, COL);
  30. //进行输赢判断
  31. DisplayBorad(borad, ROW, COL);
  32. ch = IsWin(borad, ROW, COL);
  33. if (ch != 'C')
  34. break;
  35. }
  36. // * 表示玩家赢
  37. if (ch == '*')
  38. printf("玩家赢!\n");
  39. // # 表示电脑赢
  40. else if (ch == '#')
  41. printf("电脑赢!\n");
  42. //Q表示平局
  43. else if (ch == 'Q')
  44. printf("平局!\n");
  45. }
  46. //主函数(程序入口)
  47. int main()
  48. {
  49. //存储选择的变量
  50. int input = 0;
  51. //使用time()库(time.h)函数和srand()库(stdlib.h)函数确定随机数生成起点,将time()返回值强制转换成无符号整型(unsigned int)。
  52. srand((unsigned int)time(NULL));
  53. do
  54. {
  55. //打印游戏菜单
  56. menu();
  57. //选择开始游戏或者退出游戏
  58. printf("请选择:>");
  59. scanf("%d", &input);
  60. switch (input)
  61. {
  62. case 1:
  63. game();
  64. break;
  65. case 0:
  66. printf("退出游戏!\n");
  67. break;
  68. default :
  69. printf("输入错误,请重新选择!\n");
  70. break;
  71. }
  72. } while (input);
  73. return 0;
  74. }

模块功能实现:

  1. //利用嵌套循环实现对棋盘(二维数组)的初始化,初始化为空格
  2. void InitBorad(char borad[ROW][COL], int row, int col)
  3. {
  4. int i = 0;
  5. for (i = 0; i < row; i++)
  6. {
  7. int j = 0;
  8. for (j = 0; j < col; j++)
  9. {
  10. borad[i][j] = ' ';
  11. }
  12. }
  13. }
  14. //利用嵌套循环实现对棋盘的打印
  15. void DisplayBorad(char borad[ROW][COL], int row, int col)
  16. {
  17. int i = 0;
  18. for (i = 0; i < row; i++)
  19. {
  20. int j = 0;
  21. for (j = 0; j < col; j++)
  22. {
  23. printf(" %c ", borad[i][j]);
  24. if(j < col - 1)
  25. printf("|");
  26. }
  27. printf("\n");
  28. if (i < row - 1)
  29. {
  30. for (j = 0; j < col; j++)
  31. {
  32. printf("---");
  33. if (j < col - 1)
  34. printf("|");
  35. }
  36. }
  37. printf("\n");
  38. }
  39. }
  40. //玩家下棋实现细节
  41. void PlayerMove(char borad[ROW][COL], int row, int col)
  42. {
  43. int x = 0;
  44. int y = 0;
  45. while (1)
  46. {
  47. printf("玩家下棋:>");
  48. //输入想要下棋地方的坐标:行从1开始,列从1开始(数组下标从0开始,因此需要对输入数据减1)
  49. scanf("%d %d", &x, &y);
  50. //对输入信息所对应的坐标进行判断和处理
  51. if (x >= 1 && x <= row && y >= 1 && y <= col)
  52. {
  53. if (borad[x - 1][y - 1] == ' ')
  54. {
  55. borad[x - 1][y - 1] = '*';
  56. break;
  57. }
  58. else
  59. {
  60. printf("该位置已被占有,请重新选择!\n");
  61. }
  62. }
  63. else
  64. {
  65. printf("输入错误,请重新选择!\n");
  66. }
  67. }
  68. }
  69. //电脑下棋实现细节
  70. void ComputerMove(char borad[ROW][COL], int row, int col)
  71. {
  72. printf("电脑下棋:>\n");
  73. while (1)
  74. {
  75. //代码主体部分已通过srand()设置随机数生成起点,此处调用rand()库(stdlib.h)函数生成两个随机数,分别作为二维数组的行下标和列下标
  76. int x = rand() % row;
  77. int y = rand() % col;
  78. //对坐标进行判断和处理
  79. if (borad[x][y] == ' ')
  80. {
  81. borad[x][y] = '#';
  82. break;
  83. }
  84. }
  85. }
  86. //'*'玩家赢
  87. //'#'电脑赢
  88. //'C'继续游戏
  89. //'Q'平局
  90. //此注释内容为原始判断方法实现内容
  91. //char IsWin(char borad[ROW][COL], int row, int col)
  92. //{
  93. // int i = 0;
  94. // for (i = 0; i < row; i++)
  95. // {
  96. // if (borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2] && borad[i][0] != ' ')
  97. // return borad[i][0];
  98. // }
  99. // for (i = 0; i < col; i++)
  100. // {
  101. // if (borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i] && borad[0][i] != ' ')
  102. // return borad[0][i];
  103. // }
  104. // if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ')
  105. // return borad[0][0];
  106. // if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ')
  107. // return borad[0][2];
  108. // for (i = 0; i < row; i++)
  109. // {
  110. // int j = 0;
  111. // for (j = 0; j < col; j++)
  112. // {
  113. // if (borad[i][j] == ' ')
  114. // return 'C';
  115. // }
  116. // }
  117. // return 'Q';
  118. //}
  119. //判断优化
  120. //'*'玩家赢
  121. //'#'电脑赢
  122. //'C'继续游戏
  123. //'Q'平局
  124. char IsWin(char borad[ROW][COL], int row, int col)
  125. {
  126. int i = 0;
  127. int flag = 1;
  128. //行的判断实现
  129. //循环遍历行
  130. for (i = 0; i < row; i++)
  131. {
  132. //作为实现判断依据的变量,假设游戏已经结束。
  133. flag = 1;
  134. //作为遍历一行内容的变量
  135. int n = 0;
  136. if (borad[i][0] != ' ')
  137. {
  138. while (n < row - 1)
  139. {
  140. if (borad[i][n] != borad[i][n + 1])
  141. {
  142. //如果本行三个落棋地方不一样,置flag变量为0,表示游戏未结束
  143. flag = 0;
  144. break;
  145. }
  146. n++;
  147. }
  148. //如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据
  149. if (flag)
  150. return borad[i][0];
  151. }
  152. }
  153. //列
  154. //具体实现细节同行
  155. for (i = 0; i < col; i++)
  156. {
  157. flag = 1;
  158. int n = 0;
  159. if (borad[0][i] != ' ')
  160. {
  161. while (n < col - 1)
  162. {
  163. if (borad[n][i] != borad[n + 1][i])
  164. {
  165. flag = 0;
  166. break;
  167. }
  168. n++;
  169. }
  170. //如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据
  171. if (flag)
  172. return borad[0][i];
  173. }
  174. }
  175. //左对角线
  176. //左对角线规律:行加一,列加一。 剩余实现原理同行
  177. if (borad[0][0] != ' ')
  178. {
  179. flag = 1;
  180. int n = 0;
  181. while (n < row - 1)
  182. {
  183. if (borad[n][n] != borad[n + 1][n + 1])
  184. {
  185. flag = 0;
  186. break;
  187. }
  188. n++;
  189. }
  190. //如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据
  191. if (flag)
  192. return borad[0][0];
  193. }
  194. //右对角线
  195. //右对角线规律:开始时行为零(数组)列为col - 1,此后行加一,列减一,直至行为数组下标最大值或者列为0。 剩余实现原理同行
  196. int r = 0;
  197. int c = col - 1;
  198. if (borad[r][c] != ' ')
  199. {
  200. flag = 1;
  201. while (r < row - 1)
  202. {
  203. if (borad[r][c] != borad[r + 1][c - 1])
  204. {
  205. flag = 0;
  206. break;
  207. }
  208. r++;
  209. c--;
  210. }
  211. //如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据
  212. if (flag)
  213. return borad[r][c];
  214. }
  215. //继续
  216. //前面判断并未生效,因此说明此时未有赢家诞生,对数组进行遍历,看看是否还有可以落棋的地方来判断是否游戏继续或者平局
  217. for (i = 0; i < row; i++)
  218. {
  219. int j = 0;
  220. for (j = 0; j < col; j++)
  221. {
  222. //如果有 ' ' 证明有地方可以落棋,返回 'C' 表示游戏继续
  223. if (borad[i][j] == ' ')
  224. return 'C';
  225. }
  226. }
  227. //平局
  228. //如果上述判断均未生效,且遍历数组发现没有可以落棋的坐标返回'Q'表示平局
  229. return 'Q';
  230. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/605004
推荐阅读
相关标签
  

闽ICP备14008679号