项目实战C语言easyX带你实现扫雷游戏(六边形升级版)!
每天一个编程小项目,提升你的编程能力!
程序简介
扫雷游戏升级版!六边形扫雷(寻宝模式)稍稍介绍一下哈
他也是要把所有安全的地方点出来。
他没有扫雷模式的消零算法。每一个安全的点都需要单独挖出来,一次显示一个格子。
添加了生命值的概念,也就是说存在一定的容错。
显示的数字有别于扫雷模式。点击宝藏点,会显示周围宝藏点数量,绿色;点击地雷,会显示周围地雷数量,黑色。注意,这个数字不包括自己,显示的范围自然就是06了。点击地雷会减生命值,生命值归零则结束。
所以雷和宝藏都是有价值的,都是能给准确信息的。
我能给一个参考难度:占总格子数40的地雷,占总地雷数50的生命值。
【注:需要编译器图形库插件可以在文末领取】程序运行展示
简单了解游戏后我们就来试试吧!(直接上源码,大家可以看注释)程序:六边形扫雷:寻宝模式includemath。hincludegraphics。hincludestringincludetime。hstaticdoublepiacos(1。0);圆周率staticHWNDhOut;画布定义一个结构体,按钮structNode1{intposx1,posy1,posx2,posy2;坐标LPTSTRtext;文字intmod;状态};定义一个结构体,六边形格子structNode2{inti,j,k;特征值intmodlife;翻开intmodmine;雷intmodflag;标记intposx,posy;坐标intnummine;周围雷数intnumpeace;周围空地块};定义一个类classGary{public:voidcarry();主进程voidinitialization();初始化voiddrawscene();绘制界面函数voiddrawbox(intnumbox);绘制格子voiddrawflag(intnumbox);绘制标记voiddrawnum(intnumbox,intnum);绘制数字voidmove();窗口主视角voidcreate();地雷生成voidcheckover();结束判定intnumbutton;按钮数量参数intexitcarry;主循函数控制参数intexitmove;开始界面控制参数intexitgame;游戏进行控制参数intnumlife;生命值intnumsize;边长intnummine;总雷数intnumbox;总地块数intnumflag;标记数COLORREFcolortext〔2〕;按钮绘制填充Node1boxm〔30〕;按钮,预制30个Node2box〔1000〕;地块};标记绘制函数voidGary::drawflag(intnumbox){setlinestyle(PSSOLID,1);setlinecolor(BLACK);line(box〔numbox〕。posx2,box〔numbox〕。posy7,box〔numbox〕。posx2,box〔numbox〕。posy7);setfillcolor(LIGHTRED);setlinecolor(LIGHTRED);fillrectangle(box〔numbox〕。posx72,box〔numbox〕。posy7,box〔numbox〕。posx2,box〔numbox〕。posy1);}数字绘制函数voidGary::drawnum(intnumbox,intnum){inti;画六边形,格子处于点击后状态setfillcolor(RGB(170,170,170));setlinecolor(RGB(85,85,85));POINTpts〔6〕;setlinestyle(PSSOLID,1);for(i0;i6;i){pts〔i〕。xlong(box〔numbox〕。posx14。0cos(60。0double(i)pi180。0));pts〔i〕。ylong(box〔numbox〕。posy14。0sin(60。0double(i)pi180。0));}fillpolygon(pts,6);数字绘制TCHARs〔15〕;settextstyle(20,0,T(Consolas));stprintfs(s,T(0。1d),num);outtextxy(box〔numbox〕。posx5,box〔numbox〕。posy10,s);}场景绘制函数voidGary::drawscene(){TCHARs〔15〕;inti,j;setlinecolor(BLACK);setfillcolor(WHITE);setlinestyle(PSSOLID,1);主界面fillrectangle(401,0,650,400);根据按钮数量绘制settextcolor(BLACK);for(i0;inumbutton;i){setfillcolor(colortext〔boxm〔i〕。mod〕);setbkcolor(colortext〔boxm〔i〕。mod〕);边框fillrectangle(boxm〔i〕。posx1,boxm〔i〕。posy1,boxm〔i〕。posx2,boxm〔i〕。posy2);文字outtextxy(boxm〔i〕。posx1(boxm〔i〕。posx2boxm〔i〕。posx1)2textwidth(boxm〔i〕。text)2,boxm〔i〕。posy14,boxm〔i〕。text);}设置参数setbkcolor(WHITE);settextcolor(BLACK);setlinecolor(BLACK);变量绘制j25;生命值i1;setbkcolor(colortext〔boxm〔i〕。mod〕);stprintfs(s,T(0。1d),numlife);outtextxy(boxm〔i〕。posx1(boxm〔i〕。posx2boxm〔i〕。posx1)2textwidth(boxm〔i〕。text)2,boxm〔i〕。posy1j,s);边长i2;setbkcolor(colortext〔boxm〔i〕。mod〕);stprintfs(s,T(0。1d),numsize);outtextxy(boxm〔i〕。posx1(boxm〔i〕。posx2boxm〔i〕。posx1)2textwidth(boxm〔i〕。text)2,boxm〔i〕。posy1j,s);总地雷数i3;setbkcolor(colortext〔boxm〔i〕。mod〕);stprintfs(s,T(0。1d),nummine);outtextxy(boxm〔i〕。posx1(boxm〔i〕。posx2boxm〔i〕。posx1)2textwidth(boxm〔i〕。text)2,boxm〔i〕。posy1j,s);格子i4;setbkcolor(colortext〔boxm〔i〕。mod〕);stprintfs(s,T(0。1d),numbox);outtextxy(boxm〔i〕。posx1(boxm〔i〕。posx2boxm〔i〕。posx1)2textwidth(boxm〔i〕。text)2,boxm〔i〕。posy1j,s);标记数i5;setbkcolor(colortext〔boxm〔i〕。mod〕);stprintfs(s,T(0。1d),numflag);outtextxy(boxm〔i〕。posx1(boxm〔i〕。posx2boxm〔i〕。posx1)2textwidth(boxm〔i〕。text)2,boxm〔i〕。posy1j,s);FlushBatchDraw();}地雷生成函数voidGary::create(){inti,j;设置雷for(i0;inummine;i){随机jrand()1000;while(box〔j〕。modmine1box〔j〕。modlife1){随机jrand()1000;}是雷box〔j〕。modmine1;}周边雷数统计遍历for(i0;i888;i){if(box〔i〕。modlife0){遍历for(j0;j999;j){排除自己if(j!ibox〔j〕。modlife0){周围六个if((box〔j〕。posxbox〔i〕。posx)(box〔j〕。posxbox〔i〕。posx)(box〔j〕。posybox〔i〕。posy)(box〔j〕。posybox〔i〕。posy)900){是雷if(box〔j〕。modmine1){周边雷数参数加一box〔i〕。nummine;}不是雷elseif(box〔j〕。modmine0){周边安全数参数加一box〔i〕。numpeace;}}}}}}}结束判断函数voidGary::checkover(){inti,k;k0;for(i0;i888;i){每有一个翻开且不是雷的点,则加一if(box〔i〕。modmine0box〔i〕。modlife1){k;}}全翻开则结束if(knumboxnummine){将所有未翻开雷做上标记for(i0;i888;i){if(box〔i〕。modmine1box〔i〕。modlife0){drawflag(i);}}胜利标志:笑脸setfillcolor(WHITE);setlinecolor(WHITE);fillrectangle(50,20,75,45);settextstyle(30,0,T(Wingdings));setbkmode(TRANSPARENT);settextcolor(BLACK);outtextxy(50,20,0x4A);setbkmode(OPAQUE);settextstyle(20,0,T(Consolas));结束变化exitgame1;boxm〔1〕。mod0;boxm〔2〕。mod0;boxm〔3〕。mod0;boxm〔6〕。mod0;boxm〔7〕。mod1;numflag0;绘制drawscene();}}格子绘制函数voidGary::drawbox(intnumbox){inti;intposx,posy;六边形绘制posxbox〔numbox〕。posx;posybox〔numbox〕。posy;POINTpts〔6〕;setlinestyle(PSSOLID,2);背景色setfillcolor(RGB(255,255,255));for(i0;i6;i){pts〔i〕。xlong(posx14。0cos(60。0double(i)pi180。0));pts〔i〕。ylong(posy14。0sin(60。0double(i)pi180。0));}solidpolygon(pts,6);灰边setlinecolor(RGB(85,85,85));line(pts〔0〕。x,pts〔0〕。y,pts〔1〕。x,pts〔1〕。y);line(pts〔5〕。x,pts〔5〕。y,pts〔0〕。x,pts〔0〕。y);line(pts〔1〕。x,pts〔1〕。y,pts〔2〕。x,pts〔2〕。y);前景色setfillcolor(RGB(170,170,170));for(i0;i6;i){pts〔i〕。xlong(posx12。0cos(60。0double(i)pi180。0));pts〔i〕。ylong(posy12。0sin(60。0double(i)pi180。0));}solidpolygon(pts,6);FlushBatchDraw();}初始化函数voidGary::initialization(){inti,j,k,t;随机初始化srand((unsigned)time(NULL));颜色初始化colortext〔0〕WHITE;colortext〔1〕RGB(170,170,170);按钮的初始化numbutton10;坐标for(i0;i10;i){boxm〔i〕。posx1410120(i2);boxm〔i〕。posy12575(i2);boxm〔i〕。posx2520120(i2);boxm〔i〕。posy27575(i2);}内容boxm〔0〕。textT(寻宝模式);boxm〔1〕。textT(生命值);boxm〔2〕。textT(地图边长);boxm〔3〕。textT(总地雷数);boxm〔4〕。textT(总地块数);boxm〔5〕。textT(已标记数);boxm〔6〕。textT(开始);boxm〔7〕。textT(重置);boxm〔8〕。textT(截图);boxm〔9〕。textT(退出);状态boxm〔0〕。mod1;boxm〔1〕。mod1;boxm〔2〕。mod1;boxm〔3〕。mod1;boxm〔4〕。mod1;boxm〔5〕。mod1;boxm〔6〕。mod1;boxm〔7〕。mod0;boxm〔8〕。mod0;boxm〔9〕。mod0;numbox3numsize(numsize1)1;numflag0;绘制参数初始化setlinecolor(BLACK);setlinestyle(PSSOLID,1);settextstyle(20,0,T(Consolas));第一次绘制drawscene();重置setfillcolor(WHITE);fillrectangle(0,0,400,400);平静脸setfillcolor(WHITE);setlinecolor(WHITE);fillrectangle(50,20,75,45);settextstyle(30,0,T(Wingdings));setbkmode(TRANSPARENT);settextcolor(BLACK);outtextxy(50,20,0x4B);setbkmode(OPAQUE);settextstyle(20,0,T(Consolas));格子初始化for(t0;t999;t){已翻开box〔t〕。modlife1;城墙box〔t〕。modmine2;坐标,点不到box〔t〕。posx200;box〔t〕。posy200;}初始化for(i0;inumsize;i){for(j0;jnumsize;j){for(k0;knumsize;k){特征值至少一个为零if(i0j0k0){编号ti100j10k;特征值box〔t〕。ii;box〔t〕。jj;box〔t〕。kk;未翻开box〔t〕。modlife0;不是雷box〔t〕。modmine0;未标记box〔t〕。modflag0;坐标box〔t〕。posx20022(jk);box〔t〕。posy20025i13(jk);周围雷数初始化box〔t〕。nummine0;box〔t〕。numpeace0;绘制地块drawbox(t);}}}}地雷生成函数create();}窗口主视角函数,获取用户操作voidGary::move(){鼠标定义ExMessagem;TCHARss〔15〕;inti,t;exitmove0;exitgame0;while(exitmove0){鼠标信息if(peekmessage(m,EMMOUSEEMKEY)){左键单击判断if(m。messageWMLBUTTONDOWN){判断是否点击了格子if(m。x0m。y0m。x400m。y400exitgame0){for(t0;t888;t){成功点击未标记的空格子if((m。xbox〔t〕。posx)(m。xbox〔t〕。posx)(m。ybox〔t〕。posy)(m。ybox〔t〕。posy)144box〔t〕。modlife0box〔t〕。modflag0){点击的格子不是雷if(box〔t〕。modmine0){绿色,安全,绘制settextcolor(LIGHTGREEN);drawnum(t,box〔t〕。numpeace);改为翻开box〔t〕。modlife1;}点击的格子雷elseif(box〔t〕。modmine1){扣除生命值numlife;黑色,危险,绘制settextcolor(BLACK);drawnum(t,box〔t〕。nummine);改为翻开box〔t〕。modlife1;生命值减为零if(numlife0){失败标志:哭脸setfillcolor(WHITE);setlinecolor(WHITE);fillrectangle(50,20,75,45);settextstyle(30,0,T(Wingdings));setbkmode(TRANSPARENT);settextcolor(BLACK);outtextxy(50,20,0x4C);setbkmode(OPAQUE);settextstyle(20,0,T(Consolas));失败exitgame1;boxm〔1〕。mod0;boxm〔2〕。mod0;boxm〔3〕。mod0;boxm〔6〕。mod0;boxm〔7〕。mod1;numflag0;}绘制drawscene();}成功结束判断checkover();break;}}}判断是否点击了可点击按钮for(i0;inumbutton;i){if(m。xboxm〔i〕。posx1m。yboxm〔i〕。posy1m。xboxm〔i〕。posx2m。yboxm〔i〕。posy2boxm〔i〕。mod0){break;}}点击矩形按钮switch(i){生命值:numlifecase1:{输入InputBox(ss,10,T(输入生命值(1999)));stscanfs(ss,T(d),i);if(i0i999){numlifei;}else{MessageBox(hOut,T(输入错误,不在范围内),T(来自小豆子的提醒),MBOK);}绘制drawscene();break;}地图边长:numsizecase2:{输入InputBox(ss,10,T(输入边长(28)));stscanfs(ss,T(d),i);if(i1i8){numsizei;numbox3numsize(numsize1)1;}else{MessageBox(hOut,T(输入错误,不在范围内),T(来自小豆子的提醒),MBOK);}绘制drawscene();break;}总地雷数:numminecase3:{InputBox(ss,10,T(输入地雷数(1总格子数)));stscanfs(ss,T(d),i);if(i0inumbox){numminei;}else{MessageBox(hOut,T(输入错误,不在范围内),T(来自小豆子的提醒),MBOK);}绘制drawscene();break;}开始case6:{numbox3numsize(numsize1)1;if(numminenumboxnumlife0){exitgame0;初始化initialization();}else{MessageBox(hOut,T(请将雷数修改为小于格子数或将生命值修改为大于零),T(来自小豆子的提醒),MBOK);}break;}重置case7:{结束游戏进程,进入准备阶段if(exitgame0){exitgame1;boxm〔1〕。mod0;boxm〔2〕。mod0;boxm〔3〕。mod0;boxm〔6〕。mod0;boxm〔7〕。mod1;numflag0;绘制drawscene();}break;}截图case8:{saveimage(T(image。png));break;}退出case9:{exitgame1;exitmove1;exitcarry1;break;}default:break;}}右键,且处于游戏进行状态elseif(m。messageWMRBUTTONDOWNexitgame0){for(t0;t888;t){成功点击空格子if((m。xbox〔t〕。posx)(m。xbox〔t〕。posx)(m。ybox〔t〕。posy)(m。ybox〔t〕。posy)144box〔t〕。modlife0){标记状态转换box〔t〕。modflag(box〔t〕。modflag0?1:0);绘制drawbox(t);画小旗子if(box〔t〕。modflag1){drawflag(t);numflag;}else{numflag;}绘制drawscene();}}}}}}主进程voidGary::carry(){窗口定义hOutinitgraph(651,401);SetWindowText(hOut,T(六边形扫雷:扫雷模式));参数初始化numsize5;nummine10;numlife3;背景绘制setbkcolor(WHITE);cleardevice();进程控制exitcarry0;while(exitcarry0){initialization();move();}closegraph();}主函数intmain(void){GaryG;G。carry();return0;}
大家赶紧去动手试试吧!
此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C项目案例,帮助大家在学习C语言的道路上披荆斩棘!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
对于CC感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些CC的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
网球王子官方最新人气top10公布头号有新人动漫网王2022年7月4日到8月14日,新网球王子开展了粉丝投票网王国势调查活动。这个调查活动是从网球王子系列中选出最喜欢的选手最支持的队伍最希望最支持的队伍与之对战的队
广东省政协委员谢萌建议进一步优化消费券发放方式和使用今年广东省政府工作报告中提出,2023年将着力扩大国内需求。把恢复和扩大消费摆在优先位置,增强消费信心优化消费环境。通过加大餐饮文旅养老育幼等服务消费促进力度,加快培育新型消费。提
报名系统信息填写模板来咯!广东省考正在报名中2023年广东公务员考试公告已发布!报名选岗正在进行中!!报名时间为2023年01月10日900至16日1600,笔试时间为2月,具体时间另行通知。01hr报名方式登录广东省公务员
广东省政协委员杜兰AI养老,让老年生活更美好来源人民网广东频道原创稿人民网广州1月11日电(周睿)科技点亮生活,人工智能可以帮助老人拥有一个高质量老年。1月10日上午,在广东省政协十三届一次会议首场委员通道上,广东省政协委员
广东与江西的区划变动,广东省的1个村,为何划入了江西省?在之前的文章中给大家说了很多省份的区划变迁沿革,每个省份的区划变迁沿革都是非常的复杂的,因为我国的历史非常悠久,5000年的历史文化传承让我国历经了不少的政权执政,在每个政权执政期
吴越的美年过50的吴越越来越好看。岁月积淀的从容淡定写在脸上,眼睛里没有疲惫,眼神清澈。皮肤细腻,身材保持的恰到好处,身穿合体的V领礼服裙,尽显大气从容。岁月从不败美人。年过50的吴越越来
国货眼霜再度开挂,眼部问题全垒打,鲨疯了!!!眼部是放大年龄的最佳部位,也是最容易衰老,难以护理的部位,要想藏住眼角的黑眼圈鱼尾纹异常艰难,如果要逆转眼部时光,眼霜一定要用起来。国货眼霜高口碑,效果佳的寥寥无几,要想研发出适合
19。88万起售,造型时尚,拥有手机无线充电,Modernin新车型上市各位老司机们,大家好!请点击关注汽车行业情报站,第一时间了解最新的汽车资讯,在这里轻松读懂汽车!近日,情报君从相关渠道获悉,Modernin新车型上市,从家族中的定位来看,这两台车
黑色鞋子果然还是名列前茅的前几个月做总结的时候还说,黑色的夏天鞋子偏少,最近似乎被打脸了捂脸因为最近看了许多黑色的凉鞋和单鞋,夏天都可以穿的。黑色给人感觉就是百搭耐看,它的特性就是这样,怎么可能会少呢?大概
时尚单品这么多,明星为何偏爱梦金园?曾被杨丞琳吴谨言等一众大牌明星青睐的梦金园,在今年开春之际又掀起了一股新的时尚浪潮,品牌代言人江疏影佩戴热门款式登上了瑞丽服饰美容1月刊别册封面,在金饰的助力下更凸显江疏影妩媚又高
今日欧美明星时尚街拍图集(2023年1月12日)今日欧美明星时尚街拍图集(2023年1月12日)时尚欧美明星的街拍就是行走在马路上的秀场,明星们的街拍就是时尚界的潮流风向标。明星们身穿什么牌子的衣服肩背什么大牌包包,脚蹬什么潮流