当前位置:   article > 正文

C语言之三子棋的实现【超详细讲解】_三子棋实现c语言

三子棋实现c语言

目录

一、实现三子棋的简要思路

二、代码的具体实现步骤

 三、完整代码

1、sanziqi.h部分

2、sanziqi.c部分

 3、test.c部分



一、实现三子棋的简要思路

1、首先三子棋要进行游戏或退出需要一个简易选择的菜单

2、菜单创建好以后,实现switch ,case语句,进行游戏或退出的选择

3、在switch语句中若选择游戏,则进行游戏部分的代码

4、在游戏部分先初始化3行3列的二维数组,分别把数组中的每个元素都初始化为空格,这样方便后续玩家和电脑下棋时可以将空格替换

5、打印棋盘,每次玩家或电脑下棋结束后都打印一次棋盘,方便观察下棋后双方棋子的位置

6、分别实现玩家和电脑下棋的具体步骤

玩家下棋:玩家输入一个坐标,例如1 1,但是数组中1 1元素的坐标为0 0,所以需要将玩家所输入的坐标减一,即为玩家实际在数组中所下的位置

电脑下棋:电脑下棋需要用到rand(头文件:stdlib.h)和time(头文件:time.h),结合起来就可以使电脑随机下棋

7、实现完玩家和电脑下棋的代码后,在玩家和电脑下棋后还需实现判断是否游戏结束的代码,判断有四种情况,分别是玩家赢,电脑赢,平局,继续下棋

8、在游戏结束后,继续打印选择的菜单,由玩家决定是否继续进行游戏


 在开始编写之前,请注意一点,我们平时实现一些小程序的时候,都是进行分模块编写的,例如三子棋的实现会用到sanziqi.h,sanziqi.c,test.c这三部分来分别实现具体的要求,并不是所有代码都是写在test.c这个板块的,请大家注意,在以后工作或是编写代码时,都会用到这种方法


二、代码的具体实现步骤

1、创建如下所示的三个部分

2、在sanziqi.h中引用头文件,test.c和sanziqi.c中只需引用sanziqi.h即可



 

3、在test.c中创建main函数及test函数的switch case语句

4、创建简易选择菜单

5、由于是3行3列,所以可以使用宏定义,方便后续更改

 

6、test.c中game函数的实现 (先完成框架,再具体实现

7、在sanziqi.c中具体实现game函数中的要求(在sanziqi.h中声明,在sanziqi.c中实现),下面第一个图片即为声明,第二个图片为函数的实现

(1)、初始化函数的实现 


 (2)、打印棋盘


 (3)、玩家下棋


(4)、电脑下棋

 在test函数中添加:



(5)、判断输赢函数




 三、完整代码

1、sanziqi.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 Initboard(char board[ROW][COL], int row, int col);
  9. //打印棋盘
  10. void Displayboard(char board[ROW][COL], int row, int col);
  11. //玩家下棋
  12. void Playermove(char board[ROW][COL], int row, int col);
  13. //电脑下棋
  14. void Computermove(char board[ROW][COL], int row, int col);
  15. //判断输赢
  16. char Iswin(char board[ROW][COL], int row, int col);

2、sanziqi.c部分

  1. #include "sanziqi.h"
  2. //初始化函数,数组元素都初始化为空格
  3. void Initboard(char board[ROW][COL], int row, int col)
  4. {
  5. int i = 0;
  6. for (i = 0; i < row; i++)
  7. {
  8. int j = 0;
  9. for (j = 0; j < col; j++)
  10. {
  11. board[i][j] = ' ';
  12. }
  13. }
  14. }
  15. //打印棋盘
  16. void Displayboard(char board[ROW][COL], int row, int col)
  17. {
  18. int i = 0;
  19. for (i = 0; i < row; i++)
  20. {
  21. int j = 0;
  22. //打印数字行
  23. for (j = 0; j < col; j++)
  24. {
  25. printf(" %c ", board[i][j]);
  26. if (j < col - 1)
  27. {
  28. printf("|");//在一行最后一个不打印|,更美观
  29. }
  30. }
  31. printf("\n");
  32. //打印分隔行
  33. if (i < row - 1)//在最后一行不打印分隔行
  34. {
  35. for (j = 0; j < col; j++)
  36. {
  37. printf("---");
  38. if (j < col - 1)
  39. {
  40. printf("|");//在一行最后一个不打印|,更美观
  41. }
  42. }
  43. printf("\n");
  44. }
  45. }
  46. }
  47. //玩家下棋
  48. void Playermove(char board[ROW][COL], int row, int col)
  49. {
  50. int x = 0;
  51. int y = 0;
  52. while (1)
  53. {
  54. printf("请输入想要下棋的坐标:");
  55. scanf("%d %d", &x, &y);
  56. printf("玩家下棋:\n");
  57. if (x >= 1 && x <= 3 && y >= 1 && y <= 3 && board[x - 1][y - 1] == ' ')
  58. {
  59. board[x - 1][y - 1] = '*';
  60. break;
  61. }
  62. else
  63. {
  64. printf("输入坐标错误,请重新输入!\n");
  65. }
  66. }
  67. }
  68. //电脑下棋
  69. void Computermove(char board[ROW][COL], int row, int col)
  70. {
  71. int x = 0;
  72. int y = 0;
  73. while (1)
  74. {
  75. x = rand() % row;//rand()函数会随机生成0~32767之间的数字
  76. y = rand() % col;//rand()%row和col即随机生成0~2,满足二维数组坐标要求
  77. if (board[x][y] == ' ')
  78. {
  79. printf("电脑下棋:\n");
  80. board[x][y] = '#';
  81. break;
  82. }
  83. }
  84. }
  85. //判断是否平局
  86. //下满棋盘返回1,未下满则返回0
  87. int Isfull(char board[ROW][COL], int row, int col)
  88. {
  89. int i = 0;
  90. for (i = 0; i < row; i++)
  91. {
  92. int j = 0;
  93. for (j = 0; j < col; j++)
  94. {
  95. if (board[i][j] == ' ')
  96. {
  97. return 0;
  98. }
  99. }
  100. }
  101. return 1;
  102. }
  103. //判断输赢
  104. char Iswin(char board[ROW][COL], int row, int col)
  105. {
  106. int i = 0;
  107. //判断三行中每一行是否相同
  108. for (i = 0; i < row; i++)
  109. {
  110. if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
  111. {
  112. return board[i][0];
  113. }
  114. }
  115. //判断三列中每一列是否相同
  116. for (i = 0; i < col; i++)
  117. {
  118. if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
  119. {
  120. return board[0][i];
  121. }
  122. }
  123. //判断第一条对角线是否相同
  124. if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
  125. {
  126. return board[0][0];
  127. }
  128. //判断第二条对角线是否相同
  129. if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
  130. {
  131. return board[0][2];
  132. }
  133. //判断是否平局
  134. if (Isfull(board, ROW, COL) == 1)//由于Isfull函数,不是功能型函数
  135. //只需要在sanziqi.c中实现即可
  136. {
  137. return 'P';
  138. }
  139. //若都不满足上方条件语句,则表示继续游戏
  140. return 'A';
  141. }

 3、test.c部分

  1. #include "sanziqi.h"
  2. void game()
  3. {
  4. char ret = 0;
  5. char board[ROW][COL] = { 0 };
  6. Initboard(board, ROW, COL);//初始化函数
  7. Displayboard(board, ROW, COL);//打印棋盘
  8. while (1)
  9. {
  10. Playermove(board, ROW, COL);//玩家下棋
  11. Displayboard(board, ROW, COL);//打印棋盘
  12. ret = Iswin(board, ROW, COL);//判断输赢,并用ret接受
  13. if (ret != 'A')
  14. {
  15. break;//这里的ret为判断输赢函数的返回值,A是自己设定的
  16. //在判断输赢函数中,返回A则继续下棋,返回P则平局
  17. //返回 # 则电脑赢,返回 * 则玩家赢
  18. //不返回A说明游戏结束,则在下方判断具体结果
  19. }
  20. Computermove(board, ROW, COL);//电脑下棋
  21. Displayboard(board, ROW, COL);//打印棋盘
  22. ret = Iswin(board, ROW, COL);//判断输赢,并用ret接受
  23. if (ret != 'A')
  24. {
  25. break;
  26. }
  27. }
  28. if (ret == 'P')
  29. {
  30. printf("平局!\n");
  31. }
  32. if (ret == '*')
  33. {
  34. printf("玩家赢!\n");
  35. }
  36. if (ret == '#')
  37. {
  38. printf("电脑赢!\n");
  39. }
  40. }
  41. void menu()
  42. {
  43. printf("******************************\n");
  44. printf("******** 1. play *********\n");
  45. printf("******** 0. exit *********\n");
  46. printf("******************************\n");
  47. }
  48. void test()
  49. {
  50. int input = 0;
  51. do
  52. {
  53. menu();//菜单
  54. srand((unsigned int)time(NULL));
  55. printf("请选择:");
  56. scanf("%d", &input);
  57. switch (input)
  58. {
  59. case 1:
  60. game();
  61. break;
  62. case 0:
  63. printf("退出三子棋程序!\n");
  64. break;
  65. default:
  66. printf("输入错误,请重新输入!\n");
  67. break;
  68. }
  69. } while (input);
  70. }
  71. int main()
  72. {
  73. test();
  74. return 0;
  75. }


C语言实现三子棋到此便告一段落啦,下篇博客再见♪(^∇^*)

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

闽ICP备14008679号