扫雷小游戏

Posted cuckoo-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫雷小游戏相关的知识,希望对你有一定的参考价值。

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 
  6 #define ROW 9
  7 #define COL 9
  8 #define MINE_COUNT 10
  9 
 10 int Menu()
 11 {
 12     printf("=======================
");
 13     printf("1.开始游戏
");
 14     printf("0.结束游戏
");
 15     printf("=======================
");
 16     int choice = 0;
 17     printf("请输入您的选择!
");
 18     scanf("%d", &choice);
 19     return choice;
 20 }
 21 
 22 void Init(char mine_map[ROW + 2][COL + 2],
 23     char show_map[ROW + 2][COL + 2])
 24 {
 25     //1.show_map都初始化成 * (表示没有翻开的位置)
 26     for (int row = 0;row < ROW + 2;++row)
 27     {
 28         for (int col = 0;col < COL + 2;++col)
 29         {
 30             show_map[row][col] = *;
 31         }
 32     }
 33     //2.mine_map都初始化为‘0‘
 34     for (int row = 0;row < ROW + 2;++row)
 35     {
 36         for (int col = 0;col < COL + 2;++col)
 37         {
 38             mine_map[row][col] = 0;
 39         }
 40     }
 41     //除了上面的方法还可以:利用memset对一段连续的内存空间进行赋值
 42     //二维数组也是在一个连续的内存空间上
 43     //memset(mine_map, ‘0‘, (ROW + 2)*(COL + 2));
 44     //memset(show_map, ‘*‘, (ROW + 2)*(COL + 2));
 45 
 46     //3.对mine_map进行雷阵的布置
 47     int mine_count = MINE_COUNT;
 48     while (mine_count > 0)
 49     {
 50         //这个循环尝试进行布雷,每次布置成功一个则mine_count--
 51         //magice number
 52         int row = rand() % 9 + 1;
 53         int col = rand() % 9 + 1;
 54         if (mine_map[ROW][COL] == 1)
 55         {
 56             continue;
 57         }
 58         //当前位置可以用来设置地雷
 59         mine_map[row][col] = 1;
 60         --mine_count;
 61     }
 62     return;
 63 }
 64 
 65 void DisplayMap(char map[ROW + 2][COL + 2])
 66 {
 67     //先打印四个空格
 68     printf("    ");
 69     //打印列的坐标
 70     for (int i = 1;i <= COL;++i)
 71     {
 72         printf("%d ", i);
 73     }
 74     printf("
");
 75     //第一行打印完成
 76     //这里打印上边框
 77     for (int i = 1;i <= COL;++i)
 78     {
 79         printf("---");
 80     }
 81     printf("
");
 82     //打印棋盘的每一行,注意,每一行最前面的要带上行号
 83     for (int row = 1;row <= ROW;++row)
 84     {
 85         printf("  %d|", row);
 86         for (int col = 1;col <= COL;++col)
 87         {
 88             printf("%c ", map[row][col]);
 89         }
 90         printf("
");
 91     }
 92 }
 93 
 94 void UpdateShowMap(char mine_map[ROW + 2][COL + 2],
 95     char show_map[ROW + 2][COL + 2], int row, int col)
 96 {
 97     //每次翻开一个格子的时候,如果这个格子不是雷,就需要跟新show_map
 98     //把当前位置替换成一个数字(数字就表示了当前位置周围8个格子中有几个地雷)
 99     int mine_count =
100         (mine_map[row - 1][col - 1] - 0)
101         + (mine_map[row - 1][col] - 0)
102         + (mine_map[row - 1][col + 1] - 0)
103         + (mine_map[row][col - 1] - 0)
104         + (mine_map[row][col + 1] - 0)
105         + (mine_map[row + 1][col - 1] - 0)
106         + (mine_map[row + 1][col] - 0)
107         + (mine_map[row + 1][col + 1] - 0);
108     //由于show_map中都是字符,需要把这个数字转换为字符
109     show_map[row][col] = mine_count + 0;
110 }
111 
112 void Game()
113 {
114     printf("‘0‘表示没有地雷,‘1‘表示有地雷
");
115     //1.设定一个二维数组,作为表示地雷的地图,‘0‘表示没有地雷,‘1‘表示有地雷
116     //  设定一个二维数组,作为给玩家看的地图,每个位置是否被翻开,如果翻开
117     //在此处加了2表示加了一圈边框:
118     char mine_map[ROW + 2][COL + 2];
119     char show_map[ROW + 2][COL + 2];
120     //2.对地图进行初始化(包含布置地雷的过程)
121     Init(mine_map, show_map);
122     int blank_not_mine_count = 0;//不是雷的个数
123                                  //3.先打印一下初始地图
124     DisplayMap(show_map);
125     while (1)
126     {
127         //4.提示玩家输入一组坐标,并且对玩家输入进行合法性检查
128         printf("请输入一组坐标(row col):");
129         int row = 0;
130         int col = 0;
131         scanf("%d %d", &row, &col);
132         //row,col的有效范围[1,row][1,col]地图上有边框
133         if (row<1 || row>ROW || col<1 || col>COL)
134         {
135             printf("您输入的坐标非法,请重新输入:
");
136             continue;
137         }
138         //5.提示玩家翻开的位置是否是地雷,如果是地图就游戏结束
139         if (mine_map[row][col] == 1)
140         {
141             printf("您踩雷了,游戏结束!
");
142             //玩家踩雷后,需要告诉玩家当前地图上都有哪些位置是地雷
143             DisplayMap(mine_map);
144             break;
145         }
146         //6.如果当前位置已经把最后一个不是雷的位置翻开了,游戏结束,玩家胜利
147         ++blank_not_mine_count;
148         if (blank_not_mine_count == ROW * COL - MINE_COUNT)
149         {
150             printf("扫雷成功!
");
151             DisplayMap(mine_map);
152             break;
153         }
154         //7.把这个位置翻开,并计算当前位置周围8个格子中包含几个雷
155         UpdateShowMap(mine_map, show_map, row, col);
156         DisplayMap(show_map);
157         //回到3循环执行
158 
159     }
160 
161 }
162 
163 int main()
164 {
165     while (1)
166     {
167         int choice = Menu();
168         if (choice == 1)
169         {
170             Game();
171         }
172         else
173         {
174             printf("Goodbye!
");
175             break;
176         }
177     }
178 
179 
180 
181     return 0;
182 }

 

以上是关于扫雷小游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言游戏超详解扫雷游戏完整版,细节满满!!

C语言游戏超详解扫雷游戏完整版,细节满满!!

运用HTML+CSS+JavaScript实现扫雷游戏

运用HTML+CSS+JavaScript实现扫雷游戏

C语言扫雷小游戏的实现(附详细代码)

用Python写扫雷游戏实例代码分享还有很多小游戏代码