• C语言实现三子棋游戏(详解)


    目录

    引言:

    1.游戏规则:

    2.实现步骤:

    2.1实现菜单:

    2.2创建棋盘并初始化:

    2.3绘制棋盘:

    2.4玩家落子:

    2.5电脑落子:

    2.6判断胜负:

     3.源码:

    结语:


    引言:

    《三子棋》是一款古老的民间传统游戏,又被称为OOXX棋、黑白棋,井字棋,九宫棋等。游戏分为双方对战,双方依次在九宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则为胜利者。

    1.游戏规则

    三子棋是一种两人对战的游戏,棋盘是一个3x3的方格矩阵。玩家和电脑轮流在空白的方格中落子,一方执X,另一方执O。当玩家在横向纵向对角线上连成三个相同的棋子时,该玩家获胜,反之,电脑获胜。如果棋盘填满而无法连成三子,游戏结束,双方平局。

    2.实现步骤:

    想要完整的实现三子棋代码,我们首先必须在脑海里构建出一个大致的框架,然后再去一步步实现它里边的细节。

    1. 实现进入游戏的菜单界面
    2. 创建棋盘并初始化
    3. 绘制棋盘(打印棋盘)
    4. 玩家落子
    5. 电脑落子
    6. 判断胜负

    2.1实现菜单:

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

    2.2创建棋盘并初始化:

    首先,我们需要创建一个3x3的二维数组来表示棋盘,但考虑到这样不灵活,那么我们可以使用宏定义的方式来使我们的代码变得更加易于维护。

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

    2.3绘制棋盘:

    最终呈现在玩家眼里的棋盘应该是由分割线和空位置组成的。

    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. }
    25. printf("\n");
    26. }
    27. }

    2.4玩家落子:

    当玩家下棋时,他眼里的坐标只有1,2,3行,而在计算机中,数组是通过下标访问的,是从0开始的,所以在写代码时应该将玩家输入的坐标减去1才合适。还应该对玩家输入的坐标进行判断看有没有越界访问,以及判断棋子有没有被占用

    1. void PlayerMove(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. if (board[x - 1][y - 1] == ' ')
    13. {
    14. board[x - 1][y - 1] = 'X';
    15. break;
    16. }
    17. else
    18. {
    19. printf("坐标被占用,请重新输入!\n");
    20. }
    21. }
    22. else
    23. printf("坐标非法,请重新输入!\n");
    24. }
    25. }

    2.5电脑落子:

    利用rand函数生成的随机数再模个行和列输入坐标实现落子,电脑落子也要判断落子点是否被占用。

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

    2.6判断胜负:

    🎈我们规定:

    • 玩家赢返回 "X"
    • 电脑赢返回 "O"
    • 平局返回 "Q"
    • 以上三种情况都不是即游戏继续返回 "C"
    1. //未分出胜负并且所有元素都不为空格则为平局
    2. static int IsFull(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. if (board[i][j] == ' ')
    11. {
    12. return 0;
    13. }
    14. }
    15. }
    16. return 1;
    17. }
    18. //玩家赢 X
    19. //电脑赢 O
    20. //平局 Q
    21. //游戏继续 C
    22. char IsWin(char board[ROW][COL], int row, int col)
    23. {
    24. int i = 0;
    25. //判断行
    26. for (i = 0; i < row; i++)
    27. {
    28. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    29. {
    30. return board[i][1];
    31. }
    32. }
    33. //判断列
    34. for (i = 0; i < col; i++)
    35. {
    36. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
    37. {
    38. return board[1][i];
    39. }
    40. }
    41. //判断对角线
    42. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    43. {
    44. return board[1][1];
    45. }
    46. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    47. {
    48. return board[1][1];
    49. }
    50. //判断平局
    51. if (IsFull(board, row, col))
    52. {
    53. return 'Q';
    54. }
    55. return 'C';
    56. }

     3.源码:

    为了让代码逻辑更清晰,更易于调试,我们可以将整个三子棋代码分为三个文件。

    1. 主函数(main.c):实现游戏的进入和退出功能。
    2. 游戏实现函数(game.c):思考游戏的逻辑并构建函数,通过调用一系列函数来实现整个游戏。
    3. 游戏实现头文件(game.h):定义宏并声明游戏实现函数中的各个函数。

    🎈(main.c)

    1. #include "game.h"
    2. void menu()
    3. {
    4. printf("*******************\n");
    5. printf("**** 1.play ****\n");
    6. printf("**** 0.exit ****\n");
    7. printf("*******************\n");
    8. }
    9. void game()
    10. {
    11. char ret = 0;
    12. char board[ROW][COL];//创建二位数组
    13. //开始的时候,数组的内容应该全部是空格
    14. InitBoard(board, ROW, COL);//初始化棋盘
    15. DisplayBoard(board, ROW, COL);//打印棋盘
    16. //下棋
    17. while (1)
    18. {
    19. PlayerMove(board, ROW, COL);
    20. DisplayBoard(board, ROW, COL);
    21. //判断输赢
    22. ret = IsWin(board, ROW, COL);
    23. if (ret != 'C')
    24. {
    25. break;
    26. }
    27. ComputerMove(board, ROW, COL);
    28. DisplayBoard(board, ROW, COL);
    29. //判断输赢
    30. ret = IsWin(board, ROW, COL);
    31. if (ret != 'C')
    32. {
    33. break;
    34. }
    35. }
    36. if (ret == 'X')
    37. {
    38. printf("玩家赢!\n");
    39. }
    40. else if (ret == 'O')
    41. {
    42. printf("电脑赢!\n");
    43. }
    44. else
    45. {
    46. printf("平局!\n");
    47. }
    48. }
    49. int main()
    50. {
    51. int input = 0;
    52. srand((unsigned int)time(NULL));
    53. do
    54. {
    55. menu();
    56. printf("请选择:>");
    57. scanf("%d", &input);
    58. switch(input)
    59. {
    60. case 1:
    61. game();
    62. break;
    63. case 0:
    64. printf("退出游戏\n");
    65. break;
    66. default:
    67. printf("选择错误,重新选择!\n");
    68. break;
    69. }
    70. } while (input);
    71. return 0;
    72. }

     🎈(game.c)

    1. #include "game.h"
    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. }
    14. void DisplayBoard(char board[ROW][COL], int row, int col)
    15. {
    16. int i = 0;
    17. for (i = 0; i < row; i++)
    18. {
    19. //先打印数据
    20. int j = 0;
    21. for (j = 0; j < col; j++)
    22. {
    23. printf(" %c ", board[i][j]);
    24. if (j < col - 1)
    25. printf("|");
    26. }
    27. printf("\n");
    28. //再打印分割行
    29. if (i < row - 1)
    30. {
    31. for (j = 0; j < col; j++)
    32. {
    33. printf("---");
    34. if (j < col - 1)
    35. printf("|");
    36. }
    37. }
    38. printf("\n");
    39. }
    40. }
    41. void PlayerMove(char board[ROW][COL], int row, int col)
    42. {
    43. int x = 0;
    44. int y = 0;
    45. printf("玩家下棋\n");
    46. while (1)
    47. {
    48. printf("请输入坐标:>");
    49. scanf("%d %d", &x, &y);
    50. if (x >= 1 && x <= row && y >= 1 && y <= col)
    51. {
    52. if (board[x - 1][y - 1] == ' ')
    53. {
    54. board[x - 1][y - 1] = 'X';
    55. break;
    56. }
    57. else
    58. {
    59. printf("坐标被占用,请重新输入!\n");
    60. }
    61. }
    62. else
    63. printf("坐标非法,请重新输入!\n");
    64. }
    65. }
    66. void ComputerMove(char board[ROW][COL], int row, int col)
    67. {
    68. printf("电脑下棋\n");
    69. int x = 0;
    70. int y = 0;
    71. while (1)
    72. {
    73. x = rand() % row;
    74. y = rand() % col;
    75. if (board[x][y] == ' ')
    76. {
    77. board[x][y] = 'O';
    78. break;
    79. }
    80. }
    81. }
    82. static int IsFull(char board[ROW][COL], int row, int col)
    83. {
    84. int i = 0;
    85. int j = 0;
    86. for (i = 0; i < row; i++)
    87. {
    88. for (j = 0; j < col; j++)
    89. {
    90. if (board[i][j] == ' ')
    91. {
    92. return 0;
    93. }
    94. }
    95. }
    96. return 1;
    97. }
    98. //玩家赢 返回"X"
    99. //电脑赢 返回"O"
    100. //平局 返回"Q"
    101. //游戏继续 返回"C"
    102. char IsWin(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 (IsFull(board, row, col))
    132. {
    133. return 'Q';
    134. }
    135. return 'C';
    136. }

    🎈(game.h)

    1. #pragma once
    2. #include
    3. #include
    4. #include
    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);

    结语:

    通过本篇博客,我们学习了如何使用C语言实现三子棋游戏。通过实现菜单、创建棋盘并初始化棋盘、绘制棋盘、玩家落子、电脑落子、判断胜负等步骤,我们成功完成了这个有趣的项目。希望本篇博客对初学者和有一定编程经验的佬佬都能有所帮助,最后祝大家玩得愉快呀!

  • 相关阅读:
    HTML期末学生大作业:中华传统文化【苏绣手工艺】带psd设计图(15页)
    C#基础笔记
    Mybatis详细的使用过程(4)
    pycharm上执行pyuic,文件指定不对,那就用命令执行吧
    信维通信投资者关系活动:揭示5G创新实践,展望未来发展
    Hudi查询类型/视图总结
    从0到1实现python基于RPC协议的接口自动化测试
    【JavaScript】基础学习记录
    Kubernetes学习篇之数据加密
    noip模拟赛多校第八场 T4 不要翻墙 (矩阵乘法优化DP, 动态DP)
  • 原文地址:https://blog.csdn.net/weixin_65931202/article/details/132826360