当前位置:   article > 正文

C语言:三子棋(玩家vs电脑阻拦 + 先手后手)

C语言:三子棋(玩家vs电脑阻拦 + 先手后手)

目录

 1.前言

2.准备文件

 3.游戏的菜单

 4.游戏过程 

4.1游戏的准备

4.2棋盘的设置

4.3双方的对弈 

1.玩家下棋

2.电脑下棋

4.4判断输赢 

4.5先手后手

5.完整代码展示 

game.h

game.c

text.c

6.运行测试

  7.结语


 1.前言

  三子棋是一种益智游戏,井字棋。游戏分为双方对战,双方依次在9宫格上摆放棋子,率先将自己的三个棋子走一条线就视为胜利,摆满未分出胜负就算平局。

                                e08f7cd6573b49b0a5af651bf36a32e1.jpeg

2.准备文件

该项目分为三个文件:

  1. 1.game.h//函数的声明、头文件存放
  2. 2.game.c//游戏的实现、函数的定义
  3. 3.text.c//游戏的逻辑

 3.游戏的菜单

游戏开始前,我们要在游戏给予玩家一些提示,以便便玩家知道游戏操作,菜单有以下要求:

1.开始游戏

2.退出游戏

3.错误输入情况下给予提示

考虑到游戏的多次游玩,所以我们使用do...while的形式给予玩家多次游玩体验,同时swicth的使用可以满足游戏选项。

下面是代码和运行展示:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. void manu()
  3. {
  4. printf("******************\n");
  5. printf("******1.play******\n");
  6. printf("******0.exit******\n");
  7. printf("******************\n");
  8. }
  9. void game()
  10. {
  11. printf("三子棋");
  12. }
  13. int main()
  14. {
  15. int input = 0;
  16. do
  17. {
  18. menu();
  19. printf("请选择>:");
  20. switch (input)
  21. {
  22. case 1:
  23. break;
  24. case 2:
  25. prinrtf("退出游戏\n");
  26. break;
  27. case 3:
  28. printf("选择错误,请重新选择\n");
  29. break;
  30. }
  31. } while ();
  32. return 0;
  33. }

 17565f1580c14055a8d7c091f577e55f.png

 4.游戏过程 

提示

1.代码主要侧重于游戏功能的实现,有些代码在接下来不会展示,但在最后会将三个文件的代码全部展示,有需求的直接下滑到到代码展示即可。

2.文件的头文件全部放入game.h是为了方便其他文件,这样不用在每个区域声明头文件,而自建头文件我们需要使用#include"game.h"

 3.#define _CRT_SECURE_NO_WARNINGS 1的使用是为了忽略vsscanf的警告。

4.1游戏的准备

先将棋盘的行和列进行定义,方便代码的编程与修改(game.h)。

  1. #pragma once
  2. #include<stdio.h>
  3. #define ROW 3
  4. #define COL 3

4.2棋盘的设置

有了行和列,还要进行初始化棋盘并适当美化,方便玩家观看和操作,我们可以把棋盘简化成这样。

                                                        ab62ae6a0dd34c83ba6322e17ad343a4.png

 要达成以上的效果,我们可以分为两部分,一部分打印3*3二维数组,另一部分负责打印棋盘。用game1()(先手)和game2()(后手)函数调用,介绍以game1()函数为主。

  1. void game1()
  2. {
  3. char ret = 0;
  4. char board[ROW][COL];
  5. Init_board(board ,ROW,COL);//初始化棋盘
  6. Display_board(board, ROW, COL);
  7. }

 初始化数组负责棋盘的空白部分,我们打印空白即可。

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

我们观察棋盘部分,发现棋盘要满足以下几点

1.为了棋盘的美观和观看,我们使用空格数据空格( %c )将棋盘撑大。

2.   ---     和       |       对应行和列都少一。

  1. void Display_board(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0;
  4. int j = 0;
  5. for (i = 0; i < ROW; i++)
  6. {
  7. for (j = 0; j < COL; j++)
  8. {
  9. printf(" %c ", board[i][j]);
  10. if (j < COL - 1)//最后一列没有
  11. printf("|");
  12. }
  13. printf("\n");//打印完|换行
  14. if (i < ROW - 1)//最后一行没有
  15. {
  16. int j = 0;
  17. for (j = 0; j < COL; j++)
  18. {
  19. printf("---");
  20. if (j < COL - 1)
  21. printf("|");
  22. }
  23. }
  24. printf("\n");//打印完---换行
  25. }
  26. }

4.3双方的对弈 

1.玩家下棋

1.给予玩家操作方下棋提醒,玩家棋子用      标识。

2.要求玩家输入棋盘坐标,并对错误坐标和已经占用的坐标进行提醒。

3.注意棋盘和数组的关联,我们以玩家的视角认为棋盘数组的[0][0]为第一行第一列,所以要对数组进行减一处理

  1. void playmove(char board[ROW][COL], int row, int col)
  2. {
  3. int x = 0;
  4. int y = 0;
  5. printf("\n玩家下棋\n");
  6. while (1)
  7. {
  8. printf("请输入下棋的坐标>:");
  9. scanf("%d %d", &x, &y);
  10. getchar();
  11. if (0 <= x && x <= ROW && 0 <= y && y<=COL)
  12. {
  13. if (board[x - 1][y - 1] == ' ')
  14. {
  15. board[x - 1][y - 1] = '*';
  16. break;
  17. }
  18. else
  19. printf("该坐标被占用,请输入其他坐标\n");
  20. }
  21. else
  22. printf("坐标错误,请重新输入\n");
  23. }
  24. }

2.电脑下棋

1.电脑下棋要求阻拦玩家,这里只是简易版的下棋,所以我们在棋盘上取随机值即可。

2.随机值要用到rand,srand,time函数,其中rand()%3需要取余保证在棋盘(数组内)。他们的使用需要#include<time.h>   #include<stdlib.h> 两个头文件(放在game.h)。

3.电脑下棋用  #  表示。

  1. void Computer_move(char board[ROW][COL], int row, int col)
  2. {
  3. printf("\n电脑下棋\n");
  4. int x = 0;
  5. int y = 0;
  6. while (1)
  7. {
  8. x = rand() % ROW;//取余保证在区域内
  9. y = rand() % COL;
  10. if (board[x][y] == ' ')
  11. {
  12. board[x][y] = '#';
  13. break;
  14. }
  15. }
  16. }

这只是简易版,如果想要智能阻拦玩家和赢过玩家,我们还需要对代码进行更改。

1.判断主对角线和直线上的棋子是否已经有两个相同棋子,进行阻拦或者赢下比赛。

2.当电脑操控时,棋盘出现玩家和电脑都在棋盘上都有两颗棋子,电脑优先将自己棋子连成一条线

  1. static int computer_plan(char board[ROW][COL], int row, int col, char ch)//ch为'#'是进行下棋,ch为'*'时进行阻拦
  2. {
  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. //判断第一个和第二个的元素电脑是否已下棋,对第三个元素进行下棋/阻拦
  11. if (board[i][0] == board[i][1] && board[i][0] == ch && board[i][2] == ' ')
  12. {
  13. board[i][2] = '#';
  14. return 1;
  15. }
  16. //判断第一个和第三个的元素电脑是否已下棋,对第二个元素进行下棋/阻拦
  17. if (board[i][0] == board[i][2] && board[i][0] == ch && board[i][1] == ' ')
  18. {
  19. board[i][1] = '#';
  20. return 1;
  21. }
  22. //判断第二个和第三个的元素电脑是否已下棋,对第一个元素进行下棋/阻拦
  23. if (board[i][1] == board[i][2] && board[i][1] == ch && board[i][0] == ' ')
  24. {
  25. board[i][0] = '#';
  26. return 1;
  27. }
  28. }
  29. }
  30. //列
  31. for (i = 0; i < row; i++)
  32. {
  33. int j = 0;
  34. for (j = 0; j < col; j++)
  35. {
  36. //第一和第二个已下,下/阻拦第三个
  37. if (board[0][j] == board[1][j] && board[0][j] == ch && board[2][j] == ' ')
  38. {
  39. board[2][j] = '#';
  40. return 1;
  41. }
  42. //第一和第三个已下,下/阻拦第二个
  43. if (board[0][j] == board[2][j] && board[0][j] == ch && board[1][j] == ' ')
  44. {
  45. board[1][j] = '#';
  46. return 1;
  47. }
  48. //第二和第三个已下,下/阻拦第一个
  49. if (board[1][j] == board[2][j] && board[1][j] == ch && board[0][j] == ' ')
  50. {
  51. board[0][j] = '#';
  52. return 1;
  53. }
  54. }
  55. }
  56. //主对角线
  57. if (board[0][0] == board[1][1] && board[1][1] == ch && board[2][2] == ' ')//落子/阻拦主对角线第三个元素
  58. {
  59. board[2][2] = '#';
  60. return 1;
  61. }
  62. if (board[0][0] == board[2][2] && board[0][0] == ch && board[1][1] == ' ')//落子/阻拦主对角线第二个元素
  63. {
  64. board[1][1] = '#';
  65. return 1;
  66. }
  67. if (board[1][1] == board[2][2] && board[1][1] == ch && board[0][0] == ' ')//落子/阻拦主对角线第一个元素
  68. {
  69. board[0][0] = '#';
  70. return 1;
  71. }
  72. //副对角线
  73. if (board[0][2] == board[1][1] && board[0][2] == ch && board[2][0] == ' ')//落子/阻拦副对角线第三个元素
  74. {
  75. board[2][0] = '#';
  76. return 1;
  77. }
  78. if (board[0][2] == board[2][0] && board[0][2] == ch && board[1][1] == ' ')//落子/阻拦副对角线第二个元素
  79. {
  80. board[1][1] = '#';
  81. return 1;
  82. }
  83. if (board[1][1] == board[2][0] && board[1][1] == ch && board[0][2] == ' ')//落子/阻拦副对角线第一个元素
  84. {
  85. board[0][2] = '#';
  86. return 1;
  87. }
  88. return 0;//若无法赢棋或无法阻拦,返回0
  89. }
  90. void Computer_move(char board[ROW][COL], int row, int col)
  91. {
  92. printf("\n电脑下棋\n");
  93. int sign1 = 0;
  94. int sign2 = 0;
  95. sign1 = computer_plan(board, ROW, COL, '#');//电脑赢棋
  96. if (sign1 == 0)
  97. {
  98. sign1 = computer_plan(board, ROW, COL, '*');//对玩家进行阻拦
  99. if (sign2 == 0)
  100. {
  101. int x = 0;
  102. int y = 0;
  103. while (1)
  104. {
  105. x = rand() % ROW;//取余保证在区域内
  106. y = rand() % COL;
  107. if (board[x][y] == ' ')
  108. {
  109. board[x][y] = '#';
  110. break;
  111. }
  112. }
  113. }
  114. }
  115. }

4.4判断输赢 

//玩家赢--"*"
//电脑赢--"#"
//平局  --"Q"
//继续  --"C"

1.赢下游戏,分为四种情况,行、列、主对角线、副对角线所占元素均相同且不为空。
2.遍历棋盘中所有棋格,如果发现已经全部满有棋子,平局。
3.如果输赢和平局并不满足,则游戏继续。

  1. //玩家赢--"*"
  2. //电脑赢--"#"
  3. //平局 --"Q"
  4. //继续 --"C"
  5. char is_win(char board[ROW][COL], int row, int col)
  6. {
  7. int i = 0;
  8. for (i = 0; i < ROW; i++)
  9. {
  10. if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][1]!=' ')
  11. {
  12. return board[i][0];
  13. }
  14. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board [1][i]!= ' ')
  15. {
  16. return board[0][i];
  17. }
  18. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  19. {
  20. return board[1][1];
  21. }
  22. if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
  23. {
  24. return board[1][1];
  25. }
  26. }
  27. if (is_full(board, row, col))
  28. {
  29. return 'Q';
  30. }
  31. //判断平局
  32. return 'C';
  33. }

4.5先手后手

玩家先手时我们需要打印一个棋盘,方便玩家观察落子。

                                                          ab62ae6a0dd34c83ba6322e17ad343a4.png

  1. void game1()//先手
  2. {
  3. char ret = 0;
  4. char board[ROW][COL];
  5. Init_board(board ,ROW,COL);//初始化棋盘
  6. Display_board(board, ROW, COL);//打印棋盘
  7. //下棋
  8. while(1)
  9. {
  10. playmove(board, ROW, COL);
  11. Display_board(board, ROW, COL);
  12. ret = is_win(board, ROW, COL);//判断输赢
  13. if (ret != 'C')
  14. {
  15. break;
  16. }
  17. Computer_move(board, ROW, COL);
  18. Display_board(board, ROW, COL);
  19. ret = is_win(board, ROW, COL);
  20. //判断输赢
  21. if (ret != 'C')
  22. {
  23. break;
  24. }
  25. }
  26. if (ret == '*')
  27. {
  28. printf("玩家赢\n");
  29. }
  30. else if (ret == '#')
  31. {
  32. printf("电脑赢\n");
  33. }
  34. else
  35. printf("平局\n");
  36. }

后手时由于电脑先下所以不必打印初始化棋盘,稍加改变即可。

                                                        aac1ad423efe4f5b9608687660cf30a3.png

  1. void game2()//后手
  2. {
  3. char ret = 0;
  4. char board[ROW][COL];//初始化棋盘;
  5. Init_board(board, ROW, COL);
  6. while (1)
  7. {
  8. Computer_move(board, ROW, COL);
  9. Display_board(board, ROW, COL);
  10. ret = is_win(board, ROW, COL);
  11. if (ret != 'C')
  12. {
  13. break;
  14. }
  15. playmove(board, ROW, COL);
  16. Display_board(board, ROW, COL);
  17. ret = is_win(board, ROW, COL);//判断输赢
  18. if (ret != 'C')
  19. {
  20. break;
  21. }
  22. }
  23. if (ret == '*')
  24. {
  25. printf("玩家赢\n");
  26. }
  27. else if (ret == '#')
  28. {
  29. printf("电脑赢\n");
  30. }
  31. else
  32. printf("平局\n");
  33. }

5.完整代码展示 

game.h

  1. #pragma once
  2. #include<stdio.h>
  3. #include<time.h>
  4. #include<stdlib.h>
  5. #define ROW 3
  6. #define COL 3
  7. //初始棋盘
  8. void Init_board(char board[ROW][COL], int row, int col);
  9. //打印棋盘
  10. void Display_board(char board[ROW][COL], int row, int col);
  11. //玩家下棋
  12. void playmove(char board[ROW][COL], int row, int col);
  13. //电脑下棋
  14. void Computer_move(char board[ROW][COL], int row, int col);
  15. //判断输赢结果
  16. char is_win(char board[ROW][COL], int row, int col);

game.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"game.h"
  3. void Init_board(char board[ROW][COL], int row, int col)
  4. {
  5. int i = 0;
  6. int j = 0;
  7. for (i = 0; i < ROW; i++)
  8. {
  9. for (j = 0; j < COL; j++)
  10. {
  11. board[i][j] = ' ';
  12. }
  13. }
  14. }
  15. void Display_board(char board[ROW][COL], int row, int col)
  16. {
  17. int i = 0;
  18. int j = 0;
  19. for (i = 0; i < ROW; i++)
  20. {
  21. for (j = 0; j < COL; j++)
  22. {
  23. printf(" %c ", board[i][j]);
  24. if (j < COL - 1)//最后一列没有
  25. printf("|");
  26. }
  27. printf("\n");//打印完|换行
  28. if (i < ROW - 1)//最后一行没有
  29. {
  30. int j = 0;
  31. for (j = 0; j < COL; j++)
  32. {
  33. printf("---");
  34. if (j < COL - 1)
  35. printf("|");
  36. }
  37. }
  38. printf("\n");//打印完---换行
  39. }
  40. }
  41. void playmove(char board[ROW][COL], int row, int col)
  42. {
  43. int x = 0;
  44. int y = 0;
  45. printf("\n玩家下棋\n");
  46. while (1)
  47. {
  48. printf("请输入下棋的坐标>:");
  49. scanf("%d %d", &x, &y);
  50. getchar();
  51. if (0 <= x && x <= ROW && 0 <= y && y<=COL)
  52. {
  53. if (board[x - 1][y - 1] == ' ')
  54. {
  55. board[x - 1][y - 1] = '*';
  56. break;
  57. }
  58. else
  59. printf("该坐标被占用,请输入其他坐标\n");
  60. }
  61. else
  62. printf("坐标错误,请重新输入\n");
  63. }
  64. }
  65. static int computer_plan(char board[ROW][COL], int row, int col, char ch)//ch为'#'进行下棋,ch为'*'进行阻拦
  66. {
  67. //检查电脑能否获得胜利/阻拦玩家
  68. int i = 0;
  69. for (i = 0; i < row; i++)
  70. {
  71. int j = 0;
  72. for (j = 0; j < col; j++)
  73. {
  74. //判断第一个和第二个的元素电脑是否已下棋,对第三个元素进行下棋/阻拦
  75. if (board[i][0] == board[i][1] && board[i][0] == ch && board[i][2] == ' ')
  76. {
  77. board[i][2] = '#';
  78. return 1;
  79. }
  80. //判断第一个和第三个的元素电脑是否已下棋,对第二个元素进行下棋/阻拦
  81. if (board[i][0] == board[i][2] && board[i][0] == ch && board[i][1] == ' ')
  82. {
  83. board[i][1] = '#';
  84. return 1;
  85. }
  86. //判断第二个和第三个的元素电脑是否已下棋,对第一个元素进行下棋/阻拦
  87. if (board[i][1] == board[i][2] && board[i][1] == ch && board[i][0] == ' ')
  88. {
  89. board[i][0] = '#';
  90. return 1;
  91. }
  92. }
  93. }
  94. //列
  95. for (i = 0; i < row; i++)
  96. {
  97. int j = 0;
  98. for (j = 0; j < col; j++)
  99. {
  100. //第一和第二个已下,下/阻拦第三个
  101. if (board[0][j] == board[1][j] && board[0][j] == ch && board[2][j] == ' ')
  102. {
  103. board[2][j] = '#';
  104. return 1;
  105. }
  106. //第一和第三个已下,下/阻拦第二个
  107. if (board[0][j] == board[2][j] && board[0][j] == ch && board[1][j] == ' ')
  108. {
  109. board[1][j] = '#';
  110. return 1;
  111. }
  112. //第二和第三个已下,下/阻拦第一个
  113. if (board[1][j] == board[2][j] && board[1][j] == ch && board[0][j] == ' ')
  114. {
  115. board[0][j] = '#';
  116. return 1;
  117. }
  118. }
  119. }
  120. //主对角线
  121. if (board[0][0] == board[1][1] && board[1][1] == ch && board[2][2] == ' ')//落子/阻拦主对角线第三个元素
  122. {
  123. board[2][2] = '#';
  124. return 1;
  125. }
  126. if (board[0][0] == board[2][2] && board[0][0] == ch && board[1][1] == ' ')//落子/阻拦主对角线第二个元素
  127. {
  128. board[1][1] = '#';
  129. return 1;
  130. }
  131. if (board[1][1] == board[2][2] && board[1][1] == ch && board[0][0] == ' ')//落子/阻拦主对角线第一个元素
  132. {
  133. board[0][0] = '#';
  134. return 1;
  135. }
  136. //副对角线
  137. if (board[0][2] == board[1][1] && board[0][2] == ch && board[2][0] == ' ')//落子/阻拦副对角线第三个元素
  138. {
  139. board[2][0] = '#';
  140. return 1;
  141. }
  142. if (board[0][2] == board[2][0] && board[0][2] == ch && board[1][1] == ' ')//落子/阻拦副对角线第二个元素
  143. {
  144. board[1][1] = '#';
  145. return 1;
  146. }
  147. if (board[1][1] == board[2][0] && board[1][1] == ch && board[0][2] == ' ')//落子/阻拦副对角线第一个元素
  148. {
  149. board[0][2] = '#';
  150. return 1;
  151. }
  152. return 0;//若无法赢棋或无法阻拦,返回0
  153. }
  154. void Computer_move(char board[ROW][COL], int row, int col)
  155. {
  156. printf("\n电脑下棋\n");
  157. int sign1 = 0;
  158. int sign2 = 0;
  159. sign1 = computer_plan(board, ROW, COL, '#');//电脑赢棋
  160. if (sign1 == 0)
  161. {
  162. sign1 = computer_plan(board, ROW, COL, '*');//对玩家进行阻拦
  163. if (sign2 == 0)
  164. {
  165. int x = 0;
  166. int y = 0;
  167. while (1)
  168. {
  169. x = rand() % ROW;//取余保证在区域内
  170. y = rand() % COL;
  171. if (board[x][y] == ' ')
  172. {
  173. board[x][y] = '#';
  174. break;
  175. }
  176. }
  177. }
  178. }
  179. }
  180. static int is_full(char board[ROW][COL], int row, int col)
  181. {
  182. int i = 0;
  183. int j = 0;
  184. for (i = 0; i < ROW; i++)
  185. {
  186. for (j = 0; j < COL; j++)
  187. {
  188. if (board[i][j] == ' ')
  189. return 0;
  190. }
  191. }
  192. return 1;
  193. }
  194. //玩家赢--"*"
  195. //电脑赢--"#"
  196. //平局 --"Q"
  197. //继续 --"C"
  198. char is_win(char board[ROW][COL], int row, int col)
  199. {
  200. int i = 0;
  201. for (i = 0; i < ROW; i++)
  202. {
  203. if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][1]!=' ')
  204. {
  205. return board[i][0];
  206. }
  207. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board [1][i]!= ' ')
  208. {
  209. return board[0][i];
  210. }
  211. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  212. {
  213. return board[1][1];
  214. }
  215. if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
  216. {
  217. return board[1][1];
  218. }
  219. }
  220. if (is_full(board, row, col))
  221. {
  222. return 'Q';
  223. }
  224. //判断平局
  225. return 'C';
  226. }

text.c

  1. #define _CRT_SECURE_NO_WARNINGS 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 game1()//先手
  11. {
  12. char ret = 0;
  13. char board[ROW][COL];
  14. Init_board(board ,ROW,COL);//初始化棋盘
  15. Display_board(board, ROW, COL);//打印棋盘
  16. //下棋
  17. while(1)
  18. {
  19. playmove(board, ROW, COL);
  20. Display_board(board, ROW, COL);
  21. ret = is_win(board, ROW, COL);//判断输赢
  22. if (ret != 'C')
  23. {
  24. break;
  25. }
  26. Computer_move(board, ROW, COL);
  27. Display_board(board, ROW, COL);
  28. ret = is_win(board, ROW, COL);
  29. //判断输赢
  30. if (ret != 'C')
  31. {
  32. break;
  33. }
  34. }
  35. if (ret == '*')
  36. {
  37. printf("玩家赢\n");
  38. }
  39. else if (ret == '#')
  40. {
  41. printf("电脑赢\n");
  42. }
  43. else
  44. printf("平局\n");
  45. }
  46. void game2()//后手
  47. {
  48. char ret = 0;
  49. char board[ROW][COL];//初始化棋盘;
  50. Init_board(board, ROW, COL);
  51. while (1)
  52. {
  53. Computer_move(board, ROW, COL);
  54. Display_board(board, ROW, COL);
  55. ret = is_win(board, ROW, COL);
  56. if (ret != 'C')
  57. {
  58. break;
  59. }
  60. playmove(board, ROW, COL);
  61. Display_board(board, ROW, COL);
  62. ret = is_win(board, ROW, COL);//判断输赢
  63. if (ret != 'C')
  64. {
  65. break;
  66. }
  67. }
  68. if (ret == '*')
  69. {
  70. printf("玩家赢\n");
  71. }
  72. else if (ret == '#')
  73. {
  74. printf("电脑赢\n");
  75. }
  76. else
  77. printf("平局\n");
  78. }
  79. int main()
  80. {
  81. int a = 0;
  82. int input = 0;
  83. srand((unsigned int)time(NULL));
  84. do
  85. {
  86. menu();
  87. printf("请选择>:");
  88. scanf("%d", &input);
  89. switch (input)
  90. {
  91. case 1:
  92. printf("\n请选择先后手>:1.先手 2.后手\n");
  93. scanf("%d", &a);
  94. if (a == 1)
  95. {
  96. game1();
  97. }
  98. if (a == 2)
  99. {
  100. game2();
  101. }
  102. else
  103. printf("请重新输入\n");
  104. break;
  105. case 2:
  106. printf("\n退出游戏\n");
  107. break;
  108. case 3:
  109. printf("\n选择错误,请重新选择\n");
  110. break;
  111. }
  112. } while (input);
  113. return 0;
  114. }

6.运行测试

                                         0976236d4dbf42468200636adfae4a8d.gif

  7.结语

 到这里,一个简易的三子棋就这样做成功了。我们的电脑也不是人工智障了,不思考一下还真的赢不了电脑。

好了这次的c语言三子棋就到这里了,如果觉得我写的不错,还请一键三连。

如果嫌复制粘贴麻烦可以点此链接,从我的gitee仓库直接下载。

我是₯㎕星空&繁华,一名c语言的初学者,我们下期见!

    5db0f4c557ed43dba104b153027f9444.jpeg

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

闽ICP备14008679号