• C语言实现三字棋


    实现以下:

    1游戏不退出,继续玩下一把(循环)

    2应用多文件的形式完成

    test.c. --测试游戏

    game.c -游戏函数的实现

    game.h -游戏函数的声明

    (2)游戏再走的过程中要进行数据的存储,可以使用3*3的二维数组

    char bord[3][3];

    (2)没下棋之前数组中存放空格

    以下都是具体函数的实现,都在game.c文件中完成,test.c调用,game.h定义

    第一步初始化棋盘

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

    第二步打印棋盘

    1. //版本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. // int j = 0;
    8. // for(j = 0; j<col;j++)
    9. // {
    10. // printf("%c",board[i][j]);
    11. // }
    12. // printf("\n");
    13. // }
    14. // }
    15. //版本2
    16. // void DisplayBoard(char board[ROW][COL],int row,int col)
    17. // {
    18. // int i = 0;
    19. // for(i = 0;i<row;i++)
    20. // {
    21. // //1.打印数据
    22. // printf("%c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
    23. // //打印分割线
    24. // if(i < row -1)
    25. // {
    26. // printf("---|---|---");
    27. // }
    28. // // int j = 0;
    29. // // for(j = 0; j<col;j++)
    30. // // {
    31. // // printf("%c",board[i][j]);
    32. // // }
    33. // // printf("\n");
    34. // }
    35. // }
    36. //版本3
    37. //打印棋盘
    38. void DisplayBoard(char board[ROW][COL],int row,int col)
    39. {
    40. int i = 0;
    41. for(i = 0;i<row;i++)
    42. {
    43. //1.打印数据
    44. int j = 0;
    45. for(j = 0; j < col;j++)
    46. {
    47. printf(" %c ",board[i][j]);
    48. if(j < col - 1)
    49. {
    50. printf("|");
    51. }
    52. }
    53. printf("\n");
    54. //打印分割线
    55. if(i < row -1)
    56. {
    57. //printf("---|---|---");
    58. int j = 0;
    59. for(j = 0; j < col;j++)
    60. {
    61. printf("---");
    62. if(j < col - 1)
    63. {
    64. printf("|");
    65. }
    66. }
    67. printf("\n");
    68. }
    69. }
    70. }

    第三步玩家开始下棋

    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("请输入下棋的坐标,中间使用空格>:");
    10. scanf("%d %d",&x,&y);
    11. //坐标合法
    12. if(x >= 1 && x <= row && y >= 1 && y <= col)
    13. {
    14. if(board[x-1][y-1] == ' ') //可以落子
    15. {
    16. board[x - 1][y - 1] = '*';
    17. break;
    18. } else //不能落子
    19. {
    20. printf("坐标被占用,不能落子,请重新输入坐标\n");
    21. }
    22. }
    23. else //非法
    24. {
    25. printf("坐标非法,重新输入\n");
    26. }
    27. }
    28. }

    第四步电脑下棋

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

    第五步判断输赢

    1. //判断输赢
    2. char IsWin(char board[ROW][COL],int row,int col)
    3. {
    4. //
    5. int i = 0;
    6. //判断行是否三个相等
    7. for(i = 0;i < row; i++)
    8. {
    9. if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    10. {
    11. return board[i][0];
    12. }
    13. }
    14. //判断列是否三个相等
    15. for(i = 0;i < col; i++)
    16. {
    17. if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    18. {
    19. return board[0][i];
    20. }
    21. }
    22. //判断对角线是否三个相等
    23. for(i = 0;i < col; i++)
    24. {
    25. if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    26. {
    27. return board[1][1];
    28. }
    29. if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    30. {
    31. return board[1][1];
    32. }
    33. }
    34. //平局
    35. if(IsFull(board,row,col) == 1)
    36. {
    37. return 'Q';
    38. }
    39. //继续
    40. return 'C';
    41. }

     以下是完整版内容

    game.h文件

    1. //声明函数
    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. //玩家赢 -'*'
    17. //电脑赢- '#'
    18. //平局 -'Q'
    19. //继续游戏 -'C'
    20. char IsWin(char board[ROW][COL],int row,int col);

    game.c文件

    1. #include "game.h"
    2. //初始化棋盘为空格
    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. //版本1
    16. // void DisplayBoard(char board[ROW][COL],int row,int col)
    17. // {
    18. // int i = 0;
    19. // for(i = 0;i<row;i++)
    20. // {
    21. // int j = 0;
    22. // for(j = 0; j<col;j++)
    23. // {
    24. // printf("%c",board[i][j]);
    25. // }
    26. // printf("\n");
    27. // }
    28. // }
    29. //版本2
    30. // void DisplayBoard(char board[ROW][COL],int row,int col)
    31. // {
    32. // int i = 0;
    33. // for(i = 0;i<row;i++)
    34. // {
    35. // //1.打印数据
    36. // printf("%c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
    37. // //打印分割线
    38. // if(i < row -1)
    39. // {
    40. // printf("---|---|---");
    41. // }
    42. // // int j = 0;
    43. // // for(j = 0; j<col;j++)
    44. // // {
    45. // // printf("%c",board[i][j]);
    46. // // }
    47. // // printf("\n");
    48. // }
    49. // }
    50. //版本3
    51. //打印棋盘
    52. void DisplayBoard(char board[ROW][COL],int row,int col)
    53. {
    54. int i = 0;
    55. for(i = 0;i<row;i++)
    56. {
    57. //1.打印数据
    58. int j = 0;
    59. for(j = 0; j < col;j++)
    60. {
    61. printf(" %c ",board[i][j]);
    62. if(j < col - 1)
    63. {
    64. printf("|");
    65. }
    66. }
    67. printf("\n");
    68. //打印分割线
    69. if(i < row -1)
    70. {
    71. //printf("---|---|---");
    72. int j = 0;
    73. for(j = 0; j < col;j++)
    74. {
    75. printf("---");
    76. if(j < col - 1)
    77. {
    78. printf("|");
    79. }
    80. }
    81. printf("\n");
    82. }
    83. }
    84. }
    85. //玩家下棋
    86. void PlayerMove(char board[ROW][COL],int row,int col)
    87. {
    88. int x = 0;
    89. int y = 0;
    90. printf("玩家下棋:>\n");
    91. while (1)
    92. {
    93. printf("请输入下棋的坐标,中间使用空格>:");
    94. scanf("%d %d",&x,&y);
    95. //坐标合法
    96. if(x >= 1 && x <= row && y >= 1 && y <= col)
    97. {
    98. if(board[x-1][y-1] == ' ') //可以落子
    99. {
    100. board[x - 1][y - 1] = '*';
    101. break;
    102. } else //不能落子
    103. {
    104. printf("坐标被占用,不能落子,请重新输入坐标\n");
    105. }
    106. }
    107. else //非法
    108. {
    109. printf("坐标非法,重新输入\n");
    110. }
    111. }
    112. }
    113. //电脑随机下棋,随机生成坐标
    114. void ComputerMove(char board[ROW][COL],int row,int col)
    115. {
    116. int x = 0; // 0~row-1
    117. int y = 0; // 0~col-1
    118. printf("电脑下棋:>\n");
    119. while (1)
    120. {
    121. x = rand() % row;
    122. y = rand() % col;
    123. if(board[x][y] == ' ')
    124. {
    125. board[x][y] = '#';
    126. break;
    127. }
    128. }
    129. }
    130. int IsFull(char board[ROW][COL],int row,int col)
    131. {
    132. int i = 0;
    133. for(i = 0;i < row;i++)
    134. {
    135. int j = 0;
    136. for(j = 0;j< col;j++)
    137. {
    138. if(board[i][j] == ' ')
    139. {
    140. return 0;
    141. }
    142. }
    143. }
    144. return 1;
    145. }
    146. //判断输赢
    147. char IsWin(char board[ROW][COL],int row,int col)
    148. {
    149. //
    150. int i = 0;
    151. //判断行是否三个相等
    152. for(i = 0;i < row; i++)
    153. {
    154. if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    155. {
    156. return board[i][0];
    157. }
    158. }
    159. //判断列是否三个相等
    160. for(i = 0;i < col; i++)
    161. {
    162. if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    163. {
    164. return board[0][i];
    165. }
    166. }
    167. //判断对角线是否三个相等
    168. for(i = 0;i < col; i++)
    169. {
    170. if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    171. {
    172. return board[1][1];
    173. }
    174. if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    175. {
    176. return board[1][1];
    177. }
    178. }
    179. //平局
    180. if(IsFull(board,row,col) == 1)
    181. {
    182. return 'Q';
    183. }
    184. //继续
    185. return 'C';
    186. }

    test.c文件

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

  • 相关阅读:
    apt update和apt upgrade命令 - 有什么区别?
    vue父子组件间数据的双向绑定
    Linux ALSA驱动之Platform源码分析(wm8350.c)
    【业务功能篇96】微服务-springcloud-springboot-认证服务-登录注册功能-Auth2.0-分布式session
    Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验
    docker 基本操作
    [附源码]JAVA毕业设计高校心理咨询预约系统(系统+LW)
    动态修改el-input样式;动态修改elmentUI元素样式;css变量
    springboot农产品销售网站管理系统java
    PostgreSQL创建分区表,并插入大量数据
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/132790162