扫雷游戏:如果翻开的不是雷,那么以翻开的这个数字x为中心,周围会有x个雷
扫雷游戏详解:
1.我们先定义两个二维数组,一个用来展示用户翻开的数字,即面向用户的界面show_map[][]
一个用来布置雷阵,隐藏界面mine_map[][]
我们开始初始化这两个数组,并打印面向用户的界面数组show_map[][]
2.我们定义雷的个数,开始布置雷阵CreatMine();
3.我们提示用户输入坐标,如果坐标范围不合理,那么就提示用户输入错误,并且重新输入
我们再来判断该坐标是否是雷所在坐标,如果是雷所在坐标,我们就直接打印雷阵,即隐藏的界面mine_map[][],并跳出游戏循环
否则不是雷的个数就自增
我们再来判断用户是否扫雷成功,如果(不是雷的个数==总的个数-雷的个数),那么用户就胜利,并打印出所有的雷阵,并跳出游戏循环
否则,我们就要给该坐标赋值,(该坐标的值是多少呢?我们需要判断该坐标的周围八个坐标中共有 几个雷,然后把此值赋值给该坐标)并打印出show_map[][]
4. 再次循环步骤3,
下面是游戏的分解代码
1.我们把show_map[][]初始化为'*',mine_map[][]初始化为字符为'0',并打印出show_map[][],这里我们用了memset()函数,包含在头文件string.h中,memset(pointer,value,size)
void Init()
{
memset(mine_map, '0', (ROW + 2)*(COL + 2));
memset(show_map, '*', (ROW + 2)*(COL + 2));
Display(show_map);
}
Display(char map[ROW+2][COL+2])
{
printf(" ");
for (int row = 1; row <= ROW; row++)
{
printf(" %d", row);
}
printf("\n");
for (int row = 1; row <= ROW; row++)
{
printf("---");
}
printf("\n");
//布置颜色的代码块,使得用户可观感增强
for (int col = 1; col <= COL; col++)
{
if (g_color > 0)
{
if (g_color > 3)
{
system("color 0D");
}
else
{
system("color 0C");
}
}
else
{
system("color 08");
}
printf("%02d|", col);
for (int row = 1; row <= ROW; row++)
{
printf("%c ", map[col][row]);
}
printf("\n");
}
}
2.布置雷阵 ,我们先设定好雷的个数,然后选取随机坐标,我们用到了rand(),srand()函数
,rand()%m,表示从0到m-1的值
void CreatMine()
{
int mine_count = g_mine_count;
srand(time(0));
while (mine_count)
{
int row = rand() % 9 + 1;
int col = rand() % 9 + 1;
if (mine_map[row][col] == '0')
{
mine_map[row][col] = '1';
mine_count--;
}
}
}
3.提示用户输入坐标,如果坐标范围不合理,重新输入
int row;
int col;
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &row, &col);
if (row<0 || row>ROW || col<0 || col>COL)
{
printf("输入的坐标不合理,请重新输入\n");
continue;
}
break;
}
如果该坐标踩雷,打印雷阵,否则不是雷的个数自增
if (mine_map[row][col] == '1')
{
printf("游戏失败\n");
Display(mine_map);
g_color --;
break;
}
else
{
not_mine_count++;
}
如果游戏胜利,直接 打印所有的雷阵,否则给该坐标赋值
if (not_mine_count == ROW*COL - g_mine_count)
{
printf("游戏胜利\n");
g_color++;
Display(mine_map);
break;
}
else
{
show_map[row][col] = (mine_map[row - 1][col - 1] - '0') + (mine_map[row - 1][col] - '0') +
(mine_map[row - 1][col + 1] - '0') + (mine_map[row][col - 1] - '0')+
(mine_map[row - 1][col + 1] - '0') + (mine_map[row + 1][col - 1] - '0')+
(mine_map[row + 1][col] - '0') + (mine_map[row + 1][col + 1] - '0') + '0';
Display(show_map);
}
下面是游戏的源代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
char mine_map[ROW + 2][COL + 2];
char show_map[ROW + 2][COL + 2];
int g_mine_count = 10;
int not_mine_count = 0;
int g_color = 4;
//扫雷
//界面
//定义两个二维数组,ShowMap[][],MineMap[][],
//ShowMap[][]是给用户展示的界面,MineMap[][]是布置雷阵的
//初始化两个数组,
//进行游戏
Display(char map[ROW+2][COL+2])
{//布置颜色
printf(" ");
for (int row = 1; row <= ROW; row++)
{
printf(" %d", row);
}
printf("\n");
for (int row = 1; row <= ROW; row++)
{
printf("---");
}
printf("\n");
for (int col = 1; col <= COL; col++)
{
if (g_color > 0)
{
if (g_color > 3)
{
system("color 0D");
}
else
{
system("color 0C");
}
}
else
{
system("color 08");
}
printf("%02d|", col);
for (int row = 1; row <= ROW; row++)
{
printf("%c ", map[col][row]);
}
printf("\n");
}
}
void Init()
{
memset(mine_map, '0', (ROW + 2)*(COL + 2));
memset(show_map, '*', (ROW + 2)*(COL + 2));
Display(show_map);
}
void CreatMine()
{
int mine_count = g_mine_count;
srand(time(0));
while (mine_count)
{
int row = rand() % 9 + 1;
int col = rand() % 9 + 1;
if (mine_map[row][col] == '0')
{
mine_map[row][col] = '1';
mine_count--;
}
}
}
void Game()
{
//布置雷阵void Display(char map[ROW + 2][COL + 2])
CreatMine();
while (1)
{
int row;
int col;
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &row, &col);
if (row<0 || row>ROW || col<0 || col>COL)
{
printf("输入的坐标不合理,请重新输入\n");
continue;
}
break;
}
if (mine_map[row][col] == '1')
{
printf("游戏失败\n");
Display(mine_map);
g_color --;
break;
}
else
{
not_mine_count++;
}
if (not_mine_count == ROW*COL - g_mine_count)
{
printf("游戏胜利\n");
g_color++;
Display(mine_map);
break;
}
else
{
show_map[row][col] = (mine_map[row - 1][col - 1] - '0') + (mine_map[row - 1][col] - '0') +
(mine_map[row - 1][col + 1] - '0') + (mine_map[row][col - 1] - '0')+
(mine_map[row - 1][col + 1] - '0') + (mine_map[row + 1][col - 1] - '0')+
(mine_map[row + 1][col] - '0') + (mine_map[row + 1][col + 1] - '0') + '0';
Display(show_map);
}
}
}
//用户输入坐标
//坐标范围合理判定,不合理重新输入
//该坐标是否踩雷,踩雷,游戏失败,打印雷阵
//判断用户是否胜利,(如果用户翻开的个数等于总的个数减去雷的个数,那么用户胜利),如果用户胜利,则游戏胜利,打印雷阵
//如果用户并未胜利,那游戏继续,继续让用户输入坐标
//用户所输入坐标对应的数字是多少呢,这是由周围的雷的个数决定的
int menu()
{
printf("************************\n");
printf("1 开始游戏 0 退出游戏\n");
printf("************************\n");
printf("请输入选择:");
int choice;
scanf("%d", &choice);
return choice;
}
int main()
{
system("color 0B");
while (menu()==1)
{
Init();
Game();
}
system("pause");
return 0;
}