• 【C语言案例】——三子棋


    目录

    1. 所有代码

    main.c

    game.c

    game.h

    2. 运行结果​编辑

    3. 实现思路 (重点)

    第一步:编写主函数

    第二步:初始化棋盘:

     第三步:对棋盘进行打印

    第四步:实现下棋功能 

     第五步:实现平局判断

     第六步:实现对局输赢频道

     第七步:实现游戏的逻辑

    🌞哈喽,大家好丫,你们的小郭子又来啦 ~

    话不多说,直接上干货,嘻嘻嘻 ~

    1. 所有代码

    main.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include "game.h"
    3. void play_game()
    4. {
    5. char arr[ROW][COL];
    6. init_board(arr, ROW, COL, ' ');
    7. display_board(arr, ROW, COL);
    8. printf("******游戏开始*******\n\n\n");
    9. while (1)
    10. {
    11. int n = 0;
    12. printf("电脑下棋: \n");
    13. set_window(arr, ROW, COL);
    14. display_board(arr, ROW, COL);
    15. n = judge(arr, ROW, COL);
    16. if (n == 0)
    17. {
    18. printf("电脑获胜\n");
    19. break;
    20. }
    21. else if (n == 1)
    22. {
    23. printf("玩家获胜\n");
    24. break;
    25. }
    26. else if (n == 2)
    27. {
    28. printf("平局\n");
    29. break;
    30. }
    31. printf("玩家下棋: ");
    32. set_player(arr, ROW, COL);
    33. display_board(arr, ROW, COL);
    34. n = judge(arr, ROW, COL);
    35. if (n == 0)
    36. {
    37. printf("电脑获胜\n");
    38. break;
    39. }
    40. else if (n == 1)
    41. {
    42. printf("玩家获胜\n");
    43. break;
    44. }
    45. else if (n == 2)
    46. {
    47. printf("平局\n");
    48. break;
    49. }
    50. printf("\n");
    51. }
    52. display_board(arr, ROW, COL);
    53. }
    54. void menu()
    55. {
    56. printf("*************************\n");
    57. printf("****1 start,0 exit*****\n");
    58. printf("*************************\n");
    59. }
    60. void test()
    61. {
    62. srand((unsigned int)time(NULL));
    63. int input = 0;
    64. do
    65. {
    66. menu();
    67. printf("请输入:> ");
    68. scanf("%d", &input);
    69. switch (input)
    70. {
    71. case 0:
    72. printf("退出游戏\n");
    73. break;
    74. case 1:
    75. //游戏入口
    76. play_game();
    77. break;
    78. default:
    79. printf("输入错误,请重新输入:>");
    80. }
    81. } while (input);
    82. }
    83. int main()
    84. {
    85. //程序测试入口
    86. test();
    87. return 0;
    88. }

    game.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include "game.h"
    3. //初始化棋盘
    4. void init_board(char arr[ROW][COL], int row, int col, char set)
    5. {
    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. arr[i][j] = set;
    13. }
    14. }
    15. }
    16. //打印棋盘
    17. void display_board(char arr[ROW][COL], int row, int col)
    18. {
    19. int i = 0;
    20. int j = 0;
    21. for (i = 0; i < row; i++)
    22. {
    23. for (j = 0; j < col; j++)
    24. {
    25. if (i < col - 1 && j < col - 1)
    26. {
    27. printf(" %c |", arr[i][j]);
    28. }
    29. else if (i < col - 1 && j == col - 1)
    30. {
    31. printf(" %c ", arr[i][j]);
    32. }
    33. else if (i == col - 1 && j < col - 1)
    34. {
    35. printf(" %c |", arr[i][j]);
    36. }
    37. else
    38. printf(" %c ", arr[i][j]);
    39. }
    40. printf("\n");
    41. if (i-1)
    42. printf("-----------\n");
    43. }
    44. }
    45. //判断棋盘是否已满
    46. int full_judge(char arr[ROW][COL], int row, int col)
    47. {
    48. int i = 0;
    49. int j = 0;
    50. for (i = 0; i < row; i++)
    51. {
    52. for (j = 0; j < col; j++)
    53. {
    54. if (arr[i][j] == ' ')
    55. return 1;
    56. }
    57. }
    58. return 0;
    59. }
    60. void set_window(char arr[ROW][COL], int row, int col)
    61. {
    62. //这里用循环的话,循环条件该怎么设置。
    63. while (1)
    64. {
    65. int x = rand() % row;
    66. int y = rand() % col;
    67. if (arr[x][y] == ' ')
    68. {
    69. arr[x][y] = '*';
    70. break;
    71. }
    72. }
    73. }
    74. void set_player(char arr[ROW][COL], int row, int col)
    75. {
    76. while (1)
    77. {
    78. int m = 0;
    79. int n = 0;
    80. printf("请输入落子坐标:>\n");
    81. scanf("%d %d", &m, &n);
    82. if ((0 <= m && m < row) && (0 <= n && n < col))
    83. {
    84. if (arr[m][n] == ' ')
    85. {
    86. arr[m][n] = '#';
    87. break;
    88. }
    89. else
    90. {
    91. printf("输入坐标已有棋子,请重新输入\n");
    92. }
    93. }
    94. else
    95. printf("非法输入,请重新输入\n");
    96. }
    97. }
    98. int judge(char arr[ROW][COL], int row, int col)
    99. {
    100. int i = 0;
    101. //判断行是否存在输赢
    102. for (i = 0; i < row; i++)
    103. {
    104. if ((arr[i][0]=='*') && (arr[i][1] =='*')&& (arr[i][2] == '*'))
    105. {
    106. return 0;//电脑获胜
    107. }
    108. else if ((arr[i][0] == '#') && (arr[i][1] == '#') && (arr[i][2] == '#'))
    109. {
    110. return 1;//玩家获胜
    111. }
    112. }
    113. //判断列是否存在输赢
    114. for (i = 0; i < col; i++)
    115. {
    116. if ((arr[0][i] == '*') && (arr[1][i] == '*') && (arr[2][i] == '*'))
    117. {
    118. return 0;
    119. }
    120. else if ((arr[0][i] == '#') && (arr[1][i] == '#') && (arr[2][i] == '#'))
    121. {
    122. return 1;
    123. }
    124. }
    125. //判断对角线是否存在输赢
    126. if (((arr[0][0]=='*') && (arr[1][1]=='*') && (arr[2][2] == '*') )
    127. || ((arr[0][2]=='*') && (arr[1][1]=='*') && (arr[2][0] == '*')))
    128. return 0;
    129. else if (((arr[0][0] == '#') && (arr[1][1] == '#') && (arr[2][2] == '#'))
    130. || ((arr[0][2] == '#') && (arr[1][1] == '#') && (arr[2][0] == '#')))
    131. return 1;
    132. else
    133. {
    134. int start = 0;
    135. start = full_judge(arr, row, col);
    136. if (start == 0)
    137. {
    138. return 2;//表示棋盘已满(平局)
    139. }
    140. else
    141. return 3;//还未分出胜负继续下旗
    142. }
    143. }

    game.h

    1. #include
    2. #include
    3. #include
    4. //棋盘大小
    5. #define ROW 3
    6. #define COL 3
    7. //函数声明
    8. //初始化棋盘
    9. void init_board(char arr[ROW][COL], int row, int col, char set);
    10. //打印棋盘
    11. void display_board(char arr[ROW][COL], int row, int col);
    12. //电脑下棋
    13. void set_window(char arr[ROW][COL], int row, int col);
    14. //玩家下棋
    15. void set_player(char arr[ROW][COL], int row, int col);
    16. //判断输赢
    17. int judge(char arr[ROW][COL], int row, int col);
    18. //判断棋盘是否已满
    19. int full_judge(char arr[ROW][COL], int row, int col);

    2. 运行结果

    3. 实现思路 (重点

    第一步:编写主函数

    主函数的作用是实现进行游戏和退出游戏的功能,可以创建一个无限循环,把判断条件给玩家输入,当判断条件为1时进行游戏,为0时退出程序,当游戏结束时可以再次弹出菜单进行选择实现循环。

    第二步:初始化棋盘:

    利用双重循环直接初始化棋盘

     第三步:对棋盘进行打印

    第四步:实现下棋功能 

    实际上棋盘就是个3*3的数组,我们可以根据二维数组的下标进行落子。玩家需要手动输入坐标,电脑则利用生成随机数的模输入坐标实现落子。还需判断落子点的棋盘是否为空,可以用if来实现判断功能。

     第五步:实现平局判断

    既棋盘下满又无人胜利的时候为平局,用if判断棋盘是否存在空来定是否下满棋盘。

     第六步:实现对局输赢频道

    赢的情况分三种,对角线、行、列三者之一有三个相同的棋子。

     第七步:实现游戏的逻辑

    利用函数的返回值来判断输赢(可以使用胜利棋子的样式做为返回值,这样子就不需要重新判断输赢对

     

    好啦,今天的分享到这里就结束啦 ~🌞🌞

    觉得我分享的文章不错的话,可以关注一下哦,嘻嘻嘻🌞🌞

  • 相关阅读:
    JVM第十六讲:调试排错 - Java 线程分析之线程Dump分析
    React笔记(六)React路由
    【数字电路基础】进制转换:二进制、十进制、八进制、十六进制、反码、补码、原码
    PyTorch中的CPU和GPU代码实现详解
    iOS 借助定位实现“保活”策略
    Vue进阶(幺陆肆):自定义指令之拖拽指令_vue 自定义拖拽指令 循环dom,
    IDEA2020.3.3创建Java web工程时找不到Java Enterprise
    Tomcat多实例部署
    学院打卡第十一天
    AlphaCode:程序员的另类“内卷”?
  • 原文地址:https://blog.csdn.net/weixin_51331210/article/details/127344584