利用c++和easyx图形库做一个低配版扫雷游戏
游戏界面
由于这个游戏是我抱着玩一玩的心态做出来的,所以没有过多的去设计界面,也没有去找游戏的资源(图片、游戏音效等)。仅使用了不同颜色的方块来表示游戏中方块的状态和种类。(绿色为初始状态(未翻转的状态),黄色为翻转后的背景颜色,蓝色表示已插旗的方块,红色代表地雷)
图1游戏主菜单界面
图二模式一的游戏界面(20*2040个雷)
图三模式二的游戏界面(10*1020个雷)
图四游戏成功界面
图五游戏失败界面
2.全部代码
#include#include #include #include usingnamespacestd; #definePOINTWIDTH30 //雷的数量 intmineCnt; intmapSize; //已翻转的个数 int_count; //是否有雷 boolmine[20][20]={false}; //是否已翻转 booloverturned[20][20]={false}; boolflaged[20][20]={false}; //游戏模式 intmode; //游戏重新开始的标志 intcmd=1; //游戏结束标志 boolgameOver; //玩家获胜标志 bool_win; //小方格(坐标) typedefstructpoint{ intx; inty; point(int_x,int_y){ x=_x;y=_y; } }point; //计算周围的地雷数量 intgetAroundMineCnt(pointp){ intcnt=0; for(inti=p.x-1;i<=p.x+1;i++){ for(intj=p.y-1;j<=p.y+1;j++){ if(i>=0&&i<20&&j>=0&&j<20&&mine[i][j]) cnt++; } } returncnt; } //画点(小方格) voiddrawPoint(pointp,intcolor){ setfillcolor(color); fillrectangle(p.x*POINTWIDTH+140,p.y*POINTWIDTH+140,p.x*POINTWIDTH+140+POINTWIDTH,p.y*POINTWIDTH+140+POINTWIDTH); } //画地雷(红色方块代替) voiddrawMine(pointp){ setfillcolor(RED); fillrectangle(p.x*POINTWIDTH+140,p.y*POINTWIDTH+140,p.x*POINTWIDTH+140+POINTWIDTH,p.y*POINTWIDTH+140+POINTWIDTH); } //画旗(蓝色方块代替) voiddrawflag(pointp){ flaged[p.x][p.y]=true; drawPoint(p,BLUE); } //游戏结束对话框与"重玩"、"退出" voidgameover(int&cmd){ gameOver=1; for(inti=0;i 500&&m.y<550&&m.x>200&&m.x<350) break; elseif(m.mkLButton&&m.y>500&&m.y<550&&m.x>550&&m.x<700){ cmd=0; break; } } } //游戏胜利对话框与"重玩"、"退出" voidwin(int&cmd){ _win=1; setfillcolor(LIGHTGRAY); fillrectangle(200,300,700,550); rectangle(200,500,350,550); rectangle(550,500,700,550); setbkmode(1); settextstyle(60,0,0); outtextxy(300,400,_T("YouWin!")); settextstyle(38,0,0); outtextxy(220,510,_T("Restart")); outtextxy(560,510,_T("Quit")); MOUSEMSGm; while(1){ m=GetMouseMsg(); if(m.mkLButton&&m.y>500&&m.y<550&&m.x>200&&m.x<350) break; elseif(m.mkLButton&&m.y>500&&m.y<550&&m.x>550&&m.x<700){ cmd=0; break; } } } //翻转 voidoverturn(pointp,intt){ settextstyle(POINTWIDTH*0.8,POINTWIDTH*0.8,0); settextcolor(BLACK); if(t==1){ if(!mine[p.x][p.y]){ _count++; drawPoint(p,YELLOW); overturned[p.x][p.y]=true; //判断周围的雷的数量是否为0,为0则翻转该方块周边的8个方块 if(getAroundMineCnt(p)!=0){ intcnt=getAroundMineCnt(p); _TCHARa[3]; _stprintf_s(a,L"%d",cnt); outtextxy(p.x*POINTWIDTH+POINTWIDTH*0.1+140,p.y*POINTWIDTH+POINTWIDTH*0.1+140,a); if(_count==mapSize*mapSize-mineCnt){win(cmd);return;} } else{ for(inti=p.x-1;i<=p.x+1;i++){ for(intj=p.y-1;j<=p.y+1;j++) if(i>=0&&i =0&&j 140&&m.x<140+mapSize*POINTWIDTH&&m.y>140&&m.y<140+mapSize*POINTWIDTH) { pointp((m.x-140)/POINTWIDTH,(m.y-140)/POINTWIDTH);//将鼠标点击的坐标转换成对应位置的方块 if(!overturned[p.x][p.y]) overturn(p,1); } if(m.mkRButton&&m.x>140&&m.x<740&&m.y>140&&m.y<740) { pointp((m.x-140)/POINTWIDTH,(m.y-140)/POINTWIDTH); if(!overturned[p.x][p.y]) overturn(p,2); } if(gameOver)return; elseif(_win)return; } } //初始化游戏界面 voidinitGameface(){ if(mode==1) rectangle(140,140,740,740); elserectangle(140,140,440,440); setbkcolor(LIGHTGRAY); cleardevice(); setbkcolor(YELLOW); pointp(0,0); for(inti=0;i 300&&m.x<580&&m.y>400&&m.y<500) break; elseif(m.mkLButton&&m.x>300&&m.x<580&&m.y>530&&m.y<630) if(mode==1){ mode=2; rectangle(300,530,580,630); outtextxy(320,550,L"困难"); } else{ mode=1; rectangle(300,530,580,630); outtextxy(320,550,L"简单"); } elseif(m.mkLButton&&m.x>300&&m.x<580&&m.y>660&&m.y<760){ cleardevice(); MOUSEMSGmm; while(1){ mm=GetMouseMsg(); if(mm.mkLButton)break; } startInterface(mode); } } } //初始化游戏 voidinitgame(intmode){ _win=0; _count=0; gameOver=0; if(mode==1){ mineCnt=40; mapSize=20; } else{ mineCnt=20; mapSize=10; } for(inti=0;i 3.符加说明:本程序使用了简单好用的easyx图形库:可以Easyx官网中下载安装,且Easyx官网提供的文档详细的介绍了各种函数的用法,很容易上手。
总结
以上所述是小编给大家介绍的利用c++和easyx图形库做一个低配版扫雷游,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。