当前位置:   article > 正文

【C语言】五字棋/三子棋代码(含任意多子)_五子棋代码

五子棋代码

五子棋 的图像结果

 五子棋代码c语言简单实现

(pvc版和pvp版都有)

人与电脑下,人与人下都实现了

案例演示:

三子棋

 

案例演示:

五子棋

代码展示:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #define X 10 //行
  3. #define Y 15 //列
  4. #define NUM 5//几子赢
  5. //三子棋: X=3 Y=3 NUM=3
  6. //五子棋: X>=10 Y>=10 NUM=5
  7. //多子棋:(N子棋)NUM=N
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11. void menu();
  12. void startgame();
  13. void gamePvC();
  14. void gamePvP();
  15. void initboard(char board[X][Y]);
  16. void printboard(char board[X][Y]);
  17. void playermove1(char board[X][Y]);
  18. void playermove2(char board[X][Y]);
  19. void PCmove(char board[X][Y]);
  20. char iswin(char board[X][Y], int x, int y);
  21. int Full(char board[X][Y]);
  22. char flag = 'a';
  23. int main()
  24. {
  25. startgame();
  26. //将游戏完全封装起来
  27. //实现一个函数对应一个功能
  28. return 0;
  29. }
  30. //菜单栏
  31. void menu()
  32. {
  33. printf(" ------------------------\n");
  34. printf("| 0.退出游戏 |\n");
  35. printf("| 1.PvC人机对局 |\n");
  36. printf("| 2.PvP双人对局 |\n");
  37. printf(" ------------------------\n");
  38. }
  39. //游戏开始
  40. void startgame()
  41. {
  42. int ret = 0;
  43. do
  44. {
  45. menu();
  46. scanf("%d", &ret);
  47. switch (ret)
  48. {
  49. case 0:
  50. printf("game over\n");
  51. break;
  52. case 1:
  53. gamePvC();
  54. break;
  55. case 2:
  56. gamePvP();
  57. break;
  58. default:
  59. printf("输入错误,请重新输入!\n");
  60. break;
  61. }
  62. } while (ret);
  63. }
  64. //人机对局游戏
  65. void gamePvC()
  66. {
  67. char board[X][Y] = { '\0' };
  68. initboard(board);
  69. printboard(board);
  70. while (1)
  71. {
  72. playermove1(board);
  73. if (flag == '*') break;
  74. if (Full(board) == 1) { flag = '='; break; }
  75. PCmove(board);
  76. if (flag == '#') break;
  77. if (Full(board) == 1) { flag = '='; break; }
  78. }
  79. if (flag == '*') printf("玩家胜利\n");
  80. if (flag == '#') printf("电脑胜利\n");
  81. if (flag == '=') printf("平局\n");
  82. }
  83. //双人对局游戏
  84. void gamePvP()
  85. {
  86. char board[X][Y] = { '\0' };
  87. initboard(board);
  88. printboard(board);
  89. while (1)
  90. {
  91. playermove1(board);
  92. if (flag == '*') break;
  93. if (Full(board) == 1) { flag = '='; break; }
  94. playermove2(board);
  95. if (flag == '@') break;
  96. if (Full(board) == 1) { flag = '='; break; }
  97. }
  98. if (flag == '*') printf("玩家1胜利\n");
  99. if (flag == '@') printf("玩家2胜利\n");
  100. if (flag == '=') printf("平局\n");
  101. }
  102. //遍历棋盘
  103. void initboard(char board[X][Y])
  104. {
  105. for (int i = 0; i < X; i++)
  106. {
  107. for (int j = 0; j < Y; j++)
  108. {
  109. board[i][j] = ' ';
  110. }
  111. }
  112. }
  113. //打印棋盘
  114. void printboard(char board[X][Y])
  115. {
  116. for (int i = 0; i < X; i++)
  117. {
  118. if (i == 0)
  119. {
  120. printf(" ");
  121. for (int k = 1; k <= Y; k++)
  122. {
  123. printf("%2d列", k);
  124. if (k == Y)printf("\n ");
  125. }
  126. for (int k = 0; k < Y; k++)
  127. {
  128. printf("+---");
  129. if (k == Y - 1)printf("+\n");
  130. }
  131. }
  132. for (int j = 0; j < Y; j++)
  133. {
  134. if (j == 0) printf("%2d行", i + 1);
  135. printf("|");
  136. printf(" %c ", board[i][j]);
  137. if (j == Y - 1)printf("|\n ");
  138. }
  139. for (int k = 0; k < Y; k++)
  140. {
  141. printf("+---");
  142. if (k == Y - 1)printf("+\n");
  143. }
  144. }
  145. }
  146. //玩家1下棋 *
  147. void playermove1(char board[X][Y])
  148. {
  149. while (1)
  150. {
  151. int x = 0, y = 0;
  152. printf("玩家1,(*玩家)请输入行数和列数以此下棋\n");
  153. scanf("%d %d", &x, &y);
  154. if (x <= X && x >= 1 && y <= Y && y >= 1 && (board[x - 1][y - 1] == ' '))
  155. {
  156. board[x - 1][y - 1] = '*';
  157. flag = iswin(board, x, y);
  158. break;
  159. }
  160. else
  161. {
  162. printf("输入错误,请重新输入\n");
  163. }
  164. }
  165. }
  166. //玩家2下棋 @
  167. void playermove2(char board[X][Y])
  168. {
  169. while (1)
  170. {
  171. int x = 0, y = 0;
  172. printf("玩家2,(@玩家)请输入行数和列数以此下棋\n");
  173. scanf("%d %d", &x, &y);
  174. if (x <= X && x >= 1 && y <= Y && y >= 1 && (board[x - 1][y - 1] == ' '))
  175. {
  176. board[x - 1][y - 1] = '@';
  177. flag = iswin(board, x, y);
  178. break;
  179. }
  180. else
  181. {
  182. printf("输入错误,请重新输入\n");
  183. }
  184. }
  185. }
  186. //电脑下棋 #
  187. void PCmove(char board[X][Y])
  188. {
  189. srand((unsigned)time(NULL));
  190. while (1)
  191. {
  192. int x = 0;
  193. int y = 0;
  194. x = (rand() % X) + 1;
  195. y = (rand() % Y) + 1;
  196. if (board[x - 1][y - 1] == ' ')
  197. {
  198. board[x - 1][y - 1] = '#';
  199. flag = iswin(board, x, y);
  200. break;
  201. }
  202. }
  203. }
  204. //棋盘是否满了
  205. int Full(char board[X][Y])
  206. {
  207. for (int i = 0; i < X; i++)
  208. {
  209. for (int j = 0; j < Y; j++)
  210. {
  211. if (board[i][j] == ' ') return 0;
  212. }
  213. }
  214. return 1;
  215. }
  216. //判断胜负
  217. char iswin(char board[X][Y], int x, int y)
  218. {
  219. int arr[X][Y] = { 0 };
  220. int way[4] = { 1,1,1,1 };
  221. char c = board[x - 1][y - 1];
  222. system("cls");
  223. printboard(board);
  224. printf("上一步%c下在了%d行%d列\n", c, x, y);
  225. //将该种类型棋子变成0 1混合的int类型数组,1表示该种类型的棋子分布
  226. for (int i = 0; i < X; i++)
  227. {
  228. for (int j = 0; j < Y; j++)
  229. {
  230. if (board[i][j] == c)
  231. {
  232. arr[i][j] = 1;
  233. }
  234. }
  235. }
  236. //校准行列数
  237. x--;
  238. y--;
  239. for (int i = 1; i < NUM; i++)
  240. if (x - i >= 0 && arr[x - i][y] == 1) way[0]++;
  241. for (int i = 1; i < NUM; i++)
  242. if (x + i < X && arr[x + i][y] == 1) way[0]++;
  243. for (int i = 1; i < NUM; i++)
  244. if (y - i >= 0 && arr[x][y - i] == 1) way[1]++;
  245. for (int i = 1; i < NUM; i++)
  246. if (y + i < Y && arr[x][y + i] == 1) way[1]++;
  247. for (int i = 1; i < NUM; i++)
  248. if (x - i >= 0 && y - i >= 0 && arr[x - i][y - i] == 1) way[2]++;
  249. for (int i = 1; i < NUM; i++)
  250. if (x + i < X && y + i < Y && arr[x + i][y + i] == 1) way[2]++;
  251. for (int i = 1; i < NUM; i++)
  252. if (x - i >= 0 && y + i < Y && arr[x - i][y + i] == 1) way[3]++;
  253. for (int i = 1; i < NUM; i++)
  254. if (x + i < X && y - i >= 0 && arr[x + i][y - i] == 1) way[3]++;
  255. if (way[0] == NUM) printf(" ↑↓方向有了%d个棋子\n", way[0]);
  256. if (way[1] == NUM) printf(" ←→方向有了%d个棋子\n", way[1]);
  257. if (way[2] == NUM) printf(" ↖↘方向有了%d个棋子\n", way[2]);
  258. if (way[3] == NUM) printf(" ↙↗方向有了%d个棋子\n", way[3]);
  259. if (way[0] == NUM || way[1] == NUM || way[2] == NUM || way[3] == NUM)
  260. {
  261. printf("达成%d子连珠!\n", NUM);
  262. return board[x][y];
  263. }
  264. return 'a';
  265. }

 

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

闽ICP备14008679号