当前位置:   article > 正文

【C语言 |五子棋】C语言实现五子棋_c语言五子棋代码

c语言五子棋代码

目录

一、问题描述

二、基本思路

三、步骤

1.菜单界面

​编辑2.创建一个棋盘

3.棋盘初始化

4.打印棋盘

5.玩家落子

6.电脑落子

7.判断胜负

8.主要逻辑实现

四、代码实现


一、问题描述

用C语言实现五子棋。

二、基本思路

实现代码的逻辑

1. 进入游戏就打印出一个首页菜单要求玩家选择

2.创建一个棋盘并且初始化

3.打印出来棋盘

4.玩家通过(x,y)坐标的方式输入进行落子,电脑通过生成(x,y)随机数方式落子

5.玩家落子用 o 表示,电脑落子用 * 表示

5.判断胜负关系

三、步骤

1.菜单界面

首先玩家进入程序,不管三七二十一先打印出来菜单(可以用do  while语句实现)

输入 1.play  开始游戏

输入 0.exit 退出游戏

  1. void menu(void)
  2. {
  3. printf("************************\n");
  4. printf("************************\n");
  5. printf("*********1.play ********\n");
  6. printf("*********0.exit ********\n");
  7. printf("************************\n");
  8. printf("************************\n\n");
  9. }

2.创建一个棋盘

棋盘:用一个二维数组来创建,元素类型char

注意使用宏定义的好处:

有助于程序的扩展性(后期需要变动只需要变动只需要修改定义的部分)

增加程序可读性

  1. #define ROW 10
  2. #define COL 10
  3. char board[ROW][COL] = { 0 };

3.棋盘初始化

可以使用memset()这个库函数实现--------包含头文件  #include<string,h>

复制字符 c(一个无符号字符)到参数 boarrd所指向的字符串的前 n 个字符

  1. //这个c作用是需要初始化什么就传什么字符
  2. void InitBoard(char board[ROW][COL],int row,int col,char c)
  3. {
  4. //(row*col*sizeof(board[0][0])) 行*列*单个元素大小 就是整个数组大小
  5. memset(&board[0][0],c,row*col*sizeof(board[0][0]));
  6. }

当然不用库函数 也可以用无脑的办法 都是可以的

  1. void InitBoard(char board[ROW][COL],int row,int col,char c)
  2. {
  3. int i = 0,j = 0;
  4. for(i = 0;i < row;i++)
  5. {
  6. for(j = 0;j < col;j++)
  7. {
  8. board[i][j] = c;
  9. }
  10. }
  11. }

4.打印棋盘

因为刚开始的棋盘被初始化为空白,为了美观一点,可以修饰一下

  1. void DisplayBoard(char board[ROW][COL],int row,int col)
  2. {
  3. int i = 0, j = 0;
  4. for (i = 0; i < row;i++)
  5. {
  6. for (j = 0 ; j < col;j++)
  7. {
  8. printf(" %c ",board[i][j]); /*我们将( %c |)看成一个整体*/
  9. if (j < col - 1)
  10. {
  11. printf("|");
  12. }
  13. }
  14. printf("\n");
  15. if (i < row - 1)
  16. {
  17. for (j = 0; j < col ;j++)
  18. {
  19. printf("---"); /*我们将(---|)看成一个整体*/
  20. if (j < col - 1)
  21. {
  22. printf("|");
  23. }
  24. }
  25. printf("\n");
  26. }
  27. }
  28. }

因为我们上面定义的 ROW COL为10   --- -->   所以打印出来了10行10列 

5.玩家落子

玩家输入行列坐标表示落子,使用 ’o’ 表示玩家落子

并且只能落在没有棋子的棋盘内部,代码实现如下

  1. void PlayerMove(char board[ROW][COL],int row,int col)
  2. {
  3. //x坐标 y坐标
  4. int x = 0, y = 0;
  5. printf("玩家下棋\n");
  6. while (1)
  7. {
  8. printf("请输入下棋的坐标(x,y) -> ->");
  9. scanf("%d %d", &x, &y);
  10. /*当满足输入的x y坐标范围时候才会进入输入并且break跳出去,否则一直在里面循环*/
  11. if (x >= 1 && x <= row && y >= 1 && y <= col)
  12. {
  13. if (board[x - 1][y - 1] == ' ')
  14. {
  15. board[x - 1][y - 1] = 'o';
  16. //输入正确 落子o 并且跳出
  17. break;
  18. }
  19. else
  20. {
  21. printf("这个位置有棋子了,请重新输入坐标\n");
  22. }
  23. }
  24. else
  25. {
  26. printf("输出错误请重新输入\n");
  27. }
  28. }
  29. }

正常输入并落子

 错误输入重新输入

输入位置有棋子重新输入 

为什么上面要用board[ x - 1][ y - 1], 因为对于数组而言下标是从0开始

但是为了程序对于玩家的友好性,玩家输入的(1,1),对于数组真实的位置应该是(0,0) 

6.电脑落子

电子落子主要逻辑是生成两个在棋盘范围内的随机数(x,y) ,在棋盘没有棋子地方落子' * '


为了保证每一次的值真正随机,在主函数里面给她一个时间戳种子
并且包含两个头文件

  1. #include<stdlib.h>
  2. #include<time.h>
  3. srand((unsigned int)time(NULL))

  1. void ComputerMove(char board[ROW][COL], int row, int col)
  2. {
  3. printf("电脑下棋\n");
  4. while (1)
  5. {
  6. int x = rand() % row;
  7. int y = rand() % col;
  8. if (board[x][y] == ' ')
  9. {
  10. board[x][y] = '*';
  11. break;
  12. }
  13. }
  14. }

电脑随机在没有棋子地方落子 * 

7.判断胜负

我们先规定

玩家赢返回字符 o

电脑赢返回字符 *
平局返回字符 Q
继续返回字符 C

然后五子棋  横竖两条对角线 任意一条连5个连续的棋子就是胜利

so 可以这样实现 

  1. char IsWin(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0, j = 0;
  4. for (i = 0; i < row; i++)
  5. {
  6. for (j = 0; j < col; j++)
  7. {
  8. //横着连成五子
  9. if (j < row - 4)
  10. {
  11. if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] == board[i][j + 3] && board[i][j] == board[i][j + 4] && board[i][j] != ' ')
  12. {
  13. return board[i][j];
  14. }
  15. }
  16. //竖着连成五子
  17. if (i < col - 4)
  18. {
  19. if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] == board[i + 3][j] && board[i][j] == board[i + 4][j] && board[i][j] != ' ')
  20. {
  21. return board[i][j];
  22. }
  23. }
  24. //向右对角线着连成五子
  25. if (i < col - 4 && j < row - 4)
  26. {
  27. if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] == board[i + 3][j + 3] && board[i][j] == board[i + 4][j + 4] && board[i][j] != ' ')
  28. {
  29. return board[i][j];
  30. }
  31. }
  32. //左对角线着连成五子
  33. if (i < col - 4 && j < row - 4)
  34. {
  35. if (board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] == board[i + 3][j - 3] && board[i][j] == board[i + 4][j - 4] && board[i][j] != ' ')
  36. {
  37. return board[i][j];
  38. }
  39. }
  40. }
  41. }
  42. //判断是否满格
  43. if (IsFull(board, ROW, COL))
  44. {
  45. return 'Q';
  46. }
  47. //上述都不符合 返回字符'C' 继续游戏
  48. return 'C';
  49. }

IsFull()函数是为了检测键盘棋子是否占满 

占满了返回1 进入if语句,未占满返回0  不进入if语句

  1. int IsFull(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0, j = 0;
  4. for (i = 0;i<row;i++)
  5. {
  6. for (j = 0;j < col;j++)
  7. {
  8. if (board[i][j] == ' ')
  9. {
  10. return 0;
  11. }
  12. }
  13. }
  14. return 1;
  15. }

8.主要逻辑实现

这个函数主要实现整体逻辑

  1. void game()
  2. {
  3. char ret = 0;
  4. //创建棋盘
  5. char board[ROW][COL] = {0};
  6. //初始化棋盘
  7. InitBoard(board,ROW,COL,' ');
  8. //打印棋盘
  9. DisplayBoard(board, ROW, COL);
  10. while (1)
  11. {
  12. //玩家落子
  13. PlayerMove(board, ROW, COL);
  14. DisplayBoard(board, ROW, COL);
  15. //判断输赢
  16. ret = IsWin(board, ROW, COL);
  17. if (ret != 'C')
  18. {
  19. break;
  20. }
  21. //电脑落子
  22. ComputerMove(board, ROW, COL);
  23. DisplayBoard(board, ROW, COL);
  24. //判断输赢
  25. ret = IsWin(board, ROW, COL);
  26. if (ret != 'C')
  27. {
  28. break;
  29. }
  30. }
  31. if (ret == 'o')
  32. {
  33. printf("恭喜你 你赢了!\n");
  34. system("pause");
  35. }
  36. if (ret == '*')
  37. {
  38. printf("人机都下不过,菜多练\n");
  39. system("pause");
  40. }
  41. if (ret == 'Q')
  42. {
  43. printf("平局了,你跟人机一样菜\n");
  44. system("pause");
  45. }
  46. }

四、代码实现

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #include<windows.h>
  6. #define ROW 10
  7. #define COL 10
  8. void menu(void)
  9. {
  10. printf("************************\n");
  11. printf("************************\n");
  12. printf("*********1.play ********\n");
  13. printf("*********0.exit ********\n");
  14. printf("************************\n");
  15. printf("************************\n\n");
  16. }
  17. void InitBoard(char board[ROW][COL],int row,int col,char c)
  18. {
  19. memset(&board[0][0],c,row*col*sizeof(board[0][0]));
  20. }
  21. void DisplayBoard(char board[ROW][COL], int row, int col)
  22. {
  23. int i = 0, j = 0;
  24. for (i = 0; i < row; i++)
  25. {
  26. for (j = 0; j < col; j++)
  27. {
  28. printf(" %c ", board[i][j]);
  29. if (j < col - 1)
  30. {
  31. printf("|");
  32. }
  33. }
  34. printf("\n");
  35. if (i < row - 1)
  36. {
  37. for (j = 0; j < col; j++)
  38. {
  39. printf("---");
  40. if (j < col - 1)
  41. {
  42. printf("|");
  43. }
  44. }
  45. printf("\n");
  46. }
  47. }
  48. }
  49. void PlayerMove(char board[ROW][COL], int row, int col)
  50. {
  51. int x = 0, y = 0;
  52. printf("玩家下棋\n");
  53. while (1)
  54. {
  55. printf("请输入下棋的坐标(x,y) ->");
  56. scanf("%d %d",&x,&y);
  57. if (x >= 1 && x <= row && y >= 1 && y <= col)
  58. {
  59. if (board[x - 1][y - 1] == ' ')
  60. {
  61. board[x - 1][y - 1] = 'o';
  62. break;
  63. }
  64. else
  65. {
  66. printf("这个位置有棋子了,请重新输入坐标\n");
  67. }
  68. }
  69. else
  70. {
  71. printf("输出错误请重新输入\n");
  72. }
  73. }
  74. }
  75. void ComputerMove(char board[ROW][COL], int row, int col)
  76. {
  77. printf("电脑下棋\n");
  78. while (1)
  79. {
  80. int x = rand() % row;
  81. int y = rand() % col;
  82. if (board[x][y] == ' ')
  83. {
  84. board[x][y] = '*';
  85. break;
  86. }
  87. }
  88. }
  89. int IsFull(char board[ROW][COL], int row, int col)
  90. {
  91. int i = 0, j = 0;
  92. for (i = 0;i<row;i++)
  93. {
  94. for (j = 0;j < col;j++)
  95. {
  96. if (board[i][j] == ' ')
  97. {
  98. return 0;
  99. }
  100. }
  101. }
  102. return 1;
  103. }
  104. char IsWin(char board[ROW][COL], int row, int col)
  105. {
  106. int i = 0, j = 0;
  107. for (i = 0; i < row; i++)
  108. {
  109. for (j = 0; j < col; j++)
  110. {
  111. //横着连成五子
  112. if (j < row - 4)
  113. {
  114. if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] == board[i][j + 3] && board[i][j] == board[i][j + 4] && board[i][j] != ' ')
  115. {
  116. return board[i][j];
  117. }
  118. }
  119. //竖着连成五子
  120. if (i < col - 4)
  121. {
  122. if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] == board[i + 3][j] && board[i][j] == board[i + 4][j] && board[i][j] != ' ')
  123. {
  124. return board[i][j];
  125. }
  126. }
  127. //向右对角线着连成五子
  128. if (i < col - 4 && j < row - 4)
  129. {
  130. if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] == board[i + 3][j + 3] && board[i][j] == board[i + 4][j + 4] && board[i][j] != ' ')
  131. {
  132. return board[i][j];
  133. }
  134. }
  135. //左对角线着连成五子
  136. if (i < col - 4 && j < row - 4)
  137. {
  138. if (board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] == board[i + 3][j - 3] && board[i][j] == board[i + 4][j - 4] && board[i][j] != ' ')
  139. {
  140. return board[i][j];
  141. }
  142. }
  143. }
  144. }
  145. //判断是否满格
  146. if (IsFull(board, ROW, COL))
  147. {
  148. return 'Q';
  149. }
  150. //上述都不符合 返回字符'C' 继续游戏
  151. return 'C';
  152. }
  153. void game()
  154. {
  155. char ret = 0;
  156. //创建棋盘
  157. char board[ROW][COL] = {0};
  158. //初始化棋盘
  159. InitBoard(board,ROW,COL,' ');
  160. //打印棋盘
  161. DisplayBoard(board, ROW, COL);
  162. while (1)
  163. {
  164. //玩家落子
  165. PlayerMove(board, ROW, COL);
  166. DisplayBoard(board, ROW, COL);
  167. ret = IsWin(board, ROW, COL);
  168. if (ret != 'C')
  169. {
  170. break;
  171. }
  172. //电脑落子
  173. ComputerMove(board, ROW, COL);
  174. DisplayBoard(board, ROW, COL);
  175. ret = IsWin(board, ROW, COL);
  176. if (ret != 'C')
  177. {
  178. break;
  179. }
  180. }
  181. if (ret == 'o')
  182. {
  183. printf("恭喜你 你赢了!\n");
  184. system("pause");
  185. }
  186. if (ret == '*')
  187. {
  188. printf("人机都下不过,菜多练\n");
  189. system("pause");
  190. }
  191. if (ret == 'Q')
  192. {
  193. printf("平局了,你跟人机一样菜\n");
  194. system("pause");
  195. }
  196. }
  197. int main()
  198. {
  199. int input = 0;
  200. srand((unsigned int)time(NULL));
  201. do
  202. {
  203. system("cls");
  204. menu();
  205. printf("请输入你的选择->");
  206. scanf("%d", &input);
  207. switch (input)
  208. {
  209. case 1:
  210. system("cls");
  211. printf("****************************五子棋*******************************\n\n\n");
  212. game();
  213. break;
  214. case 0:
  215. printf("游戏结束GOODBYE!!!!!!!~.0.0\n");
  216. break;
  217. default:
  218. printf("只能选菜单中的数字\n");
  219. system("pause");
  220. break;
  221. }
  222. } while (input);
  223. system("pause");
  224. return 0;
  225. }

希望对你有帮助

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号