项目实战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的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
湖人步行者谈判破裂,特纳身价比肩巨星北京时间1月14日,NBA常规赛正在如火如荼地进行着,在之前结束的一轮常规赛中,湖人客场以116比125不敌国王,遭遇两连败的同时,暂时以21胜21负的战绩,排名东部第七,距离……
2023与书为伴一月书单整理〔微风〕《苍炎》作者:羽生结弦容颜如玉,身姿如松,翩若惊鸿,婉若游龙。幸得识卿桃花面,从此阡陌多暖春,时光作渡,眉目成书,从此我们的深情不被辜负。他就像……
厘米波频段成设备商6G频谱新宠太赫兹频段被抛弃了吗?现在,一些设备供应商正将其对于6G频谱的期望和宣传瞄准介于7GHz至20GHz之间的所谓厘米波频段。这与以24GHz40GHz频段之间毫米波频段为中心的早期5G炒作不同。……
研究证明藏族人群是登山能手夏尔巴人的祖先夏尔巴人(Sherpa)又称雪巴人、谢尔巴人,是中国、尼泊尔、印度等国的边境民族。他们深居深山老林,过去几乎与世隔绝,后因为攀登珠穆朗玛峰的各国登山队当向导或背夫而闻名于世,以……
茶树精油的用法大家好,我是葡萄籽,一起来说精油吧!!!茶树精油是一种非常有用的精油,因其广泛的用途而备受欢迎。我们的茶树精油采用澳大利亚最好的茶树叶提取而成,其具有抗菌、杀菌和抗炎的功……
全民健身,健康中国驿城区峰林潭杯足球友谊赛落幕驻马店市全民健身,健康中国中西部地区县域乡村足球系列活动暨驿城区峰林潭杯足球友谊赛落幕历时15天的由中国足球发展基金会主办,河南省足球协会承办,驻马店市体育总会,驿城区卫……
世界杯已落幕,足球狂欢爱自己从一颗安翰科技磁控胶囊胃镜开始四年一度的世界杯是球迷和足球爱好者的盛会。球员在绿茵场上拼搏鏖战,球迷在屏幕前同悲同喜。由于时差关系,世界杯的赛事多在凌晨(北京时间)直播,我国的球迷大多数情况熬夜观球,夜宵傍……
深耕盐化工行业业绩多年稳定增长江盐集团跻身首批主板注册制新股本报记者曹琦4月10日上午,江西省盐业集团股份有限公司(股票简称江盐集团、股票代码601065)首次公开发行股票上市仪式在上海证券交易所隆重举行。江盐集团上市仪式现……
奥运冰五环重达3吨似一栋三层高的单元楼在看台上,观众意识不到五环的重量。站在五环脚下,人立即显得渺小,它长20米,由LED异形屏组成,像一栋三层高的单元楼。它的体重是个重要问题。太重,威亚会被显眼地拉低,影响演出效……
夜雨丨胡木非木一个人的千佛山一个人的千佛山胡木非木以前从来没有听说过千佛山查看百度地图才知道千佛山远在千里之外她一个人背着行囊在秋天抵达千佛山千佛山的秋风把天空吹得一尘……
一加10Pro评测游戏体验大突破,帧率最稳的骁龙8手机?刚发布的一加10PRO,真没料到一家旗舰居然这么快就来了,我提前收到了机器,满打满算用了十多天。说句实话,这次除了非常大胆的外观创新之外,一家识破的硬件参数确实没什么惊喜,所以……
以树莓派驱动的机器学习外骨骼可以让行走更快更轻松斯坦福大学的研究人员设计了一种由树莓派单板计算机驱动的外骨骼,可以帮助有行动障碍的人更容易地走动。这种可穿戴设备像靴子一样套在小腿上,由RaspberryPi4负责管理一系列的……