《扫雷源代码 .docx》由会员分享,可在线阅读,更多相关《扫雷源代码 .docx(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精品名师归纳总结/* 源程序 */#include / 图形函数库#include #include #define LEFTPRESS 0xff01 / 鼠标左键#define LEFTCLICK 0xff10 /左键单击#define LEFTDRAG 0xff19 #define MOUSEMOVE 0xff08 struct int num;/* 格子当前处于什么状态,1 有雷, 0 已经显示过数字或者空白格*/int roundnum;/* 统计格子四周有多少雷*/int flag;/* 右键按下显示红旗的标志,0 没有红旗标志 ,1 有红旗标志 */Mine1010;int gam
2、eAGAIN=0;/*是否重来的变量 */int gamePLAY=0;/* 是否是第一次玩嬉戏的标志*/ int mineNUM;/*统计处理过的格子数 */char randmineNUM3;/*显示数字的字符串*/ int Keystate;int MouseExist; int MouseButton; int MouseX;int MouseY;void Initvoid;/*图形驱动 */void MouseOnvoid;/*鼠标光标显示*/void MouseOffvoid;/*鼠标光标隐匿*/void MouseSetXYint,int;/*设置当前位置 */ int Left
3、Pressvoid;/* 左键按下 */int RightPressvoid;/* 鼠标右键按下 */void MouseGetXYvoid;/*得到当前位置 */ void Controlvoid;/*嬉戏开头 ,重新,关闭 */ void GameBegainvoid;/*嬉戏开头画面 */ void DrawSmilevoid;/*画笑脸 */void DrawRedflagint,int;/*显示红旗 */void DrawEmptyint,int,int,int;/*两种空格子的显示*/ void GameOvervoid;/* 嬉戏终止 */void GameWinvoid;/*显
4、示成功 */int MineStatisticsint,int;/*统计每个格子四周的雷数*/ int ShowWhiteint,int;/*显示无雷区的空白部分*/void GamePlayvoid;/* 嬉戏过程 */ void Closevoid;/* 图形关闭 */ void mainvoid Init;Control;Close;可编辑资料 - - - 欢迎下载精品名师归纳总结void Initvoid/*图形开头 */ int gd=DETECT,gm; initgraph&gd,&gm,c:tc;void Closevoid/* 图形关闭 */ closegraph;void M
5、ouseOnvoid/*鼠标光标显示 */ _AX=0x01;geninterrupt0x33;void MouseOffvoid/*鼠标光标隐匿 */ _AX=0x02;geninterrupt0x33;void MouseSetXYint x,int y/*设置当前位置 */ _CX=x;_DX=y;_AX=0x04;geninterrupt0x33;int LeftPressvoid/* 鼠标左键按下 */ _AX=0x03;geninterrupt0x33; return_BX&1;int RightPressvoid/* 鼠标右键按下 */ _AX=0x03;geninterrupt
6、0x33; return_BX&2;void MouseGetXYvoid/*得到当前位置 */ _AX=0x03;geninterrupt0x33;MouseX=_CX;MouseY=_DX;void Controlvoid/*嬉戏开头 ,重新 ,关闭 */ int gameFLAG=1;/*嬉戏失败后判定是否重新开头的标志*/ while1ifgameFLAG/* 嬉戏失败后没判定出重新开头或者退出嬉戏的话就连续判定*/ GameBegain; /* 嬉戏初始画面 */GamePlay;/* 详细嬉戏 */ifgameAGAIN=1/*嬉戏中重新开头 */ gameAGAIN=0;可编辑资
7、料 - - - 欢迎下载精品名师归纳总结continue;MouseOn; gameFLAG=0;ifLeftPress/* 判定是否重新开头 */ MouseGetXY;ifMouseX280&MouseX65&MouseY85 gameFLAG=1;continue;ifkbhit/*判定是否按键退出*/ break;MouseOff;void DrawSmilevoid/*画笑脸 */ setfillstyleSOLID_FILL,YELLOW; fillellipse290,75,10,10; setcolorYELLOW;setfillstyleSOLID_FILL,BLACK;/*
8、眼睛 */fillellipse285,75,2,2;fillellipse295,75,2,2; setcolorBLACK;/*嘴巴 */ 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;setcolorBLACK; line198+j*20,95+i*20,198+j*20,95+i*20+10;void DrawEmptyint i,int j,int mode,int
9、color/*两种空格子的显示 */ setcolorcolor;setfillstyleSOLID_FILL,color; ifmode=0/* 没有单击过的大格子 */bar200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8;elseifmode=1/* 单击过后显示空白的小格子*/ bar200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7;void GameBegainvoid/* 嬉戏开头画面 */ int i,j;可编辑资料 - - - 欢迎下载精品名师归纳总结cleardevice; ifgamePLAY.=1
10、 MouseSetXY290,70; /* 鼠标一开头的位置 ,并作为它的初始坐标 */MouseX=290;MouseY=70;gamePLAY=1;/* 下次按重新开头的话鼠标不重新初始化*/ mineNUM=0;setfillstyleSOLID_FILL,7; bar190,60,390,290;fori=0;i10;i+/*画格子 */forj=0;j10;j+ DrawEmptyi,j,0,8;setcolor7; DrawSmile;/* 画脸 */ randomize;fori=0;i10;i+/*100个格子随机赋值有没有的雷*/ forj=0;j10;j+ Mineij.n
11、um=random8;/*假如随机数的结果是1 表示这个格子有的雷 */ ifMineij.num=1mineNUM+;/*现有雷数加 1*/ elseMineij.num=2;Mineij.flag=0;/*表示没红旗标志 */sprintfrandmineNUM,%d,mineNUM; /*显示这次总共有多少雷数*/setcolor1; settextstyle0,0,2;outtextxy210,70,randmineNUM;mineNUM=100-mineNUM;/*变量取空白格数量 */ MouseOn;void GameOvervoid/* 嬉戏终止画面 */ int i,j;se
12、tcolor0; fori=0;i10;i+forj=0;j10;j+ifMineij.num=1/*显示全部的的雷 */ DrawEmptyi,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 MineStatisticsint i,int j/*统计每个格子四周的雷数*/ int n
13、NUM=0;ifi=0&j=0/*左上角格子的统计 */ ifMine01.num=1nNUM+; ifMine10.num=1nNUM+; ifMine11.num=1nNUM+;elseifi=0&j=9/*右上角格子的统计 */ ifMine08.num=1nNUM+; ifMine19.num=1nNUM+; ifMine18.num=1nNUM+;elseifi=9&j=0/*左下角格子的统计 */ ifMine80.num=1nNUM+; ifMine91.num=1nNUM+; ifMine81.num=1nNUM+;elseifi=9&j=9/*右下角格子的统计*/ ifMin
14、e98.num=1nNUM+; ifMine89.num=1nNUM+;ifMine88.num=1nNUM+;elseifj=0/* 左边第一列格子的统计*/ ifMineij+1.num=1nNUM+; ifMinei+1j.num=1nNUM+; ifMinei-1j.num=1nNUM+; ifMinei-1j+1.num=1nNUM+; ifMinei+1j+1.num=1nNUM+;elseifj=9/* 右边第一列格子的统计*/ ifMineij-1.num=1nNUM+; ifMinei+1j.num=1nNUM+; ifMinei-1j.num=1nNUM+; ifMinei
15、-1j-1.num=1nNUM+; ifMinei+1j-1.num=1nNUM+;可编辑资料 - - - 欢迎下载精品名师归纳总结elseifi=0/* 第一行格子的统计 */ ifMinei+1j.num=1nNUM+; ifMineij-1.num=1nNUM+; ifMineij+1.num=1nNUM+; ifMinei+1j-1.num=1nNUM+; ifMinei+1j+1.num=1nNUM+;elseifi=9/* 最终一行格子的统计 */ ifMinei-1j.num=1nNUM+; ifMineij-1.num=1nNUM+; ifMineij+1.num=1nNUM+
16、; ifMinei-1j-1.num=1nNUM+; ifMinei-1j+1.num=1nNUM+;else/*一般格子的统计 */ ifMinei-1j.num=1nNUM+; ifMinei-1j+1.num=1 nNUM+; ifMineij+1.num=1nNUM+; ifMinei+1j+1.num=1nNUM+; ifMinei+1j.num=1nNUM+; ifMinei+1j-1.num=1nNUM+; ifMineij-1.num=1nNUM+; ifMinei-1j-1.num=1nNUM+;returnnNUM;/*把格子四周一共有多少雷数的统计结果返回*/int Sh
17、owWhiteint i,int j/*显示无雷区的空白部分*/ifMineij.flag=1|Mineij.num=0/*假如有红旗或该格处理过就不对该格进行任何判定*/ return;mineNUM-;/*显示过数字或者空格的格子就表示多处理了一个格子,当全部格子都处理过了表示成功*/ ifMineij.roundnum=0&Mineij.num.=1/*显示空格 */DrawEmptyi,j,1,7;Mineij.num=0;elseifMineij.roundnum.=0/*输出雷数 */ DrawEmptyi,j,0,8; sprintfrandmineNUM,%d,Mineij.r
18、oundnum; setcolorRED; outtextxy195+j*20,95+i*20,randmineNUM;Mineij.num=0;/*已经输出雷数的格子用0 表示已经用过这个格子*/ return可编辑资料 - - - 欢迎下载精品名师归纳总结 /*8个方向递归显示全部的空白格子*/ ifi.=0&Minei-1j.num.=1ShowWhitei-1,j;ifi.=0&j.=9&Minei-1j+1.num.=1ShowWhitei-1,j+1; ifj.=9&Mineij+1.num.=1ShowWhitei,j+1; ifj.=9&i.=9&Minei+1j+1.num.
19、=1ShowWhitei+1,j+1; ifi.=9&Minei+1j.num.=1ShowWhitei+1,j; ifi.=9&j.=0&Minei+1j-1.num.=1ShowWhitei+1,j-1; ifj.=0&Mineij-1.num.=1ShowWhitei,j-1;ifi.=0&j.=0&Minei-1j-1.num.=1ShowWhitei-1,j-1;void GamePlayvoid/* 嬉戏过程 */int i,j,Num;/*Num用来接收统计函数返回一个格子四周有多少的雷*/ fori=0;i10;i+forj=0;j280&MouseX65&MouseY190&
20、MouseX90&MouseY290/*当前鼠标位置格子范畴内*/ j=MouseX-190/20;/*x坐标 */i=MouseY-90/20;/*y坐标 */ifMineij.flag=1/*假如格子有红旗就左键无效*/ continue;ifMineij.num.=0/*假如格子没有处理过 */ ifMineij.num=1/*鼠标按下的格子是的雷*/ MouseOff; GameOver;/* 嬉戏失败 */ break;else/*鼠标按下的格子不是的雷*/ MouseOff; Num=MineStatisticsi,j;ifNum=0/* 四周没的雷就用递归算法来显示空白格子*/
21、ShowWhitei,j;else/* 按下格子四周有的雷 */sprintfrandmineNUM,%d,Num;/*输出当前格子四周的雷数*/ setcolorRED;outtextxy195+j*20,95+i*20,randmineNUM;mineNUM-;可编辑资料 - - - 欢迎下载精品名师归纳总结MouseOn;Mineij.num=0;/*点过的格子四周雷数的数字变为0 表示这个格子已经用过*/ ifmineNUM190&MouseX90&MouseY290/*当前鼠标位置在格范畴内*/ j=MouseX-190/20;/*x坐标 */i=MouseY-90/20;/*y坐标 */ MouseOff;ifMineij.flag=0&Mineij.num.=0/*原来没红旗现在显示红旗*/ DrawRedflagi,j;Mineij.flag=1;elseifMineij.flag=1/*有红旗标志再按右键就红旗消逝*/ DrawEmptyi,j,0,8;Mineij.flag=0;MouseOn; sleep1;可编辑资料 - - - 欢迎下载