当前位置:   article > 正文

C语言---会思考的三子棋_会思考的三子棋游戏

会思考的三子棋游戏

学了二维数组我们就可以试着写一个三子棋小游戏了,但电脑随机的操作让整个游戏根本没难度,所以我给大家带来了一个不是那么笨的三子棋,将人的思维带给电脑,代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<windows.h>
  4. #include<stdlib.h>
  5. #include<time.h>
  6. #define ROW 3 //宏定义棋盘长宽
  7. #define COL 3
  8. void mvue() //打印游戏菜单函数
  9. {
  10. printf("*************************************\n");
  11. printf("*********** 1.开始游戏 *************\n");
  12. printf("*********** 0.退出游戏 *************\n");
  13. printf("*************************************\n");
  14. }
  15. //******************棋盘内部置空******************************
  16. void initialization(char disc[ROW][COL] )
  17. {
  18. int i = 0;
  19. for (i = 0; i < ROW; i++)
  20. {
  21. int n = 0;
  22. for (n = 0; n < COL; n++)
  23. {
  24. disc[i][n] = ' ';
  25. }
  26. }
  27. }
  28. //*****************创建棋盘外观,打印棋盘********************************
  29. void print(char disc[ROW][COL] )
  30. {
  31. printf("+---+---+---+\n");
  32. for (int row = 0; row < ROW; row++)
  33. {
  34. printf("| %c | %c | %c |\n", disc[row][0], disc[row][1], disc[row][2]);
  35. printf("+---+---+---+\n");
  36. }
  37. }
  38. //*****************玩家下棋******************************
  39. void a_fallingseed(char disc[ROW][COL])
  40. {
  41. while (1)
  42. {
  43. printf("输入一个坐标(例2,2):");
  44. int x = 0;
  45. int y = 0;
  46. scanf("%d,%d", &x, &y);
  47. if ((x > 0 && x <= ROW) && (y > 0 && y <= COL))
  48. {
  49. if (disc[x - 1][y - 1] == ' ')
  50. {
  51. disc[x - 1][y - 1] = '*';
  52. break;
  53. }
  54. else
  55. printf("坐标已有棋子\n");
  56. }
  57. else
  58. {
  59. printf("坐标非法\n");
  60. }
  61. }
  62. }
  63. //********************电脑下棋****************************
  64. int b_fallingseed(char disc[ROW][COL])//判断敌方横是否为2
  65. {
  66. for (int i = 0; i < ROW; i++)
  67. {
  68. int judge1 = 0;
  69. int n = 0;
  70. for ( n = 0; n < COL; n++)
  71. {
  72. if(disc[i][n] == '*')
  73. judge1++;
  74. }
  75. if (judge1 == 2)
  76. {
  77. for (int max = 0; max < COL; max++)
  78. {
  79. if (disc[i][max] == ' ')
  80. {
  81. disc[i][max] = '#';
  82. return 0;
  83. }
  84. }
  85. }
  86. }
  87. //-------------------------------------------
  88. for (int i = 0; i < COL; i++) //判断敌方纵是否为2
  89. {
  90. int judge2 = 0;
  91. int n = 0;
  92. for (n = 0; n < ROW; n++)
  93. {
  94. if(disc[n][i] == '*')
  95. judge2++;
  96. }
  97. if (judge2 == 2)
  98. {
  99. for (int max = 0; max < COL; max++)
  100. {
  101. if (disc[max][i] == ' ')
  102. {
  103. disc[max][i] = '#';
  104. return 0;
  105. }
  106. }
  107. }
  108. }
  109. //----------------判断敌方右斜是否为2 ---------------------------
  110. int pa = 0;
  111. int pb = 0;
  112. int judge3 = 0;
  113. for (pa = 0; pa < ROW && pb < COL; pa++,pb++)
  114. {
  115. if (disc[pa][pb] == '*')
  116. {
  117. judge3++;
  118. }
  119. if (judge3 == 2)
  120. {
  121. if (disc[0][0] == ' ')
  122. {
  123. disc[0][0] = '#';
  124. return 0;
  125. }
  126. else if (disc[1][1] == ' ')
  127. {
  128. disc[1][1] = '#';
  129. return 0;
  130. }
  131. else
  132. {
  133. disc[2][2] = '#';
  134. return 0;
  135. }
  136. }
  137. }
  138. //--------------判断敌方左斜是否为2 -------------------------
  139. int judge4 = 0;
  140. int pc = 0;
  141. int pd = 0;
  142. for (pc = 0, pd = COL - 1; pc < ROW && pd >= 0; pc++, pd--)
  143. {
  144. if (disc[pc][pd] == '*')
  145. {
  146. judge4++;
  147. }
  148. if (judge4 == 2)
  149. {
  150. if (disc[0][2] == ' ')
  151. {
  152. disc[0][2] = '#';
  153. return 0;
  154. }
  155. else if (disc[1][1] == ' ')
  156. {
  157. disc[1][1] = '#';
  158. return 0;
  159. }
  160. else
  161. {
  162. disc[2][0] = '#';
  163. return 0;
  164. }
  165. }
  166. }
  167. if (disc[1][1] == ' ') //如果没有必走棋,抢中心位置
  168. {
  169. disc[1][1] = '#';
  170. return 0;
  171. }
  172. else //如果中心位置已被占随机下一步棋
  173. { //这里的随机步还可以优化,让电脑随着你写的一个
  174. // 算法落子,每一步占据最大优势,但是这里是最难的,所以我没写
  175. while (1)
  176. {
  177. int row = rand() % ROW;
  178. int col = rand() % COL;
  179. if (disc[row][col] == ' ')
  180. {
  181. disc[row][col] = '#';
  182. return 0;
  183. }
  184. }
  185. }
  186. }
  187. int iswin(char disc[ROW][COL]) //判断继续游戏还是平局
  188. {
  189. int i = 0;
  190. int y = 0;
  191. for (i = 0; i < ROW; i++)
  192. {
  193. for (y = 0; y < COL; y++)
  194. {
  195. if (disc[i][y] == ' ')
  196. return 1;
  197. }
  198. }
  199. return 0;
  200. }
  201. //---------------------------------------------------
  202. char Win(char disc[ROW][COL]) //判断输赢
  203. {
  204. for (int i = 0; i < ROW; i++)
  205. {
  206. if (disc[i][0] == disc[i][1] && disc[i][1] == disc[i][2] && disc[i][1] != ' ')
  207. {
  208. return disc[i][1];
  209. }
  210. }
  211. for (int y = 0; y < COL; y++)
  212. {
  213. if (disc[0][y] == disc[1][y] && disc[1][y] == disc[2][y] && disc[1][y] != ' ')
  214. {
  215. return disc[0][y];
  216. }
  217. }
  218. if (disc[0][0] == disc[1][1] && disc[1][1] == disc[2][2] && disc[1][1] != ' ')
  219. {
  220. return disc[1][1];
  221. }
  222. else if (disc[0][2] == disc[1][1] && disc[1][1] == disc[2][0] && disc[1][1] != ' ')
  223. {
  224. return disc[1][1];
  225. }
  226. else
  227. {
  228. int c = iswin(disc);
  229. if (c == 0)
  230. return 'Q';
  231. else
  232. return ' ';
  233. }
  234. }
  235. void game() //游戏执行过程总函数
  236. {
  237. printf("玩家先(0)电脑先(1)\n");
  238. int vit = 0;
  239. scanf("%d", &vit);
  240. if (vit == 0) //玩家先
  241. {
  242. char disc[ROW][COL] = { 0 };
  243. initialization(disc);//初始化棋盘函数
  244. print(disc, ROW, COL); //创建棋盘外观
  245. char is = ' ';//判断根据
  246. while (1)
  247. {
  248. a_fallingseed(disc);//玩家下棋*
  249. print(disc, ROW, COL); //打印棋盘
  250. is = Win(disc); //判断胜负
  251. if (is != ' ')
  252. {
  253. break;
  254. }
  255. b_fallingseed(disc);//电脑下棋#
  256. print(disc, ROW, COL);//打印棋盘
  257. is = Win(disc); //判断胜负
  258. if (is != ' ')
  259. {
  260. break;
  261. }
  262. }
  263. if (is == '*')
  264. {
  265. printf("玩家胜利\n");
  266. }
  267. else if (is == '#')
  268. {
  269. printf("电脑胜利\n");
  270. }
  271. else if (is == 'Q')
  272. printf("平局\n");
  273. }
  274. else if (vit == 1) //电脑先
  275. {
  276. char disc[ROW][COL] = { 0 };
  277. initialization(disc);//初始化棋盘函数
  278. //print(disc, ROW, COL); //创建棋盘外观
  279. char is = ' ';//判断根据
  280. while (1)
  281. {
  282. b_fallingseed(disc);//电脑下棋#
  283. //print(disc, ROW, COL); //打印棋盘
  284. is = Win(disc); //判断胜负
  285. if (is != ' ')
  286. {
  287. break;
  288. }
  289. print(disc, ROW, COL);
  290. a_fallingseed(disc);//玩家下棋*
  291. //print(disc, ROW, COL);//打印棋盘
  292. is = Win(disc); //判断胜负
  293. if (is != ' ')
  294. {
  295. break;
  296. }
  297. }
  298. if (is == '*')
  299. {
  300. printf("玩家胜利\n");
  301. }
  302. else if (is == '#')
  303. {
  304. printf("电脑胜利\n");
  305. }
  306. else if (is == 'Q')
  307. printf("平局\n");
  308. }
  309. }
  310. //*************************************************************
  311. int main()
  312. {
  313. int input = 0;
  314. srand((unsigned int)time(NULL));
  315. do
  316. {
  317. //system("cls");
  318. mvue();
  319. scanf("%d", &input);
  320. switch (input)
  321. {
  322. case 1:
  323. game(); //逐步实现游戏过程的函数
  324. break;
  325. case 0:
  326. printf("退出游戏\n");
  327. break;
  328. default:
  329. printf("选择错误\n");
  330. break;
  331. }
  332. } while (input);
  333. return 0;
  334. }

目前有两个最大的缺点

1.就是随机落子那一块,整个代码只是让电脑不会输的太挫,能够正常操作,如果解决电脑随机落子那一块那么电脑可以算是一个不错的对手了

2.电脑不会去判断自己是否有两个棋子达成条件,而是一味的去堵玩家,不过这一块的代码相对好实现,稍微调整一下复制粘贴判断玩家的棋子代码就可以了,这里我没时间去做修改了,有兴趣的朋友可以试一试

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

闽ICP备14008679号