• C语言——三子棋游戏


    本篇文章主要为大家介绍C语言如何实现三子棋游戏,感兴趣的小伙伴们可以参考一下

    一、问题的描述

            三子棋是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

            三子棋也叫做OOXX棋,井字棋等,用“井”字分出3×3的格子,双方轮流下棋子(可以用O或者X来区别),只要将自己的三个棋子走成一条线,就算获胜。

     二、游戏设计的基本流程

    1、创建游戏菜单。
    2、创建和初始化棋盘。
    3、打印棋盘。
    4、玩家落子并刷新棋盘(通过坐标)用 'o'表示玩家落子。
    5、判断胜负。
    6、电脑落子并刷新棋盘(随机落子)用 ‘x'表示电脑落子。
    7、判断胜负。
    8、循环4-7步,直至游戏结束。

    三、程序的具体实现

    1. 菜单界面

    用户选择 1 开始游戏, 选择 0 退出游戏。

    1. void menu() { // 显示菜单
    2. printf("***********************\n");
    3. printf("****** 1. play ******\n");
    4. printf("****** 0. exit ******\n");
    5. printf("***********************\n");
    6. }
    7. void test() { // 用户交互
    8. int input = 0;
    9. menu();
    10. srand((unsigned int)time(NULL));
    11. do
    12. {
    13. printf("\n请输入你的选择: ");
    14. scanf("%d", &input);
    15. switch (input)
    16. {
    17. case 1:
    18. game();
    19. menu();
    20. break;
    21. case 0:
    22. break;
    23. default:
    24. system("cls");
    25. printf("输入错误,请重新输入!\n\n");
    26. Sleep(500);
    27. system("cls");
    28. menu();
    29. break;
    30. }
    31. }while (input);
    32. system("cls");
    33. printf("欢迎下次再玩!!!\n");
    34. Sleep(500);
    35. }

    2. 创建棋盘

    要进行游戏,我们首先要创建一个棋盘。
    棋盘:使用3行3列的二维数组来表示,元素类型是char。

    使用宏定义:
    1.推高代码可读性。
    2.提高扩展性,便于修改棋盘尺寸。

    1. #ifndef __GAME_H__
    2. #define __GAME_H__
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define ROW 3
    8. #define COL 3
    9. #endif
    char board[ROW][COL] = { 0 }; // 创建棋盘

    3. 初始化棋盘

    用空格来初始化棋盘,保证棋盘上面是空的。

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

    4. 打印棋盘

    用户在玩游戏的时候,要看到棋盘,及上面的棋子。

    1. void DisplayBoard(char board[ROW][COL], int row, int col) {
    2. system("cls");
    3. for (int i = 0; i < row; i++) {
    4. for (int j = 0; j < col; j++) {
    5. printf(" %c ", board[i][j]);
    6. if (j < col - 1)
    7. printf("|");
    8. else {
    9. printf("\n");
    10. }
    11. }
    12. if(i-1)
    13. for (int j = 0; j < col; j++) {
    14. printf("---");
    15. if (j < col - 1)
    16. printf("|");
    17. else {
    18. printf("\n");
    19. }
    20. }
    21. }
    22. }

    5. 玩家落子

    玩家输入坐标表示落子,使用 o 表示玩家落子。

    玩家落子时注意事项:

    1.玩家落子需要在棋盘范围内。
    2.玩家要在棋盘上空的地方落子。

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

    6. 电脑落子

    电脑随机子,'x'表示电脑落子。 因为电脑是随机落子,所以我们需要产生一个随机坐标。

    电脑落子注意事项:

    1.使用 随机数种子 srand((unsigned int)time(NULL))。
    2.要在棋盘上空的地方下棋。

    1. void ComputerMove(char board[ROW][COL], int row, int col) {
    2. Sleep(400);
    3. int x = 0;
    4. int y = 0;
    5. do
    6. {
    7. x = rand() % 3;
    8. y = rand() % 3;
    9. if ((x > -1 && x < row) && (y > -1 && y < col)) {
    10. if (board[x][y] == ' ') {
    11. board[x][y] = 'x';
    12. break;
    13. }
    14. }
    15. } while (1);
    16. }

     7. 判断胜负

    利用返回结果判断胜负:

            要返回4种不同的状态:
                    玩家获胜—> ‘o'
                    电脑获胜 —> ‘x'
                    平局 —> ‘'
                    继续 —> ‘C'

    1. char IsWin(char board[ROW][COL], int row, int col) {
    2. for (int i = 0; i < row; i++) {
    3. if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ') {
    4. return board[i][0];
    5. }
    6. if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ') {
    7. return board[0][i];
    8. }
    9. }
    10. if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
    11. return board[0][0];
    12. }
    13. if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[1][1] != ' ') {
    14. return board[1][1];
    15. }
    16. for (int i = 0; i < row; i++) {
    17. for (int j = 0; j < col; j++) {
    18. if (board[i][j] == ' ') {
    19. return 'C';
    20. }
    21. }
    22. }
    23. return 'P'; // 如果前面均未返回,说明棋盘已满,返回平局
    24. }

     四、完整代码

    1. game.h

    1. #ifndef __GAME_H__
    2. #define __GAME_H__
    3. #define _CRT_SECURE_NO_WARNINGS 1
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #define ROW 3
    10. #define COL 3
    11. void InitBoard(char board[ROW][COL], int row, int col);
    12. void DisplayBoard(char board[ROW][COL], int row, int col);
    13. void ComputerMove(char board[ROW][COL], int row, int col);
    14. char IsWin(char board[ROW][COL], int row, int col);
    15. void PlayerMove(char board[ROW][COL], int row, int col);
    16. #endif // !__GAME_H__

    2. main.c

    1. #include "game.h"
    2. void menu() {
    3. printf("***********************\n");
    4. printf("****** 1. play ******\n");
    5. printf("****** 0. exit ******\n");
    6. printf("***********************\n");
    7. }
    8. void test() {
    9. int input = 0;
    10. menu();
    11. srand((unsigned int)time(NULL));
    12. do
    13. {
    14. printf("\n请输入你的选择: ");
    15. scanf("%d", &input);
    16. switch (input)
    17. {
    18. case 1:
    19. game();
    20. menu();
    21. break;
    22. case 0:
    23. break;
    24. default:
    25. system("cls");
    26. printf("输入错误,请重新输入!\n\n");
    27. Sleep(500);
    28. system("cls");
    29. menu();
    30. break;
    31. }
    32. }while (input);
    33. system("cls");
    34. printf("欢迎下次再玩!!!\n");
    35. Sleep(500);
    36. }
    37. int main() {
    38. printf("欢迎进入三子棋游戏^_^\n");
    39. test();
    40. return 0;
    41. }

    3. game.c

    1. #include "game.h"
    2. void game() {
    3. char result = 'C'; // 存放走出的棋盘信息
    4. char board[ROW][COL] = { 0 }; // 创建棋盘
    5. // 初始化棋盘
    6. InitBoard(board,ROW, COL);
    7. // 打印棋盘
    8. DisplayBoard(board, ROW, COL);
    9. // 下棋
    10. while (1) {
    11. // 玩家下棋
    12. PlayerMove(board, ROW, COL);
    13. DisplayBoard(board, ROW, COL);
    14. // 判断玩家是否赢
    15. result = IsWin(board, ROW, COL);
    16. if (result != 'C') {
    17. break;
    18. }
    19. // 电脑下棋
    20. ComputerMove(board, ROW, COL);
    21. DisplayBoard(board, ROW, COL);
    22. // 判断电脑是否赢
    23. result = IsWin(board, ROW, COL);
    24. if (result != 'C') {
    25. break;
    26. }
    27. }
    28. if (result == 'P') {
    29. printf("\n平局\n");
    30. }
    31. else if (result == 'o') {
    32. printf("\n玩家获胜!\n");
    33. }
    34. else{
    35. printf("\n电脑获胜!\n");
    36. }
    37. Sleep(100);
    38. printf("\n点击任意键继续\n");
    39. getchar();
    40. getchar();
    41. system("cls");
    42. }
    43. void InitBoard(char board[ROW][COL], int row, int col) {
    44. for (int i = 0; i < row; i++) {
    45. for (int j = 0; j < col; j++) {
    46. board[i][j] = ' ';
    47. }
    48. }
    49. }
    50. void DisplayBoard(char board[ROW][COL], int row, int col) {
    51. system("cls");
    52. for (int i = 0; i < row; i++) {
    53. for (int j = 0; j < col; j++) {
    54. printf(" %c ", board[i][j]);
    55. if (j < col - 1)
    56. printf("|");
    57. else {
    58. printf("\n");
    59. }
    60. }
    61. if(i-1)
    62. for (int j = 0; j < col; j++) {
    63. printf("---");
    64. if (j < col - 1)
    65. printf("|");
    66. else {
    67. printf("\n");
    68. }
    69. }
    70. }
    71. }
    72. void PlayerMove(char board[ROW][COL], int row, int col) {
    73. int x = 0;
    74. int y = 0;
    75. do
    76. {
    77. printf("\n请输入要下棋的坐标: ->");
    78. scanf("%d", &x);
    79. scanf("%d", &y);
    80. if ((x > 0 && x <= row) && (y > 0 && y <= col)) {
    81. if (board[x-1][y-1] == ' ') {
    82. board[x-1][y-1] = 'o';
    83. break;
    84. }
    85. else {
    86. printf("\n输入错误,请重新输入\n");
    87. Sleep(300);
    88. }
    89. }
    90. else {
    91. printf("\n输入错误,请重新输入\n");
    92. Sleep(300);
    93. }
    94. } while (1);
    95. }
    96. void ComputerMove(char board[ROW][COL], int row, int col) {
    97. Sleep(400);
    98. int x = 0;
    99. int y = 0;
    100. do
    101. {
    102. x = rand() % 3;
    103. y = rand() % 3;
    104. if ((x > -1 && x < row) && (y > -1 && y < col)) {
    105. if (board[x][y] == ' ') {
    106. board[x][y] = 'x';
    107. break;
    108. }
    109. }
    110. } while (1);
    111. }
    112. char IsWin(char board[ROW][COL], int row, int col) {
    113. for (int i = 0; i < row; i++) {
    114. if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ') {
    115. return board[i][0];
    116. }
    117. if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ') {
    118. return board[0][i];
    119. }
    120. }
    121. if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
    122. return board[0][0];
    123. }
    124. if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[1][1] != ' ') {
    125. return board[1][1];
    126. }
    127. for (int i = 0; i < row; i++) {
    128. for (int j = 0; j < col; j++) {
    129. if (board[i][j] == ' ') {
    130. return 'C';
    131. }
    132. }
    133. }
    134. return 'P';
    135. }

  • 相关阅读:
    1.机器学习基本概念学习笔记
    Java框架详解3——Spring的存入对象和取出
    台式电脑怎么无损备份迁移系统到新硬盘(使用傲梅,免费的就可以)
    二分查找 【模板+中间值问题】
    ansible Lineinfile模块
    oauth2.0鉴权,登录访问 “/oauth/token”,请求头Authorization(basicToken)如何取值???
    windows编译ZLMediaKit流媒体服务webrtc
    SpringBoot集成Redis主从架构实现读写分离(哨兵模式)
    【C# Programming】继承、接口
    交互与前端10 Tabulator+Flask开发日志007
  • 原文地址:https://blog.csdn.net/qq_53436105/article/details/125884704