当前位置:   article > 正文

【c语言】:扫雷游戏(超详细教程)_c语言扫雷游戏

c语言扫雷游戏


前言

扫雷游戏作为一个经典游戏想必大家都玩过吧,本篇文章将通过c语言来实现这个游戏

一、扫雷游戏规则

在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),游戏进行的过程中没有踩到地雷且找到所有的地雷,游戏才算成功。 

二、代码思路

1.游戏菜单(menu)

首先我们要有一个进入游戏的菜单

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

2.定义游戏函数

定义游戏函数:这里定义两个数组,一个数组用来布置地雷另一个数组用来给玩家展示

  1. void game() {
  2. char mine[Rows][Cols];
  3. char show[Rows][Cols];
  4. InitBoard(mine, Rows, Cols, '0');//棋盘初始化
  5. InitBoard(show, Rows, Cols, '*');
  6. DisplayBoard(show, Row, Col);//打印棋盘
  7. SetMine(mine, Row, Col);//布置地雷
  8. FindMine(mine, show, Row, Col);//找地雷
  9. }

3.主函数

主函数:通过do while语句和switch语句来实现这个游戏

  1. int main()
  2. {
  3. srand((unsigned int)time(NULL));//rand函数在生成随机数之前要用srand函数设置随机数生成器
  4. int input = 0;
  5. do {
  6. menu();
  7. printf("请选择:___");
  8. scanf("%d", &input);
  9. switch (input) {
  10. case 1:
  11. game();
  12. break;
  13. case 0:
  14. printf("退出游戏");
  15. break;
  16. default:
  17. printf("输入错误请重新输入");
  18. break;
  19. }
  20. } while (input);
  21. return 0;
  22. }

4.初始化棋盘

将mine棋盘上的数组全部初始化为0,将show棋盘上的数组初始化为*

  1. void InitBoard(char board[Rows][Cols], int rows, int cols,char set) {
  2. int i = 0;
  3. int j = 0;
  4. for (i = 0; i < rows; i++) {
  5. for (j = 0; j < cols; j++) {
  6. board[i][j] = set;
  7. }
  8. }
  9. }

 5.打印棋盘

棋盘初始化后将棋盘打印出来

  1. void DisplayBoard(char board[Rows][Cols], int row, int col) {
  2. int i = 0;
  3. int j = 0;
  4. printf("---------- 扫雷 -----------\n");
  5. for (i = 0; i <= col; i++) {
  6. printf("%d ", i);
  7. }
  8. printf("\n");
  9. for (i = 1; i <= row; i++) {
  10. printf("%d ", i);
  11. for (j = 1; j <= col; j++) {
  12. printf("%c ", board[i][j]);
  13. }
  14. printf("\n");
  15. }
  16. printf("---------- 扫雷 -----------\n");
  17. }

 

 6.布置地雷

打印完棋盘后开始随机的在棋盘上布置地雷(布置在mine数组上)

  1. void SetMine(char board[Rows][Cols], int row, int col) {
  2. int count = EASY;
  3. while (count) {
  4. int x = rand() % row + 1;
  5. int y = rand() % col + 1;
  6. if (board[x][y] == '0') {
  7. board[x][y] = '1';
  8. count--;
  9. }
  10. }
  11. }

7.查找地雷

布置完地雷后就可以开始查找了

  1. void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) {
  2. int x = 0;
  3. int y = 0;
  4. int win = 0;
  5. while (win<Row*Col-EASY) {
  6. printf("请输入坐标:");
  7. scanf("%d %d", &x, &y);
  8. if (x >= 1 && x <= row && y >= 1 && y <= col) {
  9. if (mine[x][y] == '1') {
  10. printf("炸死了\n");
  11. DisplayBoard(mine, Row, Col);
  12. break;
  13. }
  14. else//统计周围有几个地雷
  15. {
  16. int sum=GetMineCount(mine, x, y);
  17. show[x][y] = sum + '0';//1+'0'='1'
  18. DisplayBoard(show, Row, Col);
  19. win++;
  20. }
  21. }
  22. else {
  23. printf("坐标错误重新输入");
  24. }
  25. }
  26. if (win == Row * Col - EASY) {
  27. printf("恭喜你排雷成功");
  28. DisplayBoard(mine, Row, Col);
  29. }
  30. }

 GetMineCount函数的实现

GetMineCount函数用来计算查找坐标周围的地雷数量

  1. int GetMineCount(char mine[Rows][Cols], int x, int y) {
  2. 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';
  3. }

三.模块化代码的实现

模块化编程的思想是:根据功能将工程划分为不同模块。主函数只调用函数,而不定义函数。在各模块文件中定义功能函数,并将要用到的函数利用同名头文件申明外部函数供其他文件调用

1.game.h 

头文件:关于游戏包含的函数声明,符号声明头文件的包含以及宏定义

  1. #pragma once
  2. #include<stdio.h>
  3. #include<time.h>
  4. #include<stdlib.h>
  5. #define Row 9
  6. #define Col 9
  7. #define Rows Row+2
  8. #define Cols Col+2
  9. #define EASY 10
  10. void InitBoard(char board[Rows][Cols], int rows, int cols,char set);//初始化棋盘
  11. void DisplayBoard(char board[Rows][Cols],int row,int col);//打印棋盘
  12. void SetMine(char board[Rows][Cols], int row, int col);//布置地雷
  13. void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col);//找地雷

 2.game.c

游戏相关的函数定义

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "game.h"
  3. void InitBoard(char board[Rows][Cols], int rows, int cols,char set) {
  4. int i = 0;
  5. int j = 0;
  6. for (i = 0; i < rows; i++) {
  7. for (j = 0; j < cols; j++) {
  8. board[i][j] = set;
  9. }
  10. }
  11. }
  12. void DisplayBoard(char board[Rows][Cols], int row, int col) {
  13. int i = 0;
  14. int j = 0;
  15. printf("---------- 扫雷 -----------\n");
  16. for (i = 0; i <= col; i++) {
  17. printf("%d ", i);
  18. }
  19. printf("\n");
  20. for (i = 1; i <= row; i++) {
  21. printf("%d ", i);
  22. for (j = 1; j <= col; j++) {
  23. printf("%c ", board[i][j]);
  24. }
  25. printf("\n");
  26. }
  27. printf("---------- 扫雷 -----------\n");
  28. }
  29. void SetMine(char board[Rows][Cols], int row, int col) {
  30. int count = EASY;
  31. while (count) {
  32. int x = rand() % row + 1;
  33. int y = rand() % col + 1;
  34. if (board[x][y] == '0') {
  35. board[x][y] = '1';
  36. count--;
  37. }
  38. }
  39. }
  40. int GetMineCount(char mine[Rows][Cols], int x, int y) {
  41. 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';
  42. }
  43. void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) {
  44. int x = 0;
  45. int y = 0;
  46. int win = 0;
  47. while (win<Row*Col-EASY) {
  48. printf("请输入坐标:");
  49. scanf("%d %d", &x, &y);
  50. if (x >= 1 && x <= row && y >= 1 && y <= col) {
  51. if (mine[x][y] == '1') {
  52. printf("炸死了\n");
  53. DisplayBoard(mine, Row, Col);
  54. break;
  55. }
  56. else//统计周围有几个地雷
  57. {
  58. int sum=GetMineCount(mine, x, y);
  59. show[x][y] = sum + '0';//1+'0'='1'
  60. DisplayBoard(show, Row, Col);
  61. win++;
  62. }
  63. }
  64. else {
  65. printf("坐标错误重新输入");
  66. }
  67. }
  68. if (win == Row * Col - EASY) {
  69. printf("恭喜你排雷成功");
  70. DisplayBoard(mine, Row, Col);
  71. }
  72. }

 3.test.c

扫雷游戏的整体逻辑

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "game.h"
  3. void menu() {
  4. printf("****************\n");
  5. printf("*****1.play*****\n");
  6. printf("*****0.exit*****\n");
  7. printf("****************\n");
  8. }
  9. void game() {
  10. char mine[Rows][Cols];
  11. char show[Rows][Cols];
  12. InitBoard(mine, Rows, Cols, '0');
  13. InitBoard(show, Rows, Cols, '*');
  14. DisplayBoard(mine, Row, Col);
  15. DisplayBoard(show, Row, Col);
  16. SetMine(mine, Row, Col);
  17. //DisplayBoard(mine, Row, Col);
  18. FindMine(mine, show, Row, Col);
  19. }
  20. int main()
  21. {
  22. srand((unsigned int)time(NULL));
  23. int input = 0;
  24. do {
  25. menu();
  26. printf("请选择:___");
  27. scanf("%d", &input);
  28. switch (input) {
  29. case 1:
  30. game();
  31. break;
  32. case 0:
  33. printf("退出游戏");
  34. break;
  35. default:
  36. printf("输入错误请重新输入");
  37. break;
  38. }
  39. } while (input);
  40. return 0;
  41. }

 四.运行结果

这里演示游戏失败的运行结果

通关游戏的运行结果没有演示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/921210
推荐阅读
相关标签
  

闽ICP备14008679号