扫雷游戏
源代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<time.h>
#define MINE_COUNT 2
#define ROW 3
#define COL 3
//我们需要设置两个二维数组
//一个表示地雷的雷阵,一个表示用户的显示界面
//扫雷的地图为9*9,但是我们需要给它加一个边框,把它定义为11*11的地图
//所以我们可以使用的地图为[1,ROW][1,COL]
// 对mine_map来说,0表示正常,1表示地雷
char mine_map [ROW + 2][COL + 2];
//对show_map来说,用*表示未打开的方格,已经打开的方格,用具体数字表示
char show_map [ROW + 2][COL + 2];
void Init(char mine_map[ROW + 2][COL + 2], char show_map[ROW + 2][COL + 2])
{
//1.初始化数组
int row = 0;
int col = 0;
//对于mine_map,要把它的每一个方格中填充‘0’
for (row = 1; row <= ROW; ++row){
for (col = 1; col <= COL; ++col)
{
mine_map[row][col] = '0';
}
}
//对于show_map,把它的每一个方格中填充‘*’
for (int row = 1; row <=ROW; ++row){
for (int col = 1; col <= COL; ++col)
{
show_map[row][col] = '*';
}
}
//2.随机布置雷阵
int mine_count = MINE_COUNT;
//利用时间设置随机地雷
srand(time(0));
while(mine_count>0)
{
row = rand() % ROW + 1;
col = rand() % COL + 1;
if (row<0 || row>ROW || col < 0 || col >COL){
continue;
}
mine_map[row][col] = '1';
mine_count--;
}
}
void DisplayMap(char Map[ROW + 2][COL + 2]){
//打印第一行的内容:四个空格+每一列的坐标
printf(" ");
for (int col = 0; col <= COL; ++col){
printf("%d| ", col);
}
printf("\n");
printf("------------\n");
//打印具体的地图
//打印第二行的内容:地图上的边框
for (int row = 1; row <= ROW; ++row){
printf(" %d| ", row);
for (int col = 1; col <= COL; ++col)
{
printf("%c| ", Map[row][col]);
}
printf("\n");
printf("------------\n");
}
}
//判断周围的雷数
void UpdateShowMap(char show_map[ROW + 2][COL + 2],int row,int col){
int count = 0;
if (mine_map[row - 1][col - 1] == '1')
count++;
if (mine_map[row - 1][col] == '1')
count++;
if (mine_map[row - 1][col + 1] == '1')
count++;
if (mine_map[row][col - 1] == '1')
count++;
if (mine_map[row][col + 1] == '1')
count++;
if (mine_map[row + 1][col - 1] == '1')
count++;
if (mine_map[row + 1][col] == '1')
count++;
if (mine_map[row + 1][col+1] == '1')
count++;
show_map[row][col] = count+'0';
}
void Game(){
//1.对两个地图(mine_map,show_map)进行初始化
int not_mine_count = 0;
Init(mine_map, show_map);
//2.先打印show_map
DisplayMap(show_map);
while (1){
//3.提示用户输入打开地图方格的位置[1,ROW][1,COL]
int row = 0;
int col = 0;
//用户可以输入的范围是[1,ROW][1,COL]
printf("请输入你要揭开的地图的位置坐标(row col)\n");
scanf("%d %d", &row, &col);
//4.对用户的合法性进行判断,如果不合理,提醒自己重新输入
if (row<1 || row>ROW || col<1 || col>COL)
{
printf("你所输入的有误,请重新输入!\n");
continue;
}
//5.判断玩家是否踩雷,踩雷游戏结束,并打印雷阵
if (mine_map[row][col] == '1'){
printf("游戏失败\n");
DisplayMap(mine_map);
break;
}
//6.判断此位置是否已经被揭开,如果被揭开,提示重新输入
//如果没有踩雷,判断玩家是否胜利
//(胜利的条件是揭开的方格数字=总的方格数字-雷数)
if (show_map[row][col] == '*'){
if (mine_map[row][col] == '0'){
++not_mine_count;
if (not_mine_count == (COL *ROW - MINE_COUNT)){
printf("玩家游戏胜利\n");
DisplayMap(mine_map);
break;
}
}
}
//7.如果没有胜利,需要统计当前位置的雷数,回到3
UpdateShowMap(show_map,row,col);
DisplayMap(show_map);
}
}
int main(){
Game();
return 0;
}
运行截图:
截图所示为3*3的扫雷游戏
博主太懒,所以放3*3的截图
如果想玩大一点地图的游戏,可以直接改宏定义
设置游戏的地图大小和雷阵中雷的数量
如何更改?
如下图:
MINE_COUNT 为设置的雷数量
ROW 和COL 为设置的游戏地图长宽