• 三子棋小游戏(简单详细)


    设计总体思路

    实现游戏可以一直玩,先打印棋盘,玩家和电脑下棋,最后分出胜负。

    如果编写较大的程序,我们可以分不同模块

    例如这个三子棋,我们可以创建三个文件

    分别为:

    1. game.h     函数的声明
    2. game.c     函数的实现
    3. test.c        测试游戏逻辑

    一、打印游戏菜单界面

    首先要有开始界面并且有选项选择,开始你的游戏,代码以及效果图如下:

    1. void menu()
    2. {
    3. printf("*********************************************\n");
    4. printf("************* 1. play *********\n");
    5. printf("************* 0. exit *********\n");
    6. printf("*********************************************\n");
    7. }
    8. int main()
    9. {
    10. srand((unsigned int)time(NULL)); //随机数 无符号整型 时间戳
    11. //头文件:stdlib.h time.h
    12. int input = 0;
    13. do
    14. {
    15. menu(); //先打印菜单
    16. printf("请选择>:"); //选项选择
    17. scanf("%d", &input);
    18. switch(input)
    19. {
    20. case 1:
    21. game();
    22. break;
    23. case 0:
    24. printf("退出游戏\n");
    25. break;
    26. default:
    27. printf("选择错误,重新选择\n");
    28. break;
    29. }
    30. } while (input);
    31. return 0;
    32. }

    二、打印棋盘

    创建并初始化数组,再打印棋盘,代码以及效果图如下:

    game.h

    1. #pragma once
    2. //头文件的包含
    3. #include
    4. #include
    5. #include
    6. #include //我们可以将头文件都包含在game.h,
    7. //其余使用只需包含一下game.h即可,无需重复写头文件
    8. #define ROW 3 //定义一下行和列,未来所有使用行和列直接使用ROW和COL,
    9. #define COL 3 //如果要更改行和列即可全篇修改
    10. //函数的声明
    11. //
    12. //初始化棋盘
    13. void InitBoard(char board[ROW][COL],int row,int col);
    14. //打印棋盘
    15. void DisplayBoard(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. //初始化 地址 初始化的内容 字节大小 头文件:string.h
    15. //memset(&board[0][0],' ',row*col*sizeof(board[0][0])); //这个也是初始化棋盘
    16. }
    17. void DisplayBoard(char board[ROW][COL], int row, int col)
    18. {
    19. int i = 0;
    20. int j = 0;
    21. for (i = 0; i < row; i++)
    22. {
    23. int j = 0;
    24. for (j = 0; j < col; j++)
    25. {
    26. printf(" %c ", board[i][j]);
    27. if(j-1)
    28. printf("|");
    29. }
    30. printf("\n");
    31. if (i < row - 1)
    32. {
    33. for (j = 0; j < col; j++)
    34. {
    35. printf("---");
    36. if(j-1)
    37. printf("|");
    38. }
    39. }
    40. printf("\n");
    41. }
    42. }

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"game.h"
    3. void game()
    4. {
    5. //存放数据需要一个3*3的二维数组
    6. char board[ROW ][COL] = {0};
    7. //初始化棋盘
    8. InitBoard(board, ROW, COL);
    9. //显示棋盘
    10. DisplayBoard(board, ROW, COL);
    11. }

    三、玩家下棋

     '*' 代表玩家下的棋子

    代码思路,第一步创建玩家下棋的函数PlayerMove()并输入坐标,代码图如下:

    game.c

    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] == ' ') //因为数组下标是从0开始
    13. {
    14. board[x - 1][y - 1] = '*';
    15. break;
    16. }
    17. else
    18. {
    19. printf("坐标被占用,重新输入\n");
    20. }
    21. }
    22. else
    23. {
    24. printf("坐标非法,请重新输入\n");
    25. }
    26. }
    27. }

    四、电脑下棋

     '#' 代表电脑下的棋子

    代码思路,第一步创建电脑下棋的函数ComputerMove()并输入坐标,代码图如下:

    game.c

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

    五、判断输赢

    创建判断输赢的IsWin()函数,while()循环实现玩家和电脑可以轮流下直到一方胜利,

    如果有三个 '*' 符号连成一条线,代表玩家获胜,

    如果有三个 '#' 符号连成一条线,代表电脑获胜,

    如果九个格子填满,但无三个相同符号连成一条线,则平局。

    IsWin()函数中:

    1. 玩家赢返回'*'
    2. 电脑赢返回'#'
    3. 平局返回'Q'
    4. 继续游戏返回'C'

    game.c

    1. int IsFull(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. if (board[i][j] == ' ')
    10. {
    11. return 0;
    12. }
    13. }
    14. }
    15. return 1;
    16. }
    17. //判断输赢
    18. //玩家赢 - '*'
    19. //电脑赢 - '#'
    20. //平局 - 'Q'
    21. //继续 - 'C'
    22. char IsWin(char board[ROW][COL], int row, int col)
    23. {
    24. int i = 0;
    25. for (i = 0; i < row; i++)
    26. {
    27. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    28. {
    29. return board[i][0];
    30. }
    31. }
    32. for (i = 0; i < col; i++)
    33. {
    34. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    35. {
    36. return board[0][i];
    37. }
    38. }
    39. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    40. {
    41. return board[1][1];
    42. }
    43. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    44. {
    45. return board[1][1];
    46. }
    47. //判断是否平局
    48. if (IsFull(board,row,col))
    49. {
    50. return 'Q';
    51. }
    52. //游戏继续
    53. return 'C';
    54. }

    test.c

    1. void game()
    2. {
    3. //存放数据需要一个3*3的二维数组
    4. char board[ROW ][COL] = {0};
    5. //初始化棋盘
    6. InitBoard(board, ROW, COL);
    7. //显示棋盘
    8. DisplayBoard(board, ROW, COL);
    9. char ret = 0;
    10. while (1)
    11. {
    12. //玩家下棋
    13. PlayerMove(board, ROW,COL);
    14. //打印棋盘
    15. DisplayBoard(board, ROW, COL);
    16. //判断输赢
    17. ret = IsWin(board, ROW, COL);
    18. if(ret != 'C')
    19. {
    20. break;
    21. }
    22. //电脑下棋
    23. ComputerMove(board, ROW, COL);
    24. //打印棋盘
    25. DisplayBoard(board, ROW, COL);
    26. //判断输赢
    27. ret = IsWin(board, ROW, COL);
    28. if (ret != 'C')
    29. {
    30. break;
    31. }
    32. }
    33. if ('*' == ret)
    34. {
    35. printf("玩家赢\n");
    36. }
    37. if ('#' == ret)
    38. {
    39. printf("电脑赢\n");
    40. }
    41. if ('Q' == ret)
    42. {
    43. printf("平局\n");
    44. }
    45. }

     六、最后整理代码(完整代码)

    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. //初始化 地址 初始化的内容 字节大小 头文件:string.h
    15. //memset(&board[0][0],' ',row*col*sizeof(board[0][0]));
    16. }
    17. void DisplayBoard(char board[ROW][COL], int row, int col)
    18. {
    19. int i = 0;
    20. int j = 0;
    21. for (i = 0; i < row; i++)
    22. {
    23. int j = 0;
    24. for (j = 0; j < col; j++)
    25. {
    26. printf(" %c ", board[i][j]);
    27. if(j-1)
    28. printf("|");
    29. }
    30. printf("\n");
    31. if (i < row - 1)
    32. {
    33. for (j = 0; j < col; j++)
    34. {
    35. printf("---");
    36. if(j-1)
    37. printf("|");
    38. }
    39. }
    40. printf("\n");
    41. }
    42. }
    43. void PlayerMove(char board[ROW][COL], int row, int col)
    44. {
    45. int x = 0;
    46. int y = 0;
    47. printf("玩家下棋>:\n");
    48. while (1)
    49. {
    50. printf("请输入要下棋的坐标>:");
    51. scanf("%d %d", &x, &y);
    52. if (x >= 1 && x <= row && y >= 1 && y <= col)
    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. //电脑随机下棋
    71. void ComputerMove(char board[ROW][COL], int row, int col)
    72. {
    73. while (1)
    74. {
    75. int x = 0;
    76. int y = 0;
    77. printf("电脑下棋>:\n");
    78. x = rand() % row;
    79. y = rand() % col;
    80. if (board[x][y] == ' ')
    81. {
    82. board[x][y] = '#';
    83. break;
    84. }
    85. }
    86. }
    87. int IsFull(char board[ROW][COL], int row, int col)
    88. {
    89. int i = 0;
    90. int j = 0;
    91. for (i = 0; i < row; i++)
    92. {
    93. for (j = 0; j < col; j++)
    94. {
    95. if (board[i][j] == ' ')
    96. {
    97. return 0;
    98. }
    99. }
    100. }
    101. return 1;
    102. }
    103. //判断输赢
    104. //玩家赢 - '*'
    105. //电脑赢 - '#'
    106. //平局 - 'Q'
    107. //继续 - 'C'
    108. char IsWin(char board[ROW][COL], int row, int col)
    109. {
    110. int i = 0;
    111. for (i = 0; i < row; i++)
    112. {
    113. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    114. {
    115. return board[i][0];
    116. }
    117. }
    118. for (i = 0; i < col; i++)
    119. {
    120. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    121. {
    122. return board[0][i];
    123. }
    124. }
    125. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    126. {
    127. return board[1][1];
    128. }
    129. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    130. {
    131. return board[1][1];
    132. }
    133. //判断是否平局
    134. if (IsFull(board,row,col))
    135. {
    136. return 'Q';
    137. }
    138. //游戏继续
    139. return 'C';
    140. }

    game.h

    1. #pragma once
    2. //头文件的包含
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define ROW 3
    8. #define COL 3
    9. //函数的声明
    10. //
    11. //初始化棋盘
    12. void InitBoard(char board[ROW][COL],int row,int col);
    13. //打印棋盘
    14. void DisplayBoard(char board[ROW][COL], int row, int col);
    15. //玩家下棋
    16. void PlayerMove(char board[ROW][COL], int row, int col);
    17. //电脑下棋
    18. void ComputerMove(char board[ROW][COL], int row, int col);
    19. //判断输赢
    20. char IsWin(char board[ROW][COL], int row, int col);

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"game.h"
    3. void menu()
    4. {
    5. printf("*********************************************\n");
    6. printf("************* 1. play *********\n");
    7. printf("************* 0. exit *********\n");
    8. printf("*********************************************\n");
    9. printf("*********************************************\n");
    10. }
    11. void game()
    12. {
    13. //存放数据需要一个3*3的二维数组
    14. char board[ROW ][COL] = {0};
    15. //初始化棋盘
    16. InitBoard(board, ROW, COL);
    17. //显示棋盘
    18. DisplayBoard(board, ROW, COL);
    19. char ret = 0;
    20. while (1)
    21. {
    22. //玩家下棋
    23. PlayerMove(board, ROW,COL);
    24. //打印棋盘
    25. DisplayBoard(board, ROW, COL);
    26. //判断输赢
    27. ret = IsWin(board, ROW, COL);
    28. if(ret != 'C')
    29. {
    30. break;
    31. }
    32. //电脑下棋
    33. ComputerMove(board, ROW, COL);
    34. //打印棋盘
    35. DisplayBoard(board, ROW, COL);
    36. //判断输赢
    37. ret = IsWin(board, ROW, COL);
    38. if (ret != 'C')
    39. {
    40. break;
    41. }
    42. }
    43. if ('*' == ret)
    44. {
    45. printf("玩家赢\n");
    46. }
    47. if ('#' == ret)
    48. {
    49. printf("电脑赢\n");
    50. }
    51. if ('Q' == ret)
    52. {
    53. printf("平局\n");
    54. }
    55. }
    56. int main()
    57. {
    58. srand((unsigned int)time(NULL)); //随机数 无符号整型 时间戳
    59. //头文件:stdlib.h time.h
    60. int input = 0;
    61. do
    62. {
    63. menu();
    64. printf("请选择:>");
    65. scanf("%d", &input);
    66. switch(input)
    67. {
    68. case 1:
    69. game();
    70. break;
    71. case 0:
    72. printf("退出游戏\n");
    73. break;
    74. default:
    75. printf("选择错误,重新选择\n");
    76. break;
    77. }
    78. } while (input);
    79. return 0;
    80. }

    七、游戏展示

    如果各位玩了之后会发现(因为电脑是随机下的,所以可能要被电脑气死)

    1. 赢是特别简单
    2. 电脑赢有点难度
    3. 平局究极难

    所以我们可以把平局作为目标去尝试,你会发现还是有点意思的!

    最后希望对你们有帮助

  • 相关阅读:
    计算机网络学习笔记——运输层(b站)
    【JavaEE】HashMap
    Linux入门之使用 arp 管理ARP协议缓存
    图解LeetCode——640. 求解方程(难度:中等)
    分糖果(JavaScript)
    如何流畅进入Github
    盲盒网站遭遇DDoS攻击,高防ip是如何起到安全防护的?
    Hadoop学习总结(搭建Hadoop集群(伪分布式模式))
    【设计模式】Java设计模式 - 状态模式
    编码与测试
  • 原文地址:https://blog.csdn.net/Starry__Sky222/article/details/133189226