C语言扫雷游戏课计.docx
《C语言扫雷游戏课计.docx》由会员分享,可在线阅读,更多相关《C语言扫雷游戏课计.docx(15页珍藏版)》请在冰豆网上搜索。
C语言扫雷游戏课计
#include
#include
#include
#defineLEFTPRESS0xff01
#defineLEFTCLICK0xff10
#defineLEFTDRAG0xff19
#defineMOUSEMOVE0xff08
struct
{
intnum;
introundnum;
intflag;
}Mine[10][10];
intgameAGAIN=0;
intgamePLAY=0;
intmineNUM;
charrandmineNUM[3];
intKeystate;
intMouseExist;
intMouseButton;
intMouseX;
intMouseY;
voidInit(void);
voidMouseOn(void);
voidMouseOff(void);
voidMouseSetXY(int,int);
intLeftPress(void);
intRightPress(void);
voidMouseGetXY(void);
voidControl(void);
voidGameBegain(void);
voidDrawSmile(void);
voidDrawRedflag(int,int);
voidDrawEmpty(int,int,int,int);
voidGameOver(void);
voidGameWin(void);
intMineStatistics(int,int);
intShowWhite(int,int);
voidGamePlay(void);
voidClose(void);
voidmain(void)
{
Init();
Control();
Close();
}
voidInit(void)
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
}
voidClose(void)
{
closegraph();
}
voidMouseOn(void)
{
_AX=0x01;
geninterrupt(0x33);
}
voidMouseOff(void)
{
_AX=0x02;
geninterrupt(0x33);
}
voidMouseSetXY(intx,inty)
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
intLeftPress(void)
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}
intRightPress(void)
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}
voidMouseGetXY(void)
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
voidControl(void)
{
intgameFLAG=1;
while
(1)
{
if(gameFLAG)
{
GameBegain();
GamePlay();
if(gameAGAIN==1)
{
gameAGAIN=0;
continue;
}
}
MouseOn();
gameFLAG=0;
if(LeftPress())
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
{
gameFLAG=1;
continue;
}
}
if(kbhit())
break;
}
MouseOff();
}
voidDrawSmile(void)
{
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);
bar(287,80,293,81);
}
voidDrawRedflag(inti,intj)
{
setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);
}
voidDrawEmpty(inti,intj,intmode,intcolor)
{
setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
}
voidGameBegain(void)
{
inti,j;
cleardevice();
if(gamePLAY!
=1)
{
MouseSetXY(290,70);
MouseX=290;
MouseY=70;
}
gamePLAY=1;
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();
randomize();
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
Mine[i][j].num=random(8);
if(Mine[i][j].num==1)
mineNUM++;
else
Mine[i][j].num=2;
Mine[i][j].flag=0;
}
sprintf(randmineNUM,"%d",mineNUM);
setcolor
(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;
MouseOn();
}
voidGameOver(void)
{
inti,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(Mine[i][j].num==1)
{
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);
}
}
voidGameWin(void)
{
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOUWIN!
");
}
intMineStatistics(inti,intj)
{
intnNUM=0;
if(i==0&&j==0)
{
if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;
}
else
if(i==0&&j==9)
{
if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;
}
else
if(i==9&&j==0)
{
if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;
}
else
if(i==9&&j==9)
{
if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;
}
elseif(j==0)
{
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
elseif(j==9)
{
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
}
elseif(i==0)
{
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
elseif(i==9)
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
}
else
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
}
return(nNUM);
}
intShowWhite(inti,intj)
{
if(Mine[i][j].flag==1||Mine[i][j].num==0)
return;
mineNUM--;
if(Mine[i][j].roundnum==0&&Mine[i][j].num!
=1)
{
DrawEmpty(i,j,1,7);
Mine[i][j].num=0;
}
else
if(Mine[i][j].roundnum!
=0)
{
DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;
return;
}
if(i!
=0&&Mine[i-1][j].num!
=1)
ShowWhite(i-1,j);
if(i!
=0&&j!
=9&&Mine[i-1][j+1].num!
=1)
ShowWhite(i-1,j+1);
if(j!
=9&&Mine[i][j+1].num!
=1)
ShowWhite(i,j+1);
if(j!
=9&&i!
=9&&Mine[i+1][j+1].num!
=1)
ShowWhite(i+1,j+1);
if(i!
=9&&Mine[i+1][j].num!
=1)
ShowWhite(i+1,j);
if(i!
=9&&j!
=0&&Mine[i+1][j-1].num!
=1)
ShowWhite(i+1,j-1);
if(j!
=0&&Mine[i][j-1].num!
=1)
ShowWhite(i,j-1);
if(i!
=0&&j!
=0&&Mine[i-1][j-1].num!
=1)
ShowWhite(i-1,j-1);
}
voidGamePlay(void)
{
inti,j,Num;/*Num
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);
while(!
kbhit())
{
if(LeftPress())
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
{
MouseOff();
gameAGAIN=1;
break;
}
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)
{
j=(MouseX-190)/20;
i=(MouseY-90)/20;
if(Mine[i][j].flag==1)
continue;
if(Mine[i][j].num!
=0)
{
if(Mine[i][j].num==1)
{
MouseOff();
GameOver();
break;
}
Else
{
MouseOff();
Num=MineStatistics(i,j);
if(Num==0)
ShowWhite(i,j);
Else
{
sprintf(randmineNUM,"%d",Num);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;
}
MouseOn();
Mine[i][j].num=0;
if(mineNUM<1)
{
GameWin();
break;
}
}
}
}
}
if(RightPress())
{
MouseGetXY();
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)
{
j=(MouseX-190)/20;
i=(MouseY-90)/20;
MouseOff();
if(Mine[i][j].flag==0&&Mine[i][j].num!
=0)
{
DrawRedflag(i,j);
Mine[i][j].flag=1;
}
else
if(Mine[i][j].flag==1)
{
DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;
}
}
MouseOn();
sleep
(1);
}
}
}