c语言小游戏代码扫雷代码.docx
《c语言小游戏代码扫雷代码.docx》由会员分享,可在线阅读,更多相关《c语言小游戏代码扫雷代码.docx(16页珍藏版)》请在冰豆网上搜索。
c语言小游戏代码扫雷代码
#include
#include
#include
#defineLEFTPRESS0xff01
#defineLEFTCLICK0xff10
#defineLEFTDRAG0xff19
#defineMOUSEMOVE0xff08
struct
{
intnum。
/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/
introundnum。
/*统计格子周围有多少雷*/
intflag。
/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/
}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>/*两种空格子的显示*/b5E2RGbCAP
{
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++>
/*100个格子随机赋值有没有地雷*/
for(j=0。
j<10。
j++>
{
Mine[i][j].num=random(8>。
/*如果随机数的结果是1表示这个格子有地雷*/
if(Mine[i][j].num==1>
mineNUM++。
/*现有雷数加1*/
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>g
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>/*如果有红旗或该格处理过就不对该格进行任何判断*/p1EanqFDPw
return。
mineNUM--。
/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/DXDiTa9E3d
if(Mine[i][j].roundnum==0&&Mine[i][j].num!
=1>/*显示空格*/RTCrpUDGiT
{
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。
/*已经输出雷数的格子用0表示已经用过这个格子*/
return。
}
/*8个方向递归显示所有的空白格子*/
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>。
/*统计每个格子周围有多少地雷*/5PCzVD7HxA
while(!
kbhit(>>
{
if(LeftPress(>>/*鼠标左键盘按下*/
{
MouseGetXY(>。
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85>/*重新来*/jLBHrnAILg
{
MouseOff(>。
gameAGAIN=1。
break。
}
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290>/*当前鼠标位置在格子范围内*/xHAQX74J0X
{
j=(MouseX-190>/20。
/*x坐标*/
i=(MouseY-90>/20。
/*y坐标*/
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。
/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/
if(mineNUM<1>/*胜利了*/
{
GameWin(>。
break。
}
}
}
}
}
if(RightPress(>>/*鼠标右键键盘按下*/
{
MouseGetXY(>。
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290>/*当前鼠标位置在格子范围内*/LDAYtRyKfE
{
j=(MouseX-190>/20。
/*x坐标*/
i=(MouseY-90>/20。
/*y坐标*/
MouseOff(>。
if(Mine[i][j].flag==0&&Mine[i][j].num!
=0>/*本来没红旗现在显示红旗*/Zzz6ZB2Ltk
{
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>。
}
}
}