• 【初始C语言】/*使用C语言简单实现三子棋小游戏*/


    🌳🌳作者简介:一名平凡的计算机小白,但持续喜欢探索新的知识领域!🛸🛸

    🎋🎋本文内容:hello,大家好!今天给大家带来的就是使用C语言实现咋们小时候经常玩过的"三子棋"小游戏!

    🌹🌹希望寄语:当你做一件事情感到越难受,你越是要去攻克它,因为成功的道路永远是崎岖的,你渴望山顶的风景,就要忍受爬山的艰辛!努力才是硬道理!

    a8a14727a7ba49d389a360930e0d9c73.jpeg

     🚀🚀一:游戏描述

    如下图:两人对局,当其中一人下的棋子形成一条横线、竖线或者是交叉线,即获得游戏胜利!

    c47c15a37bcf4f36a40adec28bbf8a11.png

     🛰️🛰️二、游戏设计

    首先我们需要设计一个二维数组来存放我们的这些棋子,可以看到上图中我们使用---和 | 来设计成我们的棋子落地位置,也就是给二维数组初始化一下:

    🍊代码实现:

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

    🎍那么,棋盘设计好了, 接下来我们下棋之后,我们需要将棋盘打印出来:

    🍊代码实现:

    1. void DisplayBoard(char board[ROW][COL], int row, int col)
    2. {
    3. int i = 0;
    4. for (i = 0; i < row; i++)
    5. {
    6. //打印数据
    7. int j = 0;
    8. for (j = 0; j < col; j++)
    9. {
    10. printf(" %c ", board[i][j]);
    11. if (j < col - 1)
    12. printf("|");
    13. }
    14. printf("\n");
    15. //打印分割的行
    16. if (i < row - 1)
    17. {
    18. for (j = 0; j < col; j++)
    19. {
    20. printf("---");
    21. if (j < col - 1)
    22. printf("|");
    23. }
    24. printf("\n");
    25. }
    26. }
    27. }

     🌲好了,那么这个时候轮到我们的玩家下棋了,同理,我们设计一个函数来实现玩家下棋:

    🍎代码实现:

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

     🍱那么有了玩家下棋,我们的电脑也要下棋了,同样,我们写一个函数来让电脑实现下棋的功能:

    🍎代码实现:

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

    🍊那么,有了这四个步骤之后,我们的三子棋小游戏的大纲就基本出来了,那么,是不是还缺点什么呢?没错,是个游戏总得判断输赢对叭,所以这里我们还需要一个函数实现判断是玩家赢了还是电脑赢了:

    🍅代码实现:

    1. char is_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][1] != ' ')
    8. {
    9. return board[i][1];
    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[1][i] != ' ')
    16. {
    17. return board[1][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. }

    🍎在上述代码中我们只考虑到了输赢两种结果,但是当整个棋盘都下满的情况下,还是没有分出胜负,那么这个时候是不是就平局了?没错,这里我们还要考虑到平局的情况:

    🍊代码实现:

    1. static int if_full(char board[ROW][COL], int row, int col)
    2. {
    3. int i = 0;
    4. for (i = 0; i < row; i++)
    5. {
    6. int j = 0;
    7. for (j = 0; j < col; j++)
    8. {
    9. if (board[i][j] == ' ')
    10. {
    11. return 0;//没满
    12. }
    13. }
    14. }
    15. return 1;//满了
    16. }

     🍊这里我们需要判断棋盘是否满了,是返回1,不是返回0,然后输出是否形成平局:

    1. //判断平局
    2. if (if_full(board, row, col) == 1)
    3. {
    4. return 'Q';
    5. }
    6. //继续
    7. return 'C';

     🍑OK,到这里我们的游戏部分就写完了,那么到我们的测试部分;测试部分我们首先定义一个菜单,用于提示用户输入输出:

    1. void menu()
    2. {
    3. printf("********************************\n");
    4. printf("********* 1. play *********\n");
    5. printf("********* 0. exit *********\n");
    6. printf("********************************\n");
    7. }

     ✈️✈️三:完整代码演示

    完成这个游戏我们需要在我们的VS2019里面,设置一个头文件和两个.c文件

    f84df79d160c4fdcbe8d554ced37cbd1.png

    🚞🚞game.h完整代码

    1. #pragma once
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <time.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 player_move(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 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. void DisplayBoard(char board[ROW][COL], int row, int col)
    16. {
    17. int i = 0;
    18. for (i = 0; i < row; i++)
    19. {
    20. //打印数据
    21. int j = 0;
    22. for (j = 0; j < col; j++)
    23. {
    24. printf(" %c ", board[i][j]);
    25. if (j < col - 1)
    26. printf("|");
    27. }
    28. printf("\n");
    29. //打印分割的行
    30. if (i < row - 1)
    31. {
    32. for (j = 0; j < col; j++)
    33. {
    34. printf("---");
    35. if (j < col - 1)
    36. printf("|");
    37. }
    38. printf("\n");
    39. }
    40. }
    41. }
    42. void player_move(char board[ROW][COL], int row, int col)
    43. {
    44. int x = 0;
    45. int y = 0;
    46. printf("玩家下棋\n");
    47. while (1)
    48. {
    49. printf("请输入坐标:>");
    50. scanf("%d %d", &x, &y);
    51. if (x >= 1 && x <= row && y >= 1 && y <= col)
    52. {
    53. //下棋
    54. if (board[x - 1][y - 1] == ' ')
    55. {
    56. board[x - 1][y - 1] = '*';
    57. break;
    58. }
    59. else
    60. {
    61. printf("该坐标被占用,请重新输入\n");
    62. }
    63. }
    64. else
    65. {
    66. printf("坐标非法,请重新输入\n");
    67. }
    68. }
    69. }
    70. void computer_move(char board[ROW][COL], int row, int col)
    71. {
    72. int x = 0;
    73. int y = 0;
    74. printf("电脑下棋:>\n");
    75. while (1)
    76. {
    77. x = rand() % row;//0~2
    78. y = rand() % col;//0~2
    79. if (board[x][y] == ' ')
    80. {
    81. board[x][y] = '#';
    82. break;
    83. }
    84. }
    85. }
    86. static int if_full(char board[ROW][COL], int row, int col)
    87. {
    88. int i = 0;
    89. for (i = 0; i < row; i++)
    90. {
    91. int j = 0;
    92. for (j = 0; j < col; j++)
    93. {
    94. if (board[i][j] == ' ')
    95. {
    96. return 0;//没满
    97. }
    98. }
    99. }
    100. return 1;//满了
    101. }
    102. char is_win(char board[ROW][COL], int row, int col)
    103. {
    104. int i = 0;
    105. //判断行
    106. for (i = 0; i < row; i++)
    107. {
    108. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    109. {
    110. return board[i][1];
    111. }
    112. }
    113. //判断列
    114. for (i = 0; i < col; i++)
    115. {
    116. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
    117. {
    118. return board[1][i];
    119. }
    120. }
    121. //对角线
    122. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    123. {
    124. return board[1][1];
    125. }
    126. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    127. {
    128. return board[1][1];
    129. }
    130. //判断平局
    131. if (if_full(board, row, col) == 1)
    132. {
    133. return 'Q';
    134. }
    135. //继续
    136. return 'C';
    137. }

     

     🚢🚢test.c完整代码

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. //测试三子棋游戏的逻辑
    3. #include "game.h"
    4. void menu()
    5. {
    6. printf("********************************\n");
    7. printf("********* 1. play *********\n");
    8. printf("********* 0. exit *********\n");
    9. printf("********************************\n");
    10. }
    11. void game()
    12. {
    13. char ret = 0;
    14. //存放下棋的数据
    15. char board[ROW][COL] = { 0 };
    16. //初始化棋盘为全空格
    17. InitBoard(board, ROW, COL);
    18. //打印棋盘
    19. DisplayBoard(board, ROW, COL);
    20. while (1)
    21. {
    22. //玩家下棋
    23. player_move(board, ROW, COL);
    24. DisplayBoard(board, ROW, COL);
    25. //判断输赢
    26. ret = is_win(board, ROW, COL);
    27. if (ret != 'C')
    28. {
    29. break;
    30. }
    31. //电脑下棋
    32. computer_move(board, ROW, COL);//随机下棋
    33. DisplayBoard(board, ROW, COL);
    34. ret = is_win(board, ROW, COL);
    35. if (ret != 'C')
    36. {
    37. break;
    38. }
    39. }
    40. if (ret == '*')
    41. {
    42. printf("玩家赢了\n");
    43. }
    44. else if (ret == '#')
    45. {
    46. printf("电脑赢了\n");
    47. }
    48. else
    49. {
    50. printf("平局\n");
    51. }
    52. //DisplayBoard(board, ROW, COL);
    53. }
    54. void test()
    55. {
    56. int input = 0;
    57. srand((unsigned int)time(NULL));
    58. do
    59. {
    60. menu();
    61. printf("请选择:>");
    62. scanf("%d", &input);
    63. switch (input)
    64. {
    65. case 1:
    66. game();//游戏
    67. break;
    68. case 0:
    69. printf("退出游戏\n");
    70. break;
    71. default:
    72. printf("选择错误\n");
    73. break;
    74. }
    75. } while (input);
    76. }
    77. int main()
    78. {
    79. test();
    80. return 0;
    81. }

     🍀☘️代码解读:注意这里我们规定:

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

    ⛵⛵四:运行结果

    621c0c6c99cd41af85b50d3c506f3365.jpeg

     🍰🍰好了,文章最后也是附上了CSDN官方也是推出了毕业季投稿的活动,参加即可获得丰富的礼品,感兴趣的小伙伴快点击链接看看叭!👇

    活动地址:毕业季·进击的技术erhttps://marketing.csdn.net/p/f4a818f6455f3a9a7a20c89f60ad35f7

  • 相关阅读:
    【C++初阶】类和对象——构造函数&&析构函数&&拷贝构造函数
    惊艳的Selenium技巧:探索基础和动作链的奇妙世界
    MariaDB 10.5,MySQL乱码问题,设置字符编码UTF8
    Springboot 集成 RabbitMq 实现消息确认机制
    在枚举类中“优雅地”使用枚举处理器
    野兔在线工具系统V2.7.1中文版更新
    【C#】使用ffmpeg image2pipe 将图片保存为mp4视频
    必看!TMS320C6678+Kintex-7开发板——FPGA案例开发资料(下)
    JVM及GC
    2022最火的Linux性能分析工具--perf
  • 原文地址:https://blog.csdn.net/m0_62426532/article/details/125465290