• 三子棋——C语言初阶


    一.游戏思路:

    1. 设计菜单,选择开始游戏(1)还是退出游戏(0)(若是输入数字不再输入范围内,则“选择错误”)
    2. 初始化棋盘
    3. 打印棋盘(步骤二和三不可调换位置)
    4. 玩家下棋(坐标落子)——判断输赢——打印棋盘(行 列)
    5. 电脑下棋(随机落子)——判断输赢——打印棋盘
    6. 游戏的三种状态:玩家赢(*),电脑赢(#),平局(‘Q’),继续(‘C’)
    7. 回到步骤一(循环)

    二.具体步骤分解

    (1).创建三个文件(模块化编程使代码更具有条理性):       
    1. text_01.c:为测试游戏的文件,包含整个游戏的逻辑
    2. game.c:实现函数逻辑的文件
    3. game.h:为头文件,函数声明

                           

    (2).设计菜单,实现菜单中的选择
    1. 选择1,开始游戏
    2. 选择0,退出游戏
    3. 选择其他的内容,打印“选择错误,请重新选择”;并给予重新选择的机会

    //打印菜单:

    1. menu()//设计菜单
    2. {
    3. printf("*******************************\n");
    4. printf("******* 1.play *******\n");
    5. printf("******* 0.exit *******\n");
    6. printf("*******************************\n");
    7. }

    //实现菜单运行的基本逻辑:

    1. int main()
    2. {
    3. srand((unsigned)time(NULL));//设置随机数的生成起点
    4. int input = 0;
    5. do
    6. {
    7. menu();//打印菜单
    8. printf("请选择=>");
    9. scanf("%d", &input);
    10. switch (input)
    11. {
    12. case 1:
    13. game();
    14. break;
    15. case 0:
    16. printf("退出游戏!\n");
    17. break;
    18. default:
    19. printf("选择错误!请重新选择:\n");
    20. break;
    21. }
    22. } while (input);//非零即真
    23. return 0;
    24. }

    (3).初始化棋盘

    //将棋盘当中的所有格子初始化为空格字符即可

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

    (4).打印棋盘

    //第一版:十分局限,只能打印三列

    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. printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
    8. //打印分割信息
    9. if (i < row - 1)
    10. {
    11. printf("---|---|---\n");
    12. }
    13. }
    14. }

    //第二版:可以打印任意行列的棋盘

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

    (5).玩家下棋
    1. 输入坐标(范围是1~3),先行后列,从上到下,从左到右
    2. 判断坐标范围是否合法,若超出范围,则提示“坐标非法,请重新输入!!!”,并让其再次选择其他坐标
    3. 判断坐标是否被重复占用,若是被占用,则提示“坐标已被占用!!!,请选择其他位置”,并让其再次选择其他坐标

    见代码:

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

    (6).电脑下棋
    1. 找出空白的位置
    2. 随机下棋(rand用法,前面文章有详解)
    3. (后续可以再优化代码,让电脑变得更加聪明)

    见代码:

    1. //电脑下棋:(找空白的位置,随机下棋)
    2. void ComputerMove(char board[ROW][COL], int row, int col)
    3. {
    4. printf("电脑下棋=>\n");
    5. int x = 0;
    6. int y = 0;
    7. while (1)
    8. {
    9. x = rand() % row;//生成随机数,范围是0~2
    10. y = rand() % col;
    11. if (board[x][y] == ' ')
    12. {
    13. board[x][y] = '#';
    14. break;
    15. }
    16. }
    17. }

    (7).判断输赢(看返回值)
    1. 玩家赢——'*'
    2. 电脑赢——'#'
    3. 平局——'Q'
    4. 继续——'C'

    //赢的情况:行,列,对角线三个相同的棋相连

    1. int i = 0;
    2. for (i = 0; i < row; i++)
    3. {
    4. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    5. {
    6. return board[i][1];
    7. }
    8. }
    9. //列
    10. int j = 0;
    11. for (j = 0; j < col; j++)
    12. {
    13. if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
    14. {
    15. return board[1][j];
    16. }
    17. }
    18. //对角线
    19. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    20. {
    21. return board[1][1];
    22. }
    23. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
    24. {
    25. return board[0][2];
    26. }

    //平局——判断棋盘是否下满(创建函数)

    1. //判断棋盘是否已经排满(函数)
    2. int IsFull(char board[ROW][COL], int row, int col)
    3. {
    4. //如果满了返回1
    5. //不满返回0
    6. int i = 0;
    7. int j = 0;
    8. for (i = 0; i < row; i++)
    9. {
    10. for (j = 0; j < col; j++)
    11. {
    12. if (board[i][j] == ' ')
    13. {
    14. return 0;
    15. }
    16. }
    17. }
    18. return 1;
    19. }


    三.三子棋简易全码:

    1. text_01.c:
      1. #define _CRT_SECURE_NO_WARNINGS
      2. #include
      3. #include
      4. #include
      5. #include"game.h"
      6. menu()//设计菜单
      7. {
      8. printf("*******************************\n");
      9. printf("******* 1.play *******\n");
      10. printf("******* 0.exit *******\n");
      11. printf("*******************************\n");
      12. }
      13. void game()
      14. {
      15. char ret = '0';
      16. char board[][100] = { 0 };
      17. //初始化棋盘的函数
      18. InitBoard(board, ROW, COL);//行(row),列(col)
      19. DisplayBoard(board, ROW, COL);
      20. while (1)
      21. {
      22. PlayerMove(board, ROW, COL);
      23. //判断输赢:
      24. ret = IsWin(board, ROW, COL);
      25. if (ret != 'C')//说明游戏不再继续
      26. {
      27. break;
      28. }
      29. DisplayBoard(board, ROW, COL);
      30. ComputerMove(board, ROW, COL);
      31. //判断输赢:
      32. ret = IsWin(board, ROW, COL);
      33. if (ret != 'C')//说明游戏不再继续
      34. {
      35. break;
      36. }
      37. DisplayBoard(board, ROW, COL);
      38. }
      39. if (ret == '*')
      40. {
      41. printf("玩家胜利!!!\n");
      42. }
      43. else if (ret == '#')
      44. {
      45. printf("电脑胜利!!!\n");
      46. }
      47. else
      48. {
      49. printf("平局\n");
      50. }
      51. DisplayBoard(board, ROW, COL);
      52. }
      53. int main()
      54. {
      55. srand((unsigned)time(NULL));//设置随机数的生成起点
      56. int input = 0;
      57. do
      58. {
      59. menu();//打印菜单
      60. printf("请选择=>");
      61. scanf("%d", &input);
      62. switch (input)
      63. {
      64. case 1:
      65. game();
      66. break;
      67. case 0:
      68. printf("退出游戏!\n");
      69. break;
      70. default:
      71. printf("选择错误!请重新选择:\n");
      72. break;
      73. }
      74. } while (input);
      75. return 0;
      76. }

    2. game.h:
      1. #pragma once
      2. #define ROW 3
      3. #define COL 3
      4. //初始化棋盘;
      5. void InitBoard(char board[ROW][COL], int row, int col);
      6. //打印棋盘:
      7. void DisplayBoard(char board[ROW][COL], int row, int col);
      8. //玩家下棋:
      9. void PlayerMove(char board[ROW][COL], int row, int col);
      10. //电脑下棋:
      11. void ComputerMove(char board[ROW][COL], int row, int col);
      12. //判断输赢:
      13. char IsWin(char board[ROW][COL], int row, int col);

    3. game.c:
      1. #define _CRT_SECURE_NO_WARNINGS
      2. #include
      3. #include
      4. #include
      5. #include"game.h"
      6. //初始化棋盘;
      7. void InitBoard(char board[ROW][COL], int row, int col)
      8. {
      9. int i = 0;
      10. int j = 0;
      11. for (i = 0; i < row; i++)
      12. {
      13. for (j = 0; j < col; j++)
      14. {
      15. board[i][j] = ' ';
      16. }
      17. }
      18. }
      19. //打印棋盘(第一版)
      20. // 十分局限,列数已经规定死了
      21. //void DisplayBoard(char board[ROW][COL], int row, int col)
      22. //{
      23. // int i = 0;
      24. // for (i = 0; i < row; i++)
      25. // {
      26. // //打印数据
      27. // printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
      28. // //打印分割信息
      29. // if (i < row - 1)
      30. // {
      31. // printf("---|---|---\n");
      32. // }
      33. // }
      34. //}
      35. //打印棋盘(第二版)
      36. void DisplayBoard(char board[ROW][COL], int row, int col)
      37. {
      38. int i = 0;
      39. for (i = 0; i < row; i++)
      40. {
      41. //打印数据
      42. int j = 0;
      43. for (j = 0; j < col; j++)
      44. {
      45. printf(" %c ", board[i][j]);
      46. if (j < col-1)
      47. {
      48. printf("|");
      49. }
      50. }
      51. printf("\n");
      52. //打印分割信息
      53. if (i < row - 1)
      54. {
      55. int j = 0;
      56. for (j = 0; j < col ; j++)
      57. {
      58. printf("---");
      59. if (j < col - 1)
      60. {
      61. printf("|");
      62. }
      63. }
      64. printf("\n");
      65. }
      66. }
      67. }
      68. //玩家下棋:
      69. void PlayerMove(char board[ROW][COL], int row, int col)
      70. {
      71. int x = 0;
      72. int y = 0;
      73. printf("玩家下棋=>\n");
      74. while (1)
      75. {
      76. printf("请输入坐标=>\n");
      77. scanf("%d %d", &x, &y);
      78. //判断坐标范围是否合法
      79. if (x >= 1 && x <= row && y >= 1 && y <= col)
      80. {
      81. //判断坐标是否被重复占用
      82. if (board[x - 1][y - 1] == ' ')
      83. {
      84. board[x - 1][y - 1] = '*';
      85. break;
      86. }
      87. else
      88. {
      89. printf("坐标已被占用!!!,请选择其他位置\n");
      90. }
      91. }
      92. else
      93. {
      94. printf("坐标非法,请重新输入!!!\n");
      95. }
      96. }
      97. }
      98. //电脑下棋:(找空白的位置,随机下棋)
      99. void ComputerMove(char board[ROW][COL], int row, int col)
      100. {
      101. printf("电脑下棋=>\n");
      102. int x = 0;
      103. int y = 0;
      104. while (1)
      105. {
      106. x = rand() % row;//生成随机数,范围是0~2
      107. y = rand() % col;
      108. if (board[x][y] == ' ')
      109. {
      110. board[x][y] = '#';
      111. break;
      112. }
      113. }
      114. }
      115. //判断棋盘是否已经排满(函数)
      116. int IsFull(char board[ROW][COL], int row, int col)
      117. {
      118. //如果满了返回1
      119. //不满返回0
      120. int i = 0;
      121. int j = 0;
      122. for (i = 0; i < row; i++)
      123. {
      124. for (j = 0; j < col; j++)
      125. {
      126. if (board[i][j] == ' ')
      127. {
      128. return 0;
      129. }
      130. }
      131. }
      132. return 1;
      133. }
      134. //判断输赢:
      135. //1.玩家赢——'*'
      136. //2.电脑赢——'#'
      137. //3.平局——'Q'
      138. //4.继续——'C'
      139. char IsWin(char board[ROW][COL], int row, int col)
      140. {
      141. //行
      142. int i = 0;
      143. for (i = 0; i < row; i++)
      144. {
      145. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
      146. {
      147. return board[i][1];
      148. }
      149. }
      150. //列
      151. int j = 0;
      152. for (j = 0; j < col; j++)
      153. {
      154. if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
      155. {
      156. return board[1][j];
      157. }
      158. }
      159. //对角线
      160. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
      161. {
      162. return board[1][1];
      163. }
      164. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
      165. {
      166. return board[0][2];
      167. }
      168. //没有人赢,就要判断平局,判断棋盘是否已经下满
      169. if (IsFull(board, row, col))
      170. {
      171. return 'Q';
      172. }
      173. //游戏继续
      174. return 'C';
      175. }

                            

  • 相关阅读:
    RocketMQ的介绍和环境搭建
    全网最全常用Linux命令合集
    都说自己是数据分析师,80%分析结果都是失败的,小心被裁了
    PHP 如何查看php函数源码
    systemverilog 过程控制语句
    【C++特殊类的设计】
    uCharts常用图表组件demo
    正则表达式和grep命令
    【js】日期控件的实现
    公园【百度之星】/图论+dijkstra
  • 原文地址:https://blog.csdn.net/qsl_81/article/details/134417740