城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

用Python实现扫雷小游戏

6月6日 遭人厌投稿
  作者:野客
  来源:Python技术
  扫雷是一款益智类小游戏,最早于1992年由微软在Windows上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷,踩到雷则失败,需重新开始。
  本文我们使用Python来实现扫雷游戏,主要用的Python库是pygame。实现
  游戏组成比较简单,主要包括:小方格、计时器、地雷等。
  首先,我们初始化一些常量,比如:横竖方块数、地雷数、鼠标点击情况等,如下所示:BLOCKWIDTH30BLOCKHEIGHT16块大小SIZE20地雷数MINECOUNT66未点击normal1已点击opened2地雷mine3标记为地雷flag4标记为问号ask5踩中地雷bomb6被双击的周围hint7正被鼠标左右键双击double8readied1,started2,over3,win4
  接着定义一个地雷类,类中定义一些基本属性(如:坐标、状态等)及get、set方法,代码实现如下:classMine:definit(self,x,y,value0):self。xxself。yyself。value0self。aroundminecount1self。statusnormalself。setvalue(value)defrepr(self):returnstr(self。value)defgetx(self):returnself。xdefsetx(self,x):self。xxxproperty(fgetgetx,fsetsetx)defgety(self):returnself。ydefsety(self,y):self。yyyproperty(fgetgety,fsetsety)defgetvalue(self):returnself。valuedefsetvalue(self,value):ifvalue:self。value1else:self。value0valueproperty(fgetgetvalue,fsetsetvalue,doc0:非地雷1:雷)defgetaroundminecount(self):returnself。aroundminecountdefsetaroundminecount(self,aroundminecount):self。aroundminecountaroundminecountaroundminecountproperty(fgetgetaroundminecount,fsetsetaroundminecount,doc四周地雷数量)defgetstatus(self):returnself。statusdefsetstatus(self,value):self。statusvaluestatusproperty(fgetgetstatus,fsetsetstatus,docBlockStatus)
  再接着定义一个MineBlock类,用来处理扫雷的基本逻辑,代码实现如下:classMineBlock:definit(self):self。block〔〔Mine(i,j)foriinrange(BLOCKWIDTH)〕forjinrange(BLOCKHEIGHT)〕埋雷foriinrandom。sample(range(BLOCKWIDTHBLOCKHEIGHT),MINECOUNT):self。block〔iBLOCKWIDTH〕〔iBLOCKWIDTH〕。value1defgetblock(self):returnself。blockblockproperty(fgetgetblock)defgetmine(self,x,y):returnself。block〔y〕〔x〕defopenmine(self,x,y):踩到雷了ifself。block〔y〕〔x〕。value:self。block〔y〕〔x〕。statusbombreturnFalse先把状态改为openedself。block〔y〕〔x〕。statusopenedaroundgetaround(x,y)sum0fori,jinaround:ifself。block〔j〕〔i〕。value:sum1self。block〔y〕〔x〕。aroundminecountsum如果周围没有雷,那么将周围8个未中未点开的递归算一遍ifsum0:fori,jinaround:ifself。block〔j〕〔i〕。aroundminecount1:self。openmine(i,j)returnTruedefdoublemousebuttondown(self,x,y):ifself。block〔y〕〔x〕。aroundminecount0:returnTrueself。block〔y〕〔x〕。statusdoublearoundgetaround(x,y)周围被标记的雷数量sumflag0fori,jingetaround(x,y):ifself。block〔j〕〔i〕。statusflag:sumflag1周边的雷已经全部被标记resultTrueifsumflagself。block〔y〕〔x〕。aroundminecount:fori,jinaround:ifself。block〔j〕〔i〕。statusnormal:ifnotself。openmine(i,j):resultFalseelse:fori,jinaround:ifself。block〔j〕〔i〕。statusnormal:self。block〔j〕〔i〕。statushintreturnresultdefdoublemousebuttonup(self,x,y):self。block〔y〕〔x〕。statusopenedfori,jingetaround(x,y):ifself。block〔j〕〔i〕。statushint:self。block〔j〕〔i〕。statusnormal
  我们接下来初始化界面,首先生成由小方格组成的面板,主要代码实现如下:forrowinblock。block:formineinrow:pos(mine。xSIZE,(mine。y2)SIZE)ifmine。statusopened:screen。blit(imgdict〔mine。aroundminecount〕,pos)openedcount1elifmine。statusdouble:screen。blit(imgdict〔mine。aroundminecount〕,pos)elifmine。statusbomb:screen。blit(imgblood,pos)elifmine。statusflag:screen。blit(imgflag,pos)flagcount1elifmine。statusask:screen。blit(imgask,pos)elifmine。statushint:screen。blit(img0,pos)elifgamestatusoverandmine。value:screen。blit(imgmine,pos)elifmine。value0andmine。statusflag:screen。blit(imgerror,pos)elifmine。statusnormal:screen。blit(imgblank,pos)
  看一下效果:
  再接着添加面板的head部分,包括:显示雷数、重新开始按钮(笑脸)、显示耗时,主要代码实现如下:printtext(screen,font1,30,(SIZE2fheight)22,02d(MINECOUNTflagcount),red)ifgamestatusstarted:elapsedtimeint(time。time()starttime)printtext(screen,font1,SCREENWIDTHfwidth30,(SIZE2fheight)22,03delapsedtime,red)ifflagcountopenedcountBLOCKWIDTHBLOCKHEIGHT:gamestatuswinifgamestatusover:screen。blit(imgfacefail,(faceposx,faceposy))elifgamestatuswin:screen。blit(imgfacesuccess,(faceposx,faceposy))else:screen。blit(imgfacenormal,(faceposx,faceposy))
  看一下效果:
  再接着添加各种点击事件,代码实现如下:foreventinpygame。event。get():ifevent。typeQUIT:sys。exit()elifevent。typeMOUSEBUTTONDOWN:mousex,mouseyevent。posxmousexSIZEymouseySIZE2b1,b2,b3pygame。mouse。getpressed()ifgamestatusstarted:鼠标左右键同时按下,如果已经标记了所有雷,则打开周围一圈;如果还未标记完所有雷,则有一个周围一圈被同时按下的效果ifb1andb3:mineblock。getmine(x,y)ifmine。statusopened:ifnotblock。doublemousebuttondown(x,y):gamestatusoverelifevent。typeMOUSEBUTTONUP:ify0:iffaceposxmousexfaceposxfacesizeandfaceposymouseyfaceposyfacesize:gamestatusreadiedblockMineBlock()starttimetime。time()elapsedtime0continueifgamestatusreadied:gamestatusstartedstarttimetime。time()elapsedtime0ifgamestatusstarted:mineblock。getmine(x,y)按鼠标左键ifb1andnotb3:ifmine。statusnormal:ifnotblock。openmine(x,y):gamestatusover按鼠标右键elifnotb1andb3:ifmine。statusnormal:mine。statusflagelifmine。statusflag:mine。statusaskelifmine。statusask:mine。statusnormalelifb1andb3:ifmine。statusdouble:block。doublemousebuttonup(x,y)
  我们来看一下最终实现效果:
  总结
  本文我们通过Python简单的实现了扫雷游戏,大家有兴趣的话,可以实际操作一下,看看自己能否排除全部的雷。
投诉 评论 转载

去日本,那么近,那么美(今日带你领略大阪的浪漫与美食)有人说,佳期如梦,旅途如诗,每一个行走在山水时光中的人都有着独属于自己的梦与诗。或许,那烂漫的樱花并不是你心中最纯美的那首诗,但与它相遇,你,终归无悔!大阪是日本第二大都……用Python实现扫雷小游戏作者:野客来源:Python技术扫雷是一款益智类小游戏,最早于1992年由微软在Windows上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子……广汽埃安拿下183亿融资?估值千亿的广汽埃安真这么强?广汽埃安完成A轮融资最近一段时间,国内新能源汽车市场可谓是红火异常,在各大新能源汽车企业纷纷发出自己成绩单的时候,广汽埃安却不仅发成绩单更发出了自己的大额融资,拿到183亿融资……三分准绝杀,同曦新秀狂轰324,上海队4连败,西热力江连续庆CBA常规赛继续进行,近况不佳的上海队迎战同曦队。上海队主教练李春江无比渴望终结连败。十分精彩的一场比赛,双方苦战到末节最后一分钟,难分胜负。在加时赛中,同曦队皮特森上演三分准……欧盟态度迎来大反转,冯德莱恩宣布现阶段对俄石油禁运已难达成据英媒路透社报道,时隔22天后,欧洲试图对俄罗斯发起的第六轮制裁仍无头绪。在这之前欧盟28个国家响应美国,打算禁运俄罗斯的所有石油能源,但遭到了匈牙利等6个国家的一致反对,第一……都美竹,又来了都美竹,一个影响吴亦凡人生轨迹的00后,在2021年成功把吴亦凡打入监狱,翻身一跃成为百万粉丝的网红。虽说在感情上,被qj了,失去了贞操,但在事业上,有了巨大的关注度和流……年轻游客更爱露营,十大热门露营地榜单发布4月13日,马蜂窝发布《2022露营品质研究报告》。报告显示,74的露营爱好者来自一线及新一线城市,其中,北京、成都、上海、广州包揽露营客源地前四,对露营总游客量的贡献超过三成……收盘后,一个好消息来了,A股,周四行情预判三大指数横盘震荡,股票涨多跌少,新能源赛道,除了权重股之外,几乎都在反弹,为什么权重股没有表现呢?很简单,两市缩量了,而且新能源和白酒一样,都需要回调,6月份的拉升,有点……青椒配什么菜最好吃?推荐6种不同做法,简单美味,顿顿吃光盘青椒是一年四季都能吃到的食材,青椒果肉厚而脆嫩,维生素C含量丰富,青椒内的辛辣味能刺激唾液和胃液的分泌,所以吃青椒能增进食欲,帮助消化,春天是一个容易上火的季节,平时多吃点青椒……龙停山高明周眺,梵音绕巅一个闲暇的周末,约上友人,沿着1173级石阶登山路,俯拾而上,再一次站在海拔408米的龙停山顶。记不清多少次登临了,只记得每次都感到一路梵音袅袅,佛语绵绵;会当凌绝顶,一览众山……朱婷术后首次露面,中国女排主攻或迎年轻面孔北京时间4月6日凌晨,中国女排队长朱婷更新了个人社交平台,宣布自己正在进行术后康复。如今朱婷回归赛场还需要一段时间,对于李盈莹领衔的中国女排主攻线来说,她们要承担起朱婷和张常宁……如果乔丹没有中途退役,那他会不会成为第一个突破四万分的人?截至目前,詹姆斯的总得分为36873分,距离历史总得分第二的马龙只差55分,按照詹姆斯的场均得分计算,只需要两场比赛就可以超越马龙升至历史第二。下个赛季,詹姆斯大概率可以超越贾……
风云传奇王者之路新手快速变强新手必看攻略做完拉皮手术10年后,会老得更快,脸都没法看了女性是怎么怀上孩子的?你知道吗苹果市值暴跌万亿iPhone14无力回天汪小菲对前妻难以割舍,大S和具俊晔纹身秀恩爱,网友感慨万千早期冠心病症状有哪些?连女人都不如?利兹联女球迷怒喷维拉皮尔斯为何被捅11刀?还原夜店全过程,巨额赔偿金数字惊人麻辣味烤鱼跨品类拉新会成为2022年下半年的新经营致胜法宝吗?日常读书好句摘抄(3)realme首款平板正式官宣徐起重磅IP联名即将登场或是火影
人主造句用人主造句大全【歌词】NewYearsWithCarlWeathers歌手 家乡的青山内蒙古百去不厌的地方,可小住几日,水如画,云入梦,比成都安逸聪明人从不报复,他们匆匆离去,从头开始教教造句用教教造句大全公交司机的速度与激情如何保养磨砂皮磨砂皮的保养方法IG揭幕战险胜SN!新人上单狗熊单杀Bin,Rookie赛后宝宝咳嗽能吃果冻吗?宝宝多大可以吃果冻?用人单位的劳动合同法适用情况是怎样的?感恩亲情的作文500字热传聚热点网

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁