关键词搜索

源码搜索 ×
×

简单的三子棋实现代码

发布2022-11-09浏览1018次

详情内容

  三子棋代码内容:   

                              1、利用二维数组,存储棋子             2、游戏开始页面

             3、打印棋局              4、玩家下棋              5、电脑下棋             6、判断输赢

游戏代码思路:                 

   

 

 好了,内容和思路都已经大概介绍完毕了;现在开始我们的C语言小游戏----三子棋

第一步 创建三个文件

                             1.game.h----游戏函数的声明

                             2.text.c------测试游戏

                             3.game.c------游戏函数的实现


 

第二步  敲代码

                                        第一步骤-----创建菜单

我们先想想,玩游戏时,是不是应该需要一个菜单,让我们选择  退出游戏 或者 开始游戏  而且我们不一定只玩一把游戏,所以需要一个循环,当我们游戏结束之后可以开始第二把。

所以我们先在text.c创建一个菜单函数 menu();

  1. #include<stdio.h>
  2. void menu()
  3. { printf("***********************");
  4. printf("********三子棋*********");
  5. printf("***********************");
  6. printf("开始游戏>1 退出游戏>0");
  7. }
  8. int main()
  9. {
  10. int input=0;
  11. while (1)
  12. {
  13. menu();
  14. printf("请选择:"):
  15. scanf("%d",&input);
  16. if(input==1)
  17. {
  18. //游戏开始
  19. }
  20. else if(input==0)
  21. {
  22. break; //退出游戏
  23. }
  24. else
  25. { printf("输入有误,重新输入"); }

                                         第二步骤-----创建棋盘

三子棋、三子棋,很明显我们需要打印一个键盘,这样才能开始游戏;三子棋有9个空格,所以我们可以利用二维数组 board[3][3] 打印棋盘,先让二维数组存放的是' '(空格);之后下棋的时候,会用棋子代替;

初始化棋盘,我们可以创建init_board() 函数,也就是给二维数组赋值:

  1. void init_board(char board[ROW][COL],int row,int col)
  2. {
  3. for(int c = 0;c < row;c++)
  4. {
  5. for(int d = 0;d < col;d++)
  6. {
  7. board[c][d] = ' '; //给二维数组赋' ';
  8. }
  9. }

用二维数组的值打印棋盘,我们可以创建print_board () 函数:

  1. void print_board(char board[ROW][COL],int row,int col)
  2. {
  3. for(int c = 0;c < row;c++)
  4. {
  5. int d;
  6. for(d = 0;d < col;d++)
  7. {
  8. printf(" %c ",board[c][d]);
  9. if(d < col-1)
  10. {
  11. printf("|");
  12. }
  13. }
  14. printf("\n");
  15. if(c < row-1)
  16. {
  17. for(int q=0;q< col;q++)
  18. {
  19. printf("---");
  20. if(q < col-1)
  21. {
  22. printf("|");
  23. }
  24. }
  25. printf("\n");
  26. }
  27. }
  28. }
  29. //注:以上部分则是打印棋局,|和---是棋局的布置;

                                                第三步骤-----人机下棋

玩家需要下棋,电脑也要下棋,并且在一方下完棋之后需要判断是否胜利,又或者是否棋盘满了平局。

玩家下棋,可以创建 player_board() :

  1. void player_board(char board[ROW][COL],int row,int col)
  2. {
  3. printf("玩家下棋,选择坐标:");
  4. while(1)
  5. {
  6. int rows; //行
  7. int cols; //列
  8. scanf("%d %d",&rows,&col);
  9. if( (rows < row) && (cols < col) &&
  10. board[rows][cols]==' ')
  11. {
  12. board[rows][cols] = '*';break; //当坐标是' ';用'*'代替
  13. }
  14. else printf("坐标有误,重新输入\n:");
  15. }
  16. }

电脑下棋,可以创建computer_board()

  1. void computer_board(char board[ROW][COL], int row, int col)
  2. {
  3. int a, b;
  4. printf("机器人下棋\n");
  5. while (1)
  6. {
  7. a = rand() % (ROW+1);//行
  8. b = rand() % (COL+1);//列
  9. if (a <= row && b <= col &&
  10. board[a][b] == ' ')
  11. {
  12. board[a][b] = 'T';//当坐标为' ' ;则用'T'代替
  13. break;
  14. }
  15. }
  16. }

 当棋手下棋之后需要判断,棋局是否满了,创建 full()  函数:

  1. char full(char board[ROW][COL]) {
  2. for (int i = 0; i < 3; i++)
  3. {
  4. for (int j = 0; j < 3; j++)
  5. {
  6. if (board[i][j] == ' ')return 'p';//棋盘未满,返回p值
  7. }
  8. }
  9. return 'x'; //棋局已满,返回x值
  10. }

 有判断是否棋盘满,也应该判断是否胜利,创建使用 win() 函数:

  1. char win(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0;
  4. //判断三行
  5. for (i = 0; i < row; i++)
  6. {
  7. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
  8. {
  9. return board[i][0];
  10. }
  11. }
  12. //判断三列
  13. for (i = 0; i < col; i++)
  14. {
  15. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
  16. {
  17. return board[0][i];
  18. }
  19. }
  20. //对角线
  21. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  22. {
  23. return board[1][1];
  24. }
  25. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  26. {
  27. return board[1][1];
  28. }
  29. return full(board);
  30. }

                                               第四步骤-----人机对局

现在可以进行对局了,但是因为是棋局,所以是你来我往的,需要使用循环,直到一方胜利。

现在定义一个game() 函数;

  1. void game()
  2. {
  3. char ret;
  4. char board[ROW][COL];
  5. init_board(board, ROW, COL);
  6. printfboard(board, ROW, COL);
  7. while (1) {
  8. player_board(board, ROW, COL);
  9. printfboard(board, ROW, COL);
  10. //判断输赢
  11. ret = win(board, ROW, COL);
  12. if (ret == '*') //返回值是*,则赢
  13. {
  14. printf("我赢了\n"); break;
  15. }
  16. else if (ret == 'x') //返回值是x,则是平局
  17. {
  18. printf("平局\n"); break;
  19. }
  20. computer_board(board, ROW, COL);
  21. printfboard(board, ROW, COL);
  22. //判断输赢
  23. ret = win(board, ROW, COL);
  24. if (ret == 'T') //返回值是T,电脑赢了;
  25. {
  26. printf("电脑赢了\n"); break;
  27. }
  28. else if (ret == 'x') //返回值是x,则是平局
  29. {
  30. printf("平局\n"); break;
  31. }
  32. }
  33. }

 

第三步 整合代码

                                                             第一小步

         先在game.h头文件里申明函数名,为了更方便,还可以放入#include<stdio.h>,代码里因为使用了随机数,所以需要放置头文件#include<stdlib.h>、#include<time.h>;

还需要申明ROW的值和COL的值。

  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<stdlib.h>
  4. #define ROW 3
  5. #define COL 3
  6. //初始化棋盘
  7. void init_board(char board[ROW][COL], int row, int col);
  8. //打印键盘
  9. void printfboard(char board[ROW][COL], int row, int col);
  10. //玩家下棋
  11. void player_board(char board[ROW][COL], int row, int col);
  12. //电脑玩家
  13. void computer_board(char board[ROW][COL], int row, int col);
  14. //获胜条件
  15. char win(char board[ROW][COL], int row, int col);

                                                           第二小步

      先在text.c源文件里添加头文件#include"game.h",然后就可以调用头文件#include"game.h",

由于头文件里申明了函数,所以可以通过头文件访问game.c源文件,从而使用函数。

  1. #include"game.h"
  2. void menu()
  3. { printf("*********************************\n");
  4. printf("****************三子棋***********\n");
  5. printf("*********************************\n");
  6. printf("进入游戏:1 退出游戏:0\n");
  7. }
  8. void game()
  9. {
  10. char ret;
  11. char board[ROW][COL];
  12. init_board(board, ROW, COL);
  13. printfboard(board, ROW, COL);
  14. while (1) {
  15. player_board(board, ROW, COL);
  16. printfboard(board, ROW, COL);
  17. //判断输赢
  18. ret = win(board, ROW, COL);
  19. if (ret == '*')
  20. {
  21. printf("我赢了\n"); break;
  22. }
  23. else if (ret == 'x')
  24. {
  25. printf("平局\n"); break;
  26. }
  27. computer_board(board, ROW, COL);
  28. printfboard(board, ROW, COL);
  29. //判断输赢
  30. ret = win(board, ROW, COL);
  31. if (ret == 'T')
  32. {
  33. printf("电脑赢了\n"); break;
  34. }
  35. else if (ret == 'x')
  36. {
  37. printf("平局\n"); break;
  38. }
  39. }
  40. }
  41. void text()
  42. {
  43. int a=0;
  44. srand((unsigned)time(NULL)); //随机值
  45. while (1)
  46. {
  47. menu();
  48. scanf("%d", &a);
  49. if (a == 1)
  50. {
  51. printf("游戏开始\n");
  52. game();
  53. }
  54. else if (a == 0) {
  55. printf("退出游戏\n"); break;
  56. }
  57. else {
  58. printf("错误,重新输入\n");
  59. }
  60. }
  61. }
  62. int main()
  63. {
  64. text();
  65. return 0;
  66. }

                                                            第三小步

              在game.c文件里先置放头文件#include"game.h",  因为头文件里申明了函数;所以可以创建  init_board() 、print_board ()、player_board() 、computer_board() 、full() 、win() 函数

  1. #include"game.h"
  2. void init_board(char board[ROW][COL], int row, int col)
  3. {
  4. for (int i = 0; i < row; i++)
  5. {
  6. for (int j=0; j < col; j++)
  7. {
  8. board[i][j] = ' ';
  9. }
  10. }
  11. }
  12. void printfboard(char board[ROW][COL], int row, int col)
  13. {
  14. int i = 0;
  15. for (i; i < row; i++)
  16. {
  17. int j = 0;
  18. for (j; j < col; j++)
  19. {
  20. printf(" %c ", board[i][j]);
  21. if (j < col - 1)
  22. {
  23. printf("|");
  24. }
  25. }
  26. printf("\n");
  27. if(i < row - 1)
  28. {
  29. for (j = 0; j < col; j++)
  30. {
  31. printf("---");
  32. if (j < col - 1)
  33. {
  34. printf("|");
  35. }
  36. }
  37. printf("\n");
  38. }
  39. }
  40. }
  41. void player_board(char board[ROW][COL], int row, int col)
  42. {
  43. int a, b;
  44. while (1)
  45. {
  46. printf("请输入你的坐标:");
  47. scanf("%d %d", &a, &b);
  48. if (a <= row && b <= col &&
  49. board[a-1][b-1] == ' ')
  50. {
  51. board[a-1][b-1] = '*';
  52. break;
  53. }
  54. else printf("坐标有误");
  55. }
  56. }
  57. void computer_board(char board[ROW][COL], int row, int col)
  58. {
  59. int a, b;
  60. printf("机器人下棋\n");
  61. while (1)
  62. {
  63. a = rand() % 4;
  64. b = rand() % 4;
  65. if (a <= row && b <= col &&
  66. board[a][b] == ' ')
  67. {
  68. board[a][b] = 'T';
  69. break;
  70. }
  71. }
  72. }
  73. char full(char board[ROW][COL]) {
  74. for (int i = 0; i < 3; i++)
  75. {
  76. for (int j = 0; j < 3; j++)
  77. {
  78. if (board[i][j] == ' ')return 'p';
  79. }
  80. }
  81. return 'x';
  82. }
  83. char win(char board[ROW][COL], int row, int col)
  84. {
  85. int i = 0;
  86. //判断三行
  87. for (i = 0; i < row; i++)
  88. {
  89. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
  90. {
  91. return board[i][0];
  92. }
  93. }
  94. //判断三列
  95. for (i = 0; i < col; i++)
  96. {
  97. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
  98. {
  99. return board[0][i];
  100. }
  101. }
  102. //对角线
  103. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  104. {
  105. return board[1][1];
  106. }
  107. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  108. {
  109. return board[1][1];
  110. }
  111. return full(board);
  112. }

 代码如上哦;

接下来,我们来编译程序吧;

很明显,代码运行成功了,这就是三子棋的简易代码,当然如果有兴趣,可以根据这个去写一些更多完善,美观的三子棋程序;可借用 easyx图形库  来。

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载