1 进入游戏 退出游戏 以及菜单部分
代码展示:
1. #include <stdio.h> 2. 3. void game() 4. { 5. printf("扫雷\n"); 6. } 7. 8. void menu() 9. { 10. printf("********************\n"); 11. printf("****** 1.play ******\n"); 12. printf("****** 0.exit ******\n"); 13. printf("********************\n"); 14. } 15. 16. void test() 17. { 18. int input = 0; 19. do 20. { 21. menu(); 22. printf("请选择:->\n"); 23. scanf("%d", &input); 24. switch (input) 25. { 26. case 1: 27. game(); 28. break; 29. case 0: 30. printf("退出游戏\n"); 31. break; 32. default: 33. printf("输入错误,重新输入\n"); 34. break; 35. } 36. } while (input); 37. } 38. 39. 40. 41. int main() 42. { 43. test(); 44. return 0; 45. }
知识点:
(1)游戏只要我们不退出,就可以持续地玩,所以用do……while结构
(2)注意break,不要忘记写
(3)为了美观,以及方便,\n 用到的地方比较多,注意
2 思路
扫雷游戏:首先里面有固定雷的数量,当随便点一个格,会显示周围8个格子里雷的数量,当玩家点的格是雷,就会输掉游戏。例如:9*9的方格里面有10个雷。
(1)9*9的格子,用二维数组。
(1)布置10个雷的位置。如果用int类型 0和1 表示是否有雷,那么当点一个格的时候,当周围没有雷和就有一个雷的时候(格子里面应该显示0和1),这种时候就会发生冲突。
所以用char类型,可以一个棋盘布置好雷的信息,一个棋盘放排查出 的信息。
第一个棋盘(mine):存放雷
第二个棋盘(show):没有排查的位置放‘*’,排查出的位置就显示相应的数字。
排查边缘位置的格,排查的地方就越界了,所以将数组改成11*11的,上下左右各加一行。char board[11][11]
(3)数字+‘0’ 把数字转化成字符
3 代码
game.h 代码展示
1. #pragma once 2. 3. #include <stdio.h> 4. #include <time.h> 5. #include <stdlib.h> 6. 7. #define ROW 9 8. #define COL 9 9. 10. #define ROWS ROW+2 11. #define COLS COL+2 12. #define easycount 10 13. 14. //初始化棋盘 15. void Initboard(char board[ROWS][COLS], int rows, int cols, char set);//两个数组 mine show 都可以应用 16. //打印棋盘 17. void displayboard(char board[ROWS][COLS], int row, int col); 18. //布置雷 19. void Setmine(char board[ROWS][COLS], int row, int col); 20. //排雷 21. void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);
game.c 代码展示
1. #include "game.h" 2. 3. void Initboard(char mine[ROWS][COLS], int rows, int cols, char set) 4. { 5. int i = 0; 6. int j = 0; 7. for (i = 0; i < rows; i++) 8. { 9. for (j = 0; j < cols; j++) 10. { 11. mine[i][j] = set; 12. } 13. } 14. } 15. 16. void displayboard(char board[ROWS][COLS], int row, int col) 17. { 18. //打印中间9*9 19. int i = 0; 20. int j = 0; 21. //打印列号 22. for (i = 0; i <= row; i++) 23. { 24. printf("%d ", i); 25. } 26. printf("\n"); 27. for (i = 1; i <= row; i++) 28. { 29. printf("%d ", i); 30. for (j = 1; j <= col; j++) 31. { 32. printf("%c ", board[i][j]); 33. } 34. printf("\n"); 35. } 36. } 37. //布置雷 38. void Setmine(char board[ROWS][COLS], int row, int col) 39. { 40. int count = easycount; 41. while (count) 42. { 43. int x = (rand() % row) + 1; 44. int y = (rand() % col) + 1; 45. if (board[x][y] == '0') 46. { 47. board[x][y] = '1'; 48. count--; 49. } 50. } 51. } 52. 53. static int get_mine_count(char mine[ROWS][COLS], int x, int y) 54. { 55. return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0'; 56. } 57. 58. void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) 59. { 60. int x = 0; 61. int y = 0; 62. int win = 0; 63. while (1) 64. { 65. printf("请输入坐标:"); 66. scanf("%d %d", &x, &y); 67. if (x >= 1 && x <= row && y >= 1 && y <= col) 68. { 69. if (mine[x][y] == '1') 70. { 71. printf("很遗憾,你输了!\n"); 72. displayboard(mine, row, col); 73. break; 74. } 75. else 76. { 77. //计算周围有多少个雷 78. int n = get_mine_count(mine, x, y); 79. show[x][y] = n + '0'; 80. displayboard(show, row, col); 81. win++; 82. 83. } 84. } 85. else 86. { 87. printf("输入坐标违法,请重新输入!\n"); 88. } 89. if (win == row * col - easycount) 90. { 91. printf("恭喜你,成功了!\n"); 92. break; 93. } 94. 95. } 96. }
test.c代码展示
1. #include <stdio.h> 2. #include "game.h" 3. 4. void game() 5. { 6. //创建数组 7. char mine[ROWS][COLS] = { 0 };//存放布置好雷的信息 8. char show[ROWS][COLS] = { 0 };//存放排查出雷的信息 9. 10. //初始化mine数组全为'0' 11. Initboard(mine, ROWS, COLS,'0'); 12. //初始化show数组全为'*' 13. Initboard(show,ROWS, COLS, '*'); 14. //打印数据 15. //displayboard(show, ROW, COL);//打印9*9 16. //displayboard(mine, ROW, COL); 17. //布置雷 18. Setmine(mine, ROW, COL); 19. displayboard(show, ROW, COL);//显示show 20. //排雷 21. Findmine(mine, show, ROW, COL); 22. } 23. 24. void menu() 25. { 26. printf("********************\n"); 27. printf("****** 1.play ******\n"); 28. printf("****** 0.exit ******\n"); 29. printf("********************\n"); 30. } 31. 32. void test() 33. { 34. int input = 0; 35. srand((unsigned int)time(NULL)); 36. do 37. { 38. menu(); 39. printf("请选择:->"); 40. scanf("%d", &input); 41. switch (input) 42. { 43. case 1: 44. game(); 45. break; 46. case 0: 47. printf("退出游戏\n"); 48. break; 49. default: 50. printf("输入错误,重新输入\n"); 51. break; 52. } 53. } while (input); 54. } 55. 56. 57. 58. int main() 59. { 60. test(); 61. return 0; 62. }