#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
int mine[100][100];
char show[100][100];
int MaxMine,ROW,COL,x,y,sum=0;
void init()
{
//*********************
int count = MaxMine;
//用随机数想mine数组中设置数量为 count 的雷区,mine数组中,雷区用 -1 表示
srand((unsigned)time(NULL));
while (count)
{
int x = rand() % (ROW - 2) + 1;
int y = rand() % (COL - 2) + 1;
if (mine[x][y] == 0)
{
mine[x][y] = -1;
count--;
}
}
//更新mine [][],这里主要是要遍历除-1外的每个位置,计算周围元素-1的个数
for(int i=1; i<ROW-1; i++)
for(int j=1; j<COL-1; j++)
if(mine[i][j]!=-1)
{
if(mine[i-1][j]==-1)
mine[i][j]++;
if(mine[i][j-1]==-1)
mine[i][j]++;
if(mine[i-1][j-1]==-1)
mine[i][j]++;
if(mine[i-1][j+1]==-1)
mine[i][j]++;
if(mine[i][j+1]==-1)
mine[i][j]++;
if(mine[i+1][j]==-1)
mine[i][j]++;
if(mine[i+1][j-1]==-1)
mine[i][j]++;
if(mine[i+1][j+1]==-1)
mine[i][j]++;
}
//初始化show数组,初始时全部显示方块
for(int i=1; i<ROW-1; i++)
for(int j=1; j<COL-1; j++)
show[i][j]='*';
}
void color(int m)//设置颜色
{
HANDLE consolehend;
consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehend, m);
}
void display_board()
{
//在显示给用户时,为了方便用户游戏,扫雷区域外需增设一个坐标系
int i, j;
printf(" ");
color(2);//横坐标系设为淡绿色
for (int i = 1; i < COL - 1; i++)
{
if(COL>=15){
if(i<10)
printf(" %d", i);
else
printf(" %d",i);
}else
{
printf(" %d",i);
}
}
printf("\n");
//由于扫雷游戏,显示给用户所使用的所有字符都是特殊字符,每个特殊字符占用两个普通字符的位置
for (i = 1; i < ROW - 1; i++)
{
//每行的纵坐标系也设置为淡绿色
color(2);
if(i<10)
printf("%d ", i);
else
printf("%d ", i);
//根据 show 数组中存储的字符的不同,分别用不同的有意义的特殊字符代替
for (j = 1; j < COL - 1; j++)
{
if(show[i][j]=='0')
{
color(8);
printf("%c ",show[i][j]);
}
else if(show[i][j]=='*')
{
color(7);
printf("%c ",show[i][j]);
}
else if(show[i][j]=='1')
{
color(6);
printf("%c ",show[i][j]);
}
else if(show[i][j]=='2')
{
color(3);
printf("%c ",show[i][j]);
}
else if(show[i][j]=='3')
{
color(4);
printf("%c ",show[i][j]);
}
else
{
color(5);
printf("%c ",show[i][j]);
}if(COL>=15)
printf(" ");
//根据show[][]每个元素具体值显示
//值:*未知,显示■;1~8周围雷数,显示数字;
//0表示周围没有雷,显示两个空格;字母‘o’表示雷,显示●表示爆炸
}
printf("\n");
}
}
void mine_sweep(int x,int y)
{
if(mine[x][y]==-1)
show[x][y]='@';//当前位置是雷
else if(mine[x][y]!=-1&&mine[x][y]!=0)
show[x][y]=mine[x][y]+'0';//mine里的数字(1-8)转换为字符(1-8)
else if(mine[x][y]==0)
get_empty(x,y); //是0的时候,要去找周围的空,这个函数后面介绍
}
void get_empty(int x,int y)
{
//递归出口,如果不在1-9范围了,退出
if (x>ROW-2||x<1||y>COL-2||y<1)
{
return;
}
//如果当前位置不是 *,说明该位置之前已经做过更新,无需再做一次。
if (show[x][y]!='*')
{
return;
}
//更新show数组中的数据(把mine中的数字0-8变为show中的字符0-8)
show[x][y] =mine[x][y]+'0';
//周围有雷区的位置时(位置上显示的为周围雷区的个数),即不再继续,否则的话,上下左右四个方向检查是否有空白
if (mine[x][y] != 0)
{
return;
}
get_empty( x + 1, y);
get_empty( x - 1, y);
get_empty( x, y + 1);
get_empty( x, y - 1);
}
int main()
{
printf("选择难度:\n");
printf("简单输入1,普通输入2,困难输入3\n");
int v;
scanf("%d",&v);
if(v==1)
{
ROW=11;COL=11;MaxMine=10;
printf("雷数:%d\n",MaxMine);
}
else if(v==2)
{
ROW=17;COL=17;MaxMine=25;
printf("雷数:%d\n",MaxMine);
}
else if(v==3)
{
ROW=22;COL=22;MaxMine=50;
printf("雷数:%d\n",MaxMine);
}
init();
display_board();
while(v)
{
color(7);
scanf("%d%d",&x,&y);
mine_sweep(x,y);
display_board();
sum=0;
if(mine[x][y]==-1)
{
color(4);
printf("哈哈哈,你踩到雷了");
color(7);
return 0;
}
for(int i=1; i<ROW-1; i++)
for(int j=1; j<COL-1; j++)
if(show[i][j]=='*')
sum++;
if(sum==MaxMine)
{
color(9);
printf("厉害啊,你赢了");
color(7);
return 0;
}
}
return 0;
}
简单的扫雷小游戏(c语言)
最新推荐文章于 2024-10-02 23:41:45 发布