范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

用Python实现扫雷小游戏

  作者:野客
  来源:Python 技术
  扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷, 踩到雷则失败,需重新开始。
  本文我们使用 Python 来实现扫雷游戏,主要用的 Python 库是 pygame。  实现
  游戏组成比较简单,主要包括:小方格、计时器、地雷等。
  首先,我们初始化一些常量,比如:横竖方块数、地雷数、鼠标点击情况等,如下所示:  BLOCK_WIDTH = 30 BLOCK_HEIGHT = 16 # 块大小 SIZE = 20 # 地雷数 MINE_COUNT = 66 # 未点击 normal = 1 # 已点击 opened = 2 # 地雷 mine = 3 # 标记为地雷 flag = 4 # 标记为问号 ask = 5 # 踩中地雷 bomb = 6 # 被双击的周围 hint = 7 # 正被鼠标左右键双击 double = 8 readied = 1, started = 2, over = 3, win = 4
  接着定义一个地雷类,类中定义一些基本属性(如:坐标、状态等)及 get、set 方法,代码实现如下:  class Mine:     def __init__(self, x, y, value=0):         self._x = x         self._y = y         self._value = 0         self._around_mine_count = -1         self._status = normal         self.set_value(value)     def __repr__(self):         return str(self._value)     def get_x(self):         return self._x     def set_x(self, x):         self._x = x     x = property(fget=get_x, fset=set_x)     def get_y(self):         return self._y     def set_y(self, y):         self._y = y     y = property(fget=get_y, fset=set_y)     def get_value(self):         return self._value     def set_value(self, value):         if value:             self._value = 1         else:             self._value = 0     value = property(fget=get_value, fset=set_value, doc="0:非地雷 1:雷")     def get_around_mine_count(self):         return self._around_mine_count     def set_around_mine_count(self, around_mine_count):         self._around_mine_count = around_mine_count     around_mine_count = property(fget=get_around_mine_count, fset=set_around_mine_count, doc="四周地雷数量")     def get_status(self):         return self._status     def set_status(self, value):         self._status = value     status = property(fget=get_status, fset=set_status, doc="BlockStatus")
  再接着定义一个 MineBlock 类,用来处理扫雷的基本逻辑,代码实现如下:  class MineBlock:     def __init__(self):         self._block = [[Mine(i, j) for i in range(BLOCK_WIDTH)] for j in range(BLOCK_HEIGHT)]         # 埋雷         for i in random.sample(range(BLOCK_WIDTH * BLOCK_HEIGHT), MINE_COUNT):             self._block[i // BLOCK_WIDTH][i % BLOCK_WIDTH].value = 1     def get_block(self):         return self._block     block = property(fget=get_block)     def getmine(self, x, y):         return self._block[y][x]     def open_mine(self, x, y):         # 踩到雷了         if self._block[y][x].value:             self._block[y][x].status = bomb             return False         # 先把状态改为 opened         self._block[y][x].status = opened         around = _get_around(x, y)         _sum = 0         for i, j in around:             if self._block[j][i].value:                 _sum += 1         self._block[y][x].around_mine_count = _sum         # 如果周围没有雷,那么将周围 8 个未中未点开的递归算一遍         if _sum == 0:             for i, j in around:                 if self._block[j][i].around_mine_count == -1:                     self.open_mine(i, j)         return True     def double_mouse_button_down(self, x, y):         if self._block[y][x].around_mine_count == 0:             return True         self._block[y][x].status = double         around = _get_around(x, y)         # 周围被标记的雷数量         sumflag = 0         for i, j in _get_around(x, y):             if self._block[j][i].status == flag:                 sumflag += 1         # 周边的雷已经全部被标记         result = True         if sumflag == self._block[y][x].around_mine_count:             for i, j in around:                 if self._block[j][i].status == normal:                     if not self.open_mine(i, j):                         result = False         else:             for i, j in around:                 if self._block[j][i].status == normal:                     self._block[j][i].status = hint         return result     def double_mouse_button_up(self, x, y):         self._block[y][x].status = opened         for i, j in _get_around(x, y):             if self._block[j][i].status == hint:                 self._block[j][i].status = normal
  我们接下来初始化界面,首先生成由小方格组成的面板,主要代码实现如下:  for row in block.block:  for mine in row:   pos = (mine.x * SIZE, (mine.y + 2) * SIZE)   if mine.status == opened:    screen.blit(img_dict[mine.around_mine_count], pos)    opened_count += 1   elif mine.status == double:    screen.blit(img_dict[mine.around_mine_count], pos)   elif mine.status == bomb:    screen.blit(img_blood, pos)   elif mine.status == flag:    screen.blit(img_flag, pos)    flag_count += 1   elif mine.status == ask:    screen.blit(img_ask, pos)   elif mine.status == hint:    screen.blit(img0, pos)   elif game_status == over and mine.value:    screen.blit(img_mine, pos)   elif mine.value == 0 and mine.status == flag:    screen.blit(img_error, pos)   elif mine.status == normal:    screen.blit(img_blank, pos)
  看一下效果:
  再接着添加面板的 head 部分,包括:显示雷数、重新开始按钮(笑脸)、显示耗时,主要代码实现如下:  print_text(screen, font1, 30, (SIZE * 2 - fheight) // 2 - 2, "%02d" % (MINE_COUNT - flag_count), red) if game_status == started:  elapsed_time = int(time.time() - start_time) print_text(screen, font1, SCREEN_WIDTH - fwidth - 30, (SIZE * 2 - fheight) // 2 - 2, "%03d" % elapsed_time, red) if flag_count + opened_count == BLOCK_WIDTH * BLOCK_HEIGHT:  game_status = win if game_status == over:  screen.blit(img_face_fail, (face_pos_x, face_pos_y)) elif game_status == win:  screen.blit(img_face_success, (face_pos_x, face_pos_y)) else:  screen.blit(img_face_normal, (face_pos_x, face_pos_y))
  看一下效果:
  再接着添加各种点击事件,代码实现如下:  for event in pygame.event.get():  if event.type == QUIT:   sys.exit()  elif event.type == MOUSEBUTTONDOWN:   mouse_x, mouse_y = event.pos   x = mouse_x // SIZE   y = mouse_y // SIZE - 2   b1, b2, b3 = pygame.mouse.get_pressed()   if game_status == started:    # 鼠标左右键同时按下,如果已经标记了所有雷,则打开周围一圈;如果还未标记完所有雷,则有一个周围一圈被同时按下的效果    if b1 and b3:     mine = block.getmine(x, y)     if mine.status == opened:      if not block.double_mouse_button_down(x, y):       game_status = over  elif event.type == MOUSEBUTTONUP:   if y < 0:    if face_pos_x <= mouse_x <= face_pos_x + face_size       and face_pos_y <= mouse_y <= face_pos_y + face_size:     game_status = readied     block = MineBlock()     start_time = time.time()     elapsed_time = 0     continue   if game_status == readied:    game_status = started    start_time = time.time()    elapsed_time = 0   if game_status == started:    mine = block.getmine(x, y)    # 按鼠标左键    if b1 and not b3:     if mine.status == normal:      if not block.open_mine(x, y):       game_status = over    # 按鼠标右键    elif not b1 and b3:     if mine.status == normal:      mine.status = flag     elif mine.status == flag:      mine.status = ask     elif mine.status == ask:      mine.status = normal    elif b1 and b3:     if mine.status == double:      block.double_mouse_button_up(x, y)
  我们来看一下最终实现效果:
  总结
  本文我们通过 Python 简单的实现了扫雷游戏,大家有兴趣的话,可以实际操作一下,看看自己能否排除全部的雷。

如何充分发挥家用空气消毒机的效能?目前家用空气消毒机常用净化消毒的机构,使用较多的几大类紫外线空气消毒机等离子空气消毒机复合式空气消毒机。紫外线空气消毒机是指以HEPAHE活性炭为过滤器,而紫外线为消毒器的消毒设备创业90会失败,为什么还会有人创业创业这个词,在今天听到就觉得失败的概率高达90,在708090年代,创业这个词是成功人士的标配,在那个年代创业成功率高达70,在人人向往单位工厂的安稳生活,就有一批有想法的青年就开热搜第一,中学教师面试,一大半都是博士现在当教师门槛越来越高!没有博士文凭,想当老师也太难了,正所谓金九银十,招聘也到了旺季,与往年相比,今年的教师岗位竞争相当激烈,在微博上的热搜第一中学教师面试,一大半都是博士的话题财政部公开新政策,年终奖缴税将有大变化,事关所有人从2022年1月1日起,年终奖就要并入当年综合所得一并计算缴纳个人所得税了,而今年(2021年)内的年终奖收入仍可以单独计税。小编帮大家算了算,年内发年后发,到手奖金可能差上万元!身边成功人士分享的创业法则,记住这七点,能让你受益终身分享几个身边成功人士创业法则,记住这七点对于你未来是会有巨大的帮助!快速的抄袭以及模仿如果想快速融入一个行业,如果靠摸爬滚打绝对是进不去的,你的同行在这一行混迹了几十年,他们非常熟使用移动式空气消毒机有哪些优势?众多空气消毒机厂家陆续推出不同款式用途的空气消毒机,其中移动式空气消毒机是众多空气消毒机中最受欢迎的空气消毒机之一。谈到移动式空气消毒机,通常会联想到其使用的脚轮,只需轻轻用力就能固态硬盘别瞎买,这样选不被坑固态硬盘的好处相信大家都知道,除了能让电脑开机快游戏进图快之外,还能大幅提升系统运行速度,除了空间小一些外基本上全都是有优点。如何挑选一块合适的固态硬盘就成为很多小伙伴头疼的事,那全国最快地铁开通,时速达160公里!广州这座城市太幸福了9月28日1400,十八号线首通段(冼村至万顷沙)自9月28日1400起开通运营。这条时速达160公里的快速轨道交通将实现南沙副中心至广州中心城区30分钟的时空目标。据介绍,18号这3本书,帮你找到成功的捷径1风投的选择本书作者TarangShah采访了投资界最杰出的风险投资人,如RoelofBothaMikeMaplesRandyKomisar等,讲述了他们发现前途无量的市场产品和创VIVO三星联合推出5G芯片双模AI自从国内手机市场正式进入5G时代后,像华为这样的厂家就吸引了大量的关注,而国内的其他厂家自然也是不甘落后。北京时间11月7日,VIVO方面正式公布了和三星联合研发的双模5GAI芯片比起室外空气雾霾,室内污染物也不容忽视雾霾天气是一种严重影响人们日常生活工作的天气。雾霾是由雾和霾所构成,其中空气中的灰尘硫酸等颗粒污染物组成的气溶胶,导致可见度严重受影响的叫霾而雾则是由大量悬浮在近地面空气微小颗粒的
远勤山大运做新能源汽车没理由不成功大运剑指新能源汽车,依旧风驰电掣。山西地方政府的支持自身的不断进取开放共赢的合作心态以及来自过去二十余年两次华丽转身所积累下来的自信远勤山的大运汽车在新能源汽车市场的发展依旧风驰电1000元左右的智能手机,买给50多岁的父母用,有什么性价比高的推荐?一般父母都不会玩儿游戏的,只是刷刷抖音聊聊微信以日常使用更加注重续航性能,其他不是很重要,所以选择以下几款手机供你参考。荣耀9X荣耀9X现在的销量非常火,主要是处理器比较给力,麒麟支持苹果Homekit,智慧家居安全家庭,绿米摄像头G3摄像头体验苹果公司自从2016年宣布,建筑开发商开始支持Homekit,简单来讲,就是通过苹果的设备里面的Home软件,可以统一管理所有支持Homekit的设备,只需要一个App就足够了,它全面对比小米平板55Pro与华为MatePad11,看看究竟哪款更适合你说起8月10号晚上的小米发布会,最令人瞩目的产品可能就是小米MIX4以及小米平板5系列了!大家对于小米平板5也是期待已久,毕竟距离上一次小米发布平板已经有三年之久,而它最终的配置和7号冰能让地球瞬间毁灭是真的吗?有何科学依据?一什么是7号冰有一种新的冰。它以超过1,000mph(1,600kmh)的速度形成,它深深地藏在我们的脚下,它可能破坏对外星生命的希望,最后,科学家们了解了它的工作原理。早在三月,假如宇宙没有生命,那么宇宙存在的意义是什么?如果地球上不存在任何生命,宇宙里也是不存在任何生命,这样的宇宙也可能有,根据多元宇宙理论,不同参数的宇宙是可能存在的。但我们讨论这样的问题也没有意义,既然地球有生命,我们可以换个角三星手机既然可以装外置储存卡,那区分64G版本,128G版本有什么意义?感谢邀请三星手机既然可以装外置储存卡,那区分64G版本,128G版本有什么意义?有些买手机的时候,正是看中了内存拓展这项功能,虽然不是每个人都需要的,但是有些人来说是必不可少的,所Firefox发布数据报告,在全球范围流失了近5000万用户出品开源中国文Travis无论是国外的EdgeBraveVivaldi,还是国产的360浏览器QQ浏览器,上述这些第三方的浏览器均采用了Chromium引擎,Mozilla的Fir学习大数据需要学习机器学习吗?如今,大数据技术的发展使得我们的生活变得更加便利,更加智能化,作为一门交叉型的IT技术,在学习大数据的时候需要学习机器学习吗?机器学习的概念机器学习是一门涉及概率论统计学近似理论凸摩托罗拉edge轻奢版评测国际大厂血统轻薄极致之选文姚华对于国内用户来说,摩托罗拉曾是手机的代名词,尤其是熟悉的HelloMoto铃声,更是经典。实力不负期待,惊艳源于热爱。2021年8月5日,联想中国区手机事业部总经理陈劲在摩托我的硬盘的数据想要恢复,应该怎么做?现在人人都用电脑,难免可能会遇到硬盘数据丢失这种事情。遇到了也不用怕,硬盘数据恢复有很多软件。找比较靠谱的大厂正品恢复软件,多半可以解决你的问题。我在这里介绍几款给题主!1万兴恢复