1 创建文件
test.c (游戏的测试逻辑)game.c(游戏的实现逻辑)gane.h(游戏实现函数的声明)
game.c 和game.h属于游戏实现 test.c属于游戏测试
test.c 源文件(源文件添加)——game.c 源文件(源文件添加)——game.h(头文件添加)
三个文件
2 首先在test.c文件写一个主函数,主函数里面有一个测试函数,测试函数里面写菜单、进入游戏、退出游戏
代码展示:
1. void menu() 2. { 3. printf("***************************\n"); 4. printf("******** 1.play ********\n"); 5. printf("******** 0.exit ********\n"); 6. printf("***************************\n"); 7. } 8. 9. void test() 10. { 11. int input = 0; 12. do 13. { 14. menu(); 15. printf("请选择:->"); 16. scanf("%d", &input); 17. switch (input) 18. { 19. case 1: 20. printf("三子棋\n"); 21. break; 22. case 0: 23. printf("退出游戏\n"); 24. break; 25. default: 26. printf("选择错误\n"); 27. break; 28. } 29. } while (input); 30. } 31. 32. #include <stdio.h> 33. int main() 34. { 35. test(); 36. return 0; 37. }
注意:
(1)一般用do while (游戏可能会玩很多次,最少一次)
(2)先打印一个菜单
(3)switch语句,要记得break,要记得default
接下来 把printf("三子棋\n") 改成 game(); 然后开始写游戏部分。
3 三子棋代码
思路:(\n 不要忘记写)
(1)棋盘用数组
(2)假设玩家走用' * ',电脑走用' # ',所以用字符类型的数组(3*3的)
row 中文意思是行 column 中文意思是列 init 英文最初的简写
引用自己写的文件 把#include < >改成 #include " "
(3)棋盘初始化
函数的声明在头文件里
(4)打印棋盘 (打印数据、分割行),把数据行和分割行看做一大部分,最后一部分没有分割行而已。
(5)玩家下棋,打印棋盘,电脑下棋,打印棋盘。
(6)每下一步棋后,会有四种结果 玩家赢,电脑赢,平局,继续玩 。所以要进行判断。
玩家赢 ‘*’,电脑赢‘#’,平局‘Q’,继续 ‘C’
game.h 部分代码展示
1. #pragma once 2. #include <stdio.h> 3. #include <time.h> 4. #include <stdlib.h> 5. 6. #define ROW 3 7. #define COL 3 8. 9. //初始化棋盘 10. void Initboard(char board[ROW][COL], int row, int col);//define 定义的ROW,COL是常量,而这里的row,col都是变量,所以不能替代 11. void Displayboard(char board[ROW][COL], int row, int col);//打印棋盘 12. void player_move(char board[ROW][COL], int row, int col);//玩家下棋 13. void computer_move(char board[ROW][COL], int row, int col);//电脑下棋 14. 15. char is_win(char board[ROW][COL], int row, int col);//判断输赢以及平局和继续玩
game.c代码展示
1. #include "game.h" 2. 3. 4. void Initboard(char board[ROW][COL], int row, int col) 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. board[i][j] = ' '; 13. } 14. } 15. } 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. //打印数据 24. //printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);//固定的数字0,1,2 会把棋盘给固定住,所以不能这样写 25. for (j = 0; j < col; j++) 26. { 27. printf(" %c ", board[i][j]); 28. if (j < col - 1) 29. printf("|"); 30. } 31. printf("\n"); 32. //打印分割行 33. if (i < row - 1) 34. { 35. for (j = 0; j < col; j++) 36. { 37. printf("---"); 38. if (j < col - 1) 39. { 40. printf("|"); 41. } 42. } 43. printf("\n"); 44. } 45. } 46. 47. } 48. 49. int is_full(char board[ROW][COL], int row, int col) 50. { 51. int i = 0; 52. int j = 0; 53. for (i = 0; i < row; i++) 54. { 55. for (j = 0; j < col; j++) 56. { 57. if (board[i][j] == ' ') 58. { 59. return 0; 60. } 61. } 62. } 63. return 1; 64. } 65. 66. void player_move(char board[ROW][COL], int row, int col) 67. { 68. int x = 0; 69. int y = 0; 70. printf("请输入坐标:->"); 71. while (1) 72. { 73. scanf("%d %d", &x, &y); 74. //判断坐标是否在棋盘范围 75. if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) 76. { 77. if (board[x - 1][y - 1] == ' ') 78. { 79. board[x - 1][y - 1] = '*'; 80. break; 81. } 82. else 83. { 84. printf("该坐标被占用,请重新输入!\n"); 85. } 86. } 87. else 88. { 89. printf("坐标非法\n"); 90. } 91. } 92. } 93. 94. //电脑下棋 95. void computer_move(char board[ROW][COL], int row, int col) 96. { 97. int x = 0; 98. int y = 0; 99. printf("电脑下棋\n"); 100. while (1) 101. { 102. x = rand() % row; 103. y = rand() % col; 104. if (board[x][y] == ' ') 105. { 106. board[x][y] = '#'; 107. break; 108. } 109. } 110. } 111. //判断每一步棋后是输赢,还是平局,还是继续玩 112. char is_win(char board[ROW][COL], int row, int col) 113. { 114. int i = 0; 115. for (i = 0; i < row; i++) 116. { 117. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') 118. { 119. return board[i][0]; 120. } 121. } 122. for (i = 0; i < col; i++) 123. { 124. if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') 125. { 126. return board[0][i]; 127. } 128. } 129. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') 130. { 131. return board[0][0]; 132. } 133. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') 134. { 135. return board[1][1]; 136. } 137. int a = is_full(board, row, col); 138. if (1 == a) 139. { 140. return 'Q'; 141. } 142. return 'C'; 143. }
test.c 部分代码展示
1. #include "game.h" 2. 3. void menu() 4. { 5. printf("***************************\n"); 6. printf("******** 1.play ********\n"); 7. printf("******** 0.exit ********\n"); 8. printf("***************************\n"); 9. } 10. 11. void game() 12. { 13. char board[ROW][COL] = { 0 }; 14. Initboard(board, ROW, COL);//棋盘初始化,内容为空格 15. Displayboard(board, ROW, COL);//打印棋盘 16. char ret = 0; 17. //下棋 18. while (1) 19. { 20. player_move(board, ROW, COL); 21. Displayboard(board, ROW, COL); 22. ret = is_win(board, ROW, COL); 23. if (ret != 'C') 24. { 25. break; 26. } 27. computer_move(board, ROW, COL); 28. Displayboard(board, ROW, COL); 29. ret = is_win(board, ROW, COL); 30. if (ret != 'C') 31. { 32. break; 33. } 34. } 35. if (ret == '*') 36. { 37. printf("恭喜你,取得胜利!\n"); 38. } 39. else if (ret == 'Q') 40. { 41. printf("平局\n"); 42. } 43. else 44. { 45. printf("你输了\n"); 46. } 47. } 48. 49. void test() 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. } 72. 73. 74. int main() 75. { 76. test(); 77. return 0; 78. }
三子棋就结束了!