还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言编写的扫雷嬉戏源代码/*源程序*/ttinclude graphics.h ttincludestdlib.h ftincludedos.h ftdefineLEOxffOl ftdefineLEFTCLICK OxfflO^define LEFTDRAG0xffl9ttdefine MOUSEMOVE0xff08struct intnum;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/introundnum;/*统计格子四周有多少雷*/int flag;/*右键按下显示红旗的标记,0没有红旗标记,1有红旗标记*/}Mine
[10]
[10];int gameAGAIN=0;/*是否重来的变量*/int gamePLAY=O;/*是否是第一次玩嬉戏的标记*/int mineNUM;/*统计处理过的格子数*/char randmineNUM
[3];/*显示数字的字符串*/int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;void Initvoid;/*图形驱动*/void MouseOnvoid;/*鼠标光标显示*/void MouseOffvoid;/*鼠标光标隐藏*/voidMouseSetXYint,int;/*设置当前位置*/int Levoid;/*左键按下*/int RightPressvoid;/*鼠标右键按下*/void MouseGetXYvoid;/*得到当前位置*/void Controlvoid;/*嬉戏开场,重新,关闭*/void GameBegainvoid;/*嬉戏开场画面*/void DrawSmilevoid;/*画笑脸*/void DrawRedflagint,int;/*显示红旗*/void DrawEmpty int,int,int,int;/*两种空格子的显示*/void GameOvervoid;/*嬉戏完毕*/void GameWinvoid;/*显示成功*/int MineStatisticsint,int;/*统计每个格子四周的雷数*/int ShowWhiteint,int;/*显示无雷区的空白局部*/void GamePlayvoid;/*嬉戏过程*/void Closevoid;/*图形关闭*/void mainvoidelse/*鼠标按下的格子不是地雷*/MouseOff;Num=MineStatistics i,j;if Num=0/*四周没地雷就用递归算法来显示空白格子*/ShowWhitei,j;else/*按下格子四周有地雷*/{sprintf randmineNUM,Num;/*输出当前格子四周的雷数*/setcolor RED;outtextxy195+j*20,95+i*20,randmineNUM;mineNUM一;}MouseOnO;Mine[i][j].nuni=0;/*点过的格子四周雷数的数字变为0表示这个格子已经用过*/if mineNUM/*成功了*/{GameWin;break;if RightPress/*鼠标右键键盘按下*/MouseGetXY;if MouseX190MouseX390MouseY90MouseY290/*当前鼠标位置在格子范围内*/j=MouseX-190/20;/*x坐标*/i=MouseY-90/20;/*y坐标*/MouseOff;if Mine[i][j].flag==0Mine[i][j].num!=0/*原来没红旗现在显示红旗*/{DrawRedflagi,j;Mine[i][j].flag=l;elseif Mine[i][j].f lag=l/*有红旗标记再按右键就红旗消逝*/DrawEmpty i,j,0,8;Mine[i][j].flag=0;MouseOn;sleep1;Init;Control;Close;void Initvoid/*图形开场*/int gd=DETECT,gm;initgraphgd,gm,〃c:\\tc〃;void Closevoid/*图形关闭*/{closegraph;}___void MouseOnvoid/*鼠标光标显示*/_AX=0x01;geninterrupt0x33;}__void MouseOffvoid/*鼠标光标隐藏*/{_AX=0x02;geninterrupt0x33;void MouseSetXYintx,int y/*设置当前位置*/_CX=x;_DX=y;_AX=0x04;geninterrupt0x33;int Levoid/*鼠标左键按下*/_AX=0x03;geninterrupt0x33;return_BX1;~int RightPressvoid/*鼠标右键按下*/{_AX=0x03;geninterrupt0x33;return_BX2;void MouseGetXYvoid/*得到当前位置*/_AX=0x03;geninterrupt0x33;MouseX=_CX;MouseY=_DX;void Controlvoid/*嬉戏开场,重新,关闭*/int gameFLAG=l;/*嬉戏失败后推断是否重新开场的标记*/while1if gameFLAG/*嬉戏失败后没推断出重新开场或者退出嬉戏的话就接着推断*/{_GameBegainO;/*嬉戏初始画面*/GamePlay;/*详细嬉戏*/if gameAGAIN=l/*嬉戏中重新开场*/{gameAGAIN=0;continue;MouseOn;gameFLAG=0;ifLe/*推断是否重新开场*/MouseGetXY;ifMouseX280MouseX300MouseY65MouseY85{gameFLAG=l;continue;if kbhit/*推断是否按键退出*/break;MouseOff;}_void DrawSmilevoid/*画笑脸*/setfillstyleSOLID_FILL,YELLOW;fillellipse290,75,10,10;setcolorYELLOW;setfillstyleSOLID_FILL,BLACK;/*眼睛*/fillellipse285,75,2,2;fillellipse295,75,2,2;setcolor BLACK;/*嘴巴*/bar287,80,293,81;一void DrawRedflagint i,int j/*显示红旗*/setcolor7;setfillstyleSOLID_FILL,RED;bar198+j*20,95+i*20,198+j*20+5,95+i*20+5;setcolor BLACK;line198+j*20,95+i*20,198+j*20,95+i*20+10;}_void DrawEmpty int i,int j,int mode,int color/*两种空格子的显示*/|setcolorcolor;setfillstyleSOLID FILL,color;if mode=0/*没有单击过的大格子*/bar200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8;elseif mode==l/*单击过后显示空白的小格子*/bar200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7;}_void GameBegainvoid/*嬉戏开场画面*/{int i,j;cleardevice;if gamePLAY!=l MouseSetXY290,70;/*鼠标一开场的位置,并作为它的初始坐标*/MouseX=290;MouseY=70;}gamePLAY=l;/*下次按重新开场的话鼠标不重新初始化*/mineNUM=0;setfillstyleSOLID_FILL,7;bar190,60,390,290;for i=0;i10;i++/*画格子*/forj=0;j10;j++DrawEmpty i,j,0,8;setcolor7;DrawSmile;/*画脸*/randomize;for i=0;i10;i++A100个格子随机赋值有没有地雷*/forj=0;j10;j++Mine[i][j].num=random8;/*假如随机数的结果是1表示这个格子有地雷*/if Mine[i][j].num==lmineNUM++;/*现有雷数加1*/elseMine[i][j].num=2;Mine[i][j].flag=O;/*表示没红旗标记*/sprintf randmineNUM,〃%d〃,mineNUM;/*显示这次总共有多少雷数*/setcolor1;settextstyle0,0,2;outtextxy210,70,randmineNUM;mineNUM=100-inineNUM;/*变量取空白格数量*/MouseOn;}_void GameOvervoid/*嬉戏完毕画面*/{int i,j;setcolor0;for i=0;i10;i++forj=0;j10;j++if Mine[i][j].num=l/*显示全部的地雷*/DrawEmpty i,j,0,RED;setfillstyleSOLID FILL,BLACK;fillellipse200+j*20,100+i*20,7,7;}_void GameWinvoid/*显示成功*/{setcolor11;settextstyle0,0,2;outtextxy230,30,YOU WIN!;int MineStatisticsinti,int j/*统计每个格子四周的雷数*/int nNUM=0;if i=0j=0/*左上角格子的统计*/ifMine
[0]
[1].num==lnNUM++;ifMine[l]
[0].num==lnNUM++;ifMine
[1]
[1].num==lnNUM++;elseif i==0j==9/*右上角格子的统计*/{if Mine
[0]
[8].num=二1nNUM++;if Mine[l]
[9].num==l nNUM++;if Mine[l]
[8].num==l nNUM++;}elseif i==9j==0/*左下角格子的统计*/if Mine
[8]
[0].num-1nNUM++;if Mine
[9]
[1].num==l nNUM++;if Mine
[8]
[1].num==l nNUM++;}elseif i==9j==9/*右下角格子的统计*/{ifMine
[9]
[8].num==l nNUM++;if Mine
[8]
[9].num==l nNUM++;if Mine
[8]
[8].num==l nNUM++;else ifj=0/*左边第一列格子的统计*/if Mine[i][j+1].num==l nNUM++;if Mine[i+1][j].num==l nNUM++;if MineLi_lJ LjJ.num==l nNUM++;ifMine[i-l][j+1].num==l nNUM++;if Mine[i+1][j+1].num==l nNUM++;else ifj=9/*右边第一列格子的统计*/if Mine[i][j-1].num==lnNUM++;if Mine[i+1][j].num-l nNUM++;if Mine[i-1][j].num==l nNUM++;if Mine[i-1][j~l].num==lnNUM++;if Mine[i+1][j-l].num-1nNUM++;else if i=0/*第一行格子的统计*/if Mine[i+1][j].num==l nNUM++;if Mine[i][j-1].num==lnNUM++;if Mine[i][j+1].num-1nNUM++;if Mine[i+1][j-1].num==l nNUM++;if Mine[i+1][j+1].num==l nNUM++;else ifi=9/*最终一行格子的统计*/{if Mine[i-1][j].num==l nNUM++;if Mine[i][j-1].num==l nNUM++;if Mine[i][j+1].num==l nNUM++;if Mine[i-l][j-1].num==l nNUM++;if Mine[i-1][j+1].num==l nNUM++;else/*一般格子的统计*/if Mine[i-1][j].num==l nNUM++;if Mine[i-l][j+1].num==lnNUM++;if Mine[i][j+1].num==l nNUM++;if Mine[i+1][j+1].num==l nNUM++;if Mine[i+1][j].num==l nNUM++;ifMine[i+1][j-1].num==l nNUM++;if Mine[i][j-l].num-1nNUM++;if Mine[i-1][j-1].num==l nNUM++;returnnNUM;/*把格子四周一共有多少雷数的统计结果返回*/int ShowWhiteinti,int j/*显示无雷区的空白局部*/{if Mine[i][j].flag==l||Mine[i][j].num=0/*假如有红旗或该格处理过就不对该格进展任何推断*/return;mineNUM—;/*显示过数字或者空格的格子就表示多处理了一个格子,当全部格子都处理过了表示成功*/if Mine[i][j].roundnum==0Mine[i][j].num!=1/*显示空格*/{DrawEmptyi,j,1,7;Mine[i][j].num=0;elseif Mine[i][j].roundnum!=0/*输出雷数*/DrawEmptyi,j,0,8;sprintf randmineNUM,z/%dz/,Mine[i][j].roundnum;setcolor RED;outtextxy195+j*20,95+i*20,randmineNUM;Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/return;/*8个方向递归显示全部的空白格子*/ifi!=0Mine[i-l][j].num!=l ShowWhitei-l,j;ifi!=0j!=9Mine[i-1][j+1].num!=lShowWhitei-l,j+1;ifj!=9Mine[i][j+1].num!=lShowWhite i,j+1;ifj!=9i!=9Mine[i+l][j+1].num!=lShowWhitei+1,j+1;ifi!=9Mine[i+l][j].num!=lShowWhite i+1,j;ifi!=9j!=0Mine[i+l][j-1].num!=lShowWhitei+1,j-1;ifj!=0Mine[i][j-1].num!=lShowWhite i,j-1;ifi!=0j!=0Mine[i-l][j-1].num!=lShowWhitei-l,j-l;void GamePlayvoid/*嬉戏过程*/{inti,j,Num;/*Num用来接收统计函数返回一个格子四周有多少地雷*/fori=0;i10;i++forj=0;j10;j++Mine[i][j].roundnum=MineStatisticsi,j;/*统计每个格子四周有多少地雷*/while!kbhit{ifLe/*鼠标左键盘按下*/MouseGetXY;if MouseX280MouseX〈300MouseY〉65MouseY85/*重新来*/MouseOff;gameAGAIN=l;break;if MouseX190MouseX390MouseY90MouseY〈290/*当前鼠标位置在格子范围内*/j=MouseX-190/20;/*x坐标*/i=MouseY-90/20;Ay坐标*/if Mine[i][j].flag=l/*假如格子有红旗那么左键无效*/continue;if MineLiJLjJ.num!=0/*假如格子没有处理过*/{if Mine[i][j].num=l/*鼠标按下的格子是地雷*/MouseOff;GameOver;/*嬉戏失败*/break;。
个人认证
优秀文档
获得点赞 0