#include<graphics.h>
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.141592653
int thunder[22][22];
int a[9][2]={{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,0}};
void sort(int x)
{
setbkmode(TRANSPARENT);
setcolor(BROWN);
outtextxy(x+17,8,"剩");
outtextxy(x+17,28,"余");
outtextxy(x+17,48,"地");
outtextxy(x+17,68,"雷");
outtextxy(x+17,88,"数");
setcolor(CYAN);
outtextxy(x+17,160,"扫");
outtextxy(x+17,x-40,"雷");
setcolor(WHITE);
rectangle(x+2,110,x+48,140);
setfillstyle(WHITE);
floodfill(x+30,130,WHITE);
}
void number(int x,int k,int d)
{
char s[2];
sprintf(s,"%d",d-k);
setcolor(RED);
outtextxy(x+10,120,s);
}
void clearnumber(int x,int k,int d)
{
char s[2];
sprintf(s,"%d",d-k);
setcolor(WHITE);
outtextxy(x+10,120,s);
}
void draw_rectangle(int m,int n)
{
int i;
m=m*30+15,n=n*30+15;
for(i=1;i<=30;i++)
{
setcolor(RGB(0, 0, (i*8) << 1));
rectangle(m - (i >> 1), n - (i >> 1), m +(i >> 1), n + (i >> 1));
}
setcolor(LIGHTBLUE);
rectangle(m-15,n-15,m+15,n+15);
}
void init_thunder(int d,int q,int x1,int y1)
{
srand((unsigned)time(NULL));
int i,j,k,t=0;
x1=x1/30;
y1=y1/30;
for(i=0;i<q;i++)
for(j=0;j<q;j++)
thunder[i][j]=-1;
int n=0,m=0,x,y;
thunder[y1][x1]=0;
while(true)
{
t=0;
x=rand()%(q+1);
y=rand()%(q+1);
for(i=0;i<9;i++)
if(((y!=(x1+a[i][0]))||(x!=(y1+a[i][1])))&&thunder[x][y]==-1)t++;
if(t==9)
{
int t1=0;
for(i=0;i<8;i++)
if(thunder[x+a[i][0]][y+a[i][1]]==9)t1++;
if(t1<8)
{
thunder[x][y]=9;
n++;
t1=0;
}
}
if(n==d)break;
}
for(k=0;k<q;k++)
{
for(j=0;j<q;j++)
{
m=0;
if(thunder[k][j]!=9)
{
for(i=0;i<8;i++)
if((k+a[i][0])>=0&&(k+a[i][0])<q&&(j+a[i][1])>=0&&(j+a[i][1])<q&&thunder[k+a[i][0]][j+a[i][1]]==9)m++;
thunder[k][j]=m;
}
}
}
}
void red_flag(int m,int n)
{
m=m/30;
n=n/30;
m=m*30+18;
n=n*30+18;
setcolor(WHITE);
setlinestyle(PS_SOLID, NULL, 2);
line(m,n-12,m,n+10);
line(m-11,n+10,m+8,n+10);
setlinestyle(PS_SOLID, NULL, 1);
line(m-13,n+2,m,n+2);
line(m,n-12,m-13,n+2);
setfillstyle(RED);
floodfill(m-2,n-2,WHITE);
}
void end(int x)
{
setcolor(WHITE);
rectangle(x+2,x/2+58,x+48,x/2+78);
setfillstyle(WHITE);
floodfill(x+30,x/2+68,WHITE);
}
void show_end(int x,int d)
{
char s[2];
sprintf(s,"%d",d);
setcolor(RED);
outtextxy(x+23,x/2+61,s);
Sleep(1000);
setcolor(WHITE);
outtextxy(x+23,x/2+61,s);
}
void clear(int m,int n)
{
m=m/30;
n=n/30;
m=m*30+18;
n=n*30+18;
setfillstyle(WHITE);
floodfill(m,n,LIGHTBLUE);
}
void clear_zero(int m,int n,int q)
{
int i;
char s[2];
for(i=0;i<8;i++)
{
if((n/30+a[i][0])>=0&&(n/30+a[i][0])<q&&(m/30+a[i][1])>=0&&(m/30+a[i][1])<q)
{
if(thunder[n/30+a[i][0]][(m/30+a[i][1])]==0&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=WHITE)
{
if(getpixel((m/30+a[i][1])*30+16,(n/30+a[i][0])*30+16)!=RED)clear((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10);
clear_zero((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10,q);
}
else if(thunder[n/30+a[i][0]][(m/30+a[i][1])]!=9&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=WHITE&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=BROWN&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=BLUE&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=DARKGRAY&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=GREEN&&getpixel((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10)!=MAGENTA)
{
clear((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10);
if(thunder[n/30+a[i][0]][m/30+a[i][1]]==1)setcolor(BROWN);
else if(thunder[n/30+a[i][0]][m/30+a[i][1]]==2)setcolor(BLUE);
else if(thunder[n/30+a[i][0]][m/30+a[i][1]]==3)setcolor(DARKGRAY);
else if(thunder[n/30+a[i][0]][m/30+a[i][1]]==4)setcolor(MAGENTA);
else if(thunder[n/30+a[i][0]][m/30+a[i][1]]>=5)setcolor(GREEN);
setbkmode(TRANSPARENT);
sprintf(s,"%d",thunder[n/30+a[i][0]][(m/30+a[i][1])]);
outtextxy((m/30+a[i][1])*30+10,(n/30+a[i][0])*30+10,s);
}
}
}
}
void start(int q)
{
int i,j;
for(i=0;i<q;i++)
for(j=0;j<q;j++)
draw_rectangle(i,j);
}
void cryface(int m,int n)
{
m=(int)m/30;
n=(int)n/30;
m=m*30+15;
n=n*30+15;
setcolor(0);
setfillstyle(YELLOW);
fillcircle(m,n,14);
arc(m-9,n-10,m-3,n-4,PI,0);
arc(m+9,n-10,m+3,n-4,0,PI);
arc(m-7,n+10,m+7,n+6,0,PI);
}
void main()
{
A: int x=0,n=0,d=0,q=0;
printf("请输入n表示难度(5>=n>=1): ");
scanf("%d",&n);
if(1>n)n=1;
else if(n>5)n=5;
if(n==1)
{
x=9*30;
q=9;
d=10;
}
else if(n==2)
{
x=13*30;
q=13;
d=25;
}
else if(n==3)
{
x=16*30;
q=16;
d=40;
}
else if(n==4)
{
x=20*30;
q=20;
d=73;
}
else if(n==5)
{
x=22*30;
q=22;
d=99;
}
printf("\n所选的难度中含有%d个雷,第一次不会挖到地雷哦~~\n\n按任意键继续游戏",d);
getch();
system("cls");
initgraph(x+50,x);
E: int x2=x;
int k=0,t,z=q*q;
int i,j,p=0,y=0,y1=0;
int a=1,b=1;
char s[2];
start(q);
MOUSEMSG m;
FlushMouseMsgBuffer();
sort(x);
number(x,p,d);
while(true)
{
D: m=GetMouseMsg();
if(m.x<x&&y1==0&&m.uMsg==WM_LBUTTONDOWN)
{
init_thunder(d,q,m.x,m.y);
y1++;
}
if(m.x<x&&m.uMsg==WM_RBUTTONDOWN&&getpixel(((int)m.x/30)*30+16,((int)m.y/30)*30+16)!=RED&&getpixel(((int)m.x/30)*30+16,((int)m.y/30)*30+16)!=YELLOW&&getpixel(((int)m.x/30)*30+8,((int)m.y/30)*30+8)!=WHITE)
{
clearnumber(x,p,d);
p++;
red_flag(m.x,m.y);
if(thunder[m.y/30][m.x/30]==9)k++;
number(x,p,d);
}
else if(m.x<x&&m.uMsg==WM_RBUTTONDOWN&&getpixel(((int)m.x/30)*30+16,((int)m.y/30)*30+16)==RED)
{
clearnumber(x,p,d);
p--;
draw_rectangle(m.x/30,m.y/30);
if(thunder[m.y/30][m.x/30]==9)k--;
number(x,p,d);
}
if(m.x<x&&m.uMsg==WM_LBUTTONDOWN&&getpixel(((int)m.x/30)*30+16,((int)m.y/30)*30+16)!=RED)
{
if(y==0&&thunder[m.y/30][m.x/30]==9)goto E;
y++;
clear(m.x,m.y);
if(thunder[m.y/30][m.x/30]!=9)
{
if(thunder[m.y/30][m.x/30]==0)clear_zero(m.x,m.y,q);
else
{
if(thunder[m.y/30][m.x/30]==1)setcolor(BROWN);
else if(thunder[m.y/30][m.x/30]==2)setcolor(BLUE);
else if(thunder[m.y/30][m.x/30]==3)setcolor(45);
else if(thunder[m.y/30][m.x/30]==4)setcolor(MAGENTA);
else if(thunder[m.y/30][m.x/30]>=5)setcolor(RED);
setbkmode(TRANSPARENT);
sprintf(s,"%d",thunder[m.y/30][m.x/30]);
outtextxy(((int)m.x/30)*30+10,((int)m.y/30)*30+10,s);
}
}
else if(thunder[m.y/30][m.x/30]==9)
{
cryface(m.x,m.y);
for(i=0;i<q;i++)
{
for(j=0;j<q;j++)
if(thunder[i][j]==9)
{
if(getpixel(j*30+15,i*30+15)==RED)t=0;
clear(j*30+15,i*30+15);
cryface(j*30+15,i*30+15);
if(t==0)
{
red_flag(j*30+15,i*30+15);
t=-1;
}
}
}
int x1=9;
end(x);
while(x1)
{
show_end(x,x1);
x1--;
}
clearcliprgn();
closegraph();
printf("很遗憾你挖到地雷了!还想再来一局吗Y/N?");
C: char d;
d=getch();
if(d=='y')
{
setfont(0,0,"楷体");
system("cls");
goto A;
}
else if(d=='n')break;
else goto C;
}
}
if(k==d&&k==p)
{
int x0=0;
for(int x=0;x<q;x++)
{
for(int y=0;y<q;y++)
{
if(getpixel(x*30+16,y*30+16)!=GREEN&&getpixel(x*30+16,y*30+16)!=MAGENTA&&getpixel(x*30+16,y*30+16)!=BLUE&&getpixel(x*30+16,y*30+16)!=RED&&getpixel(x*30+16,y*30+16)!=WHITE&&getpixel(x*30+16,y*30+16)!=BROWN&&getpixel(x*30+16,y*30+16)!=DARKGRAY)
{
x0=-1;
break;
}
}
if(x0==-1)break;
}
if(x0==-1)goto D;
int x1=3;
end(x2);
while(x1)
{
show_end(x2,x1);
x1--;
}
clearcliprgn();
closegraph();
pri