Python游戏:扫雷

用 Python 实现扫雷小游戏! 扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷, 踩到雷则失败,需重新开始。 本文我们使用 Python 来实现扫雷游戏,主要用的 Python 库是 pygame。 实现 游戏组成比较简单,主要包括:小方格、计时器、地雷等。 首先,我们初始化一些常量,比如:横竖方块数、地雷数、鼠标点击情况等,如下所示: BLOCK_WIDTH = 30 BLOCK_HEIGHT = 16 # 阅读详情

本文代码基于 python3.6 和 pygame1.9.4。

这次,我们来模仿做一个 XP 上的扫雷,感觉 XP 上的样式比 win7 上的好看多了。

原谅我手残,扫雷基本就没赢过,测试的时候我是偷偷的把雷的数量从99改到50才赢了。。。

下面将一下我的实现逻辑。

首先,如何表示雷和非雷,一开始想的是,建立一个二维数组表示整个区域,0表示非地雷,1表示地雷。后来一想不对,还有标记为地雷,标记为问号,还有表示周边雷数的数字,好多状态,干脆就做个类吧

class BlockStatus(Enum):
    normal = 1  # 未点击
    opened = 2  # 已点击
    mine = 3    # 地雷
    flag = 4    # 标记为地雷
    ask = 5   # 标记为问号
    bomb = 6    # 踩中地雷
    hint = 7    # 被双击的周围
    double = 8  # 正被鼠标左右键双击


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 = BlockStatus.normal
        self.set_value(value)

    def __repr__(self):
        return str(self._value)
        # return f'({self._x},{self._y})={self._value}, status={self.status}'

    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')

布雷就很简单了,随机取99个数,从上往下顺序排就是了。

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

我们点击一个格子的时候,只要根据点击的坐标,找到对应的 Mine,看它的值是多少,就知道有没有踩中雷了。

如果没踩中雷的话,要计算周边8个位置中有几个雷,以便显示对应的数字。

如果周边有雷,那么显示数字,这个简单,可是如果周边没有雷,那就要显示一片区域,直到有雷出现,如下图,我只点了当中一下,就出现了那么大一片区域

这个计算其实也容易,只要用递归就可以了,如果计算出周围的雷数为0,则递归计算周边8个位置的四周雷数,直到雷数不为0。

class MineBlock:
  def open_mine(self, x, y):
        # 踩到雷了
        if self._block[y][x].value:
            self._block[y][x].status = BlockStatus.bomb
            return False

        # 先把状态改为 opened
        self._block[y][x].status = BlockStatus.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 _get_around(x, y):
    """返回(x, y)周围的点的坐标"""
    # 这里注意,range 末尾是开区间,所以要加 1
    return [(i, j) for i in range(max(0, x - 1), min(BLOCK_WIDTH - 1, x + 1) + 1)
            for j in range(max(0, y - 1), min(BLOCK_HEIGHT - 1, y + 1) + 1) if i != x or j != y]

接下来还有一个麻烦的地方,我们经常鼠标左右键同时按下,如果雷被全部标记,则会一下子打开周围所有的格子,如果其中有标记错的,那么不好意思,GAME OVER。

如果没有全标记完,会有一个效果显示周围一圈未被打开和标记的格子

class MineBlock:
   def double_mouse_button_down(self, x, y):
        if self._block[y][x].around_mine_count == 0:
            return True

        self._block[y][x].status = BlockStatus.double

        around = _get_around(x, y)

        sumflag = 0     # 周围被标记的雷数量
        for i, j in _get_around(x, y):
            if self._block[j][i].status == BlockStatus.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 == BlockStatus.normal:
                    if not self.open_mine(i, j):
                        result = False
        else:
            for i, j in around:
                if self._block[j][i].status == BlockStatus.normal:
                    self._block[j][i].status = BlockStatus.hint
        return result

    def double_mouse_button_up(self, x, y):
        self._block[y][x].status = BlockStatus.opened
        for i, j in _get_around(x, y):
            if self._block[j][i].status == BlockStatus.hint:
                self._block[j][i].status = BlockStatus.normal

扫雷的主要逻辑就这么多,剩下来的就是一些杂七杂八的事件了。

后台 “扫雷” 获取源码

近期热门:

就这么简单!20行Python代码爬取腾讯视频

只要3步,菜鸟也能用Python做个逗逼的表情包

点击下方“阅读全文”了解更多

用python做的小游戏:扫雷 导语 正文 总结 免费的完整项目源码领取处: 私信小编09获取或者点击这行蓝色字体也可免费拿! 私信小编09获取或者点击这行蓝色字体也可免费拿呦~ 阅读详情

相关推荐

Python游戏:扫雷 (附源码)

这次我们基于 pygame 来做一个扫雷,我所有的代码都是基于 python 3.6 的

ZGR_YJJ的博客 1万+

python之扫雷小游戏(附代码)

这是之前做的一个扫雷小游戏.代码如下(有一些bug请多见谅!)。 #-*- cdoeing = utf-8 -*- #@Time : 2020-12-08 #@Author : LBOcean """ 对象: 棋盘: 属性:长, 宽, 雷, 盘面 方法: 生成盘面, 设置雷的个数、长、宽, 翻牌, 判断输赢 """ from random import randint import sys class Pan: def __init__(se.

LBOcean的博客 7699

带你用Python制作一个经典小游戏:扫雷

超级经典!超级好玩!

阿玥的小博客 3773

Python-扫雷游戏【附完整源码】

《扫雷》是一款大众类的益智小游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。这个游戏的玩法很简单,雷区中随机布置一定数量的地雷,玩家需要尽快找出所有不是地雷的方块;如果玩家翻开的方块有地雷,则游戏结束

qiao_yue的博客 6796

01_MySQL下载、安装与配置(以MySQL8.0.31版本为例)

1.点击下载好的mysql安装包 进入到mysql installer界面。2.选择MySQL Servers选项 一直下拉。

4819

Win10 有线网卡配置静态IP后,出现两个IPv4地址的解决方法

在我使用有线网络连接局域网时,配置了静态IP之后,发现网络并没有通,检查之后发现“以太网状态”-“网络连接详细信息”中,出现了2个IPv4的地址(一个是DHCP分配的169.254.xx.xx的IP,另一个是我配置的静态地址),但是网络是没有正常与我所配置的静态地址正常通信的。这个是我执行后的截图,重启电脑后以太网配置静态IP,恢复正常。最终我查了好多网络上的解决办法,有些办法并没有解决我的问题。这个是网上别人的问题截图,我的也是类似这种。第一种(没有解决我的问题)第二种(没有解决我的问题)

Zlz_Nike的博客 2万+

python实现《扫雷》小游戏

主程序不到60行就完成了《扫雷》经典小游戏,你确定不来看看嘛

qq_65120254的博客 1万+

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2977

python版扫雷(基于tkinter),教你学python

python版本扫雷游戏,具有标准模板tkinter,学习python啦!!!

boonion的博客 7516

基于STM32的智能衣柜系统开发实战(附完整源码与硬件设计)

本文详细介绍了基于STM32的智能衣柜系统开发实战,包括硬件设计、软件架构和云端功能实现。系统具备实时温湿度监控、自动加热除湿、紫外线杀菌等核心功能,通过STM32F103C8T6主控芯片和ESP8266无线模块实现智能控制。附完整源码与硬件设计,适合科技爱好者和开发者参考。

peach的博客 781

【WorkBuddy专栏27】WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆

WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆

AI人人懂 2677

python 游戏扫雷_Python游戏:扫雷

原标题:Python游戏:扫雷本文代码基于 python3.6 和 pygame1.9.4。这次,我们来模仿做一个 XP 上的扫雷,感觉 XP 上的样式比 win7 上的好看多了。 原谅我手残,扫雷基本就没赢过,测试的时候我是偷偷的把雷的数量从99改到50才赢了。。。下面将一下我的实现逻辑。首先,如何表示雷和非雷,一开始想的是,建立一个二维数组表示整个区域,0表示非地雷,1表示地雷。后来一想不对,...

weixin_39838328的博客 246

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1675

Python 游戏:扫雷

本文代码基于 python 3.6,pygame 1.9.4 先看截图,仿照 XP 上的扫雷做的,感觉 XP 上的样式比 win7 上的好看多了。 原谅我手残,扫雷基本就没赢过,测试的时候我是偷偷的把雷的数量从99改到50才赢了。。。 代码虽然不多,但加上注释和空行也有350行,另外还有一些图片资源,就不全帖上来了,可以扫码关注我的公众号,后台回复“扫雷”获取源码及资源。 下...

guliang21的专栏 1万+

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2932

海康DS-7604N-K1/RTB固件包

【摘要】海康DS-7604N-K1/RTB萤石云设备发布V4.30.091版本升级程序(2022.09.19),仅适用于指定型号。升级前需先升级至V3.4.106基础版本,刷机会重置设备为未激活状态,需重新设置admin密码。该机型支持密码/手势登录,无密码时可通过U盘升级。注意事项:升级存在风险,需确认程序适用性;升级过程严禁断电;必须阅读压缩包内的刷机说明。此为定制机型,非必要不建议升级。(150字)

海康威视技术支持 1575

Python:游戏:扫雷

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。 作者: 丹枫无迹 公众号:大龄码农的Python之路本文代码基于 py...

简书博客搬家测试账号 481

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python 小游戏:扫雷

本文使用Pygame实现的简化版扫雷游戏。生成雷区左键点击扫雷右键标记地雷显示数字提示等。

Henry的博客 2673

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python游戏扫雷附源码_Python:游戏:扫雷(附源码)

importsysimporttimefrom enum importEnumimportpygamefrom pygame.locals import *from mineblock import *#游戏屏幕的宽SCREEN_WIDTH = BLOCK_WIDTH *SIZE#游戏屏幕的高SCREEN_HEIGHT = (BLOCK_HEIGHT + 2) *SIZEclassGameStat...

weixin_39712705的博客 1142

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

编程入门的有趣实践:用Python玩转经典扫雷游戏

想象一下,你的一行行代码变成了一个有趣的游戏,这不仅是学习编程的最好方式,也是展示你技能的舞台。当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。然后,我们用Turtle来绘制网格,处理玩家的点击事件,以及标记雷区和揭示周围雷数的逻辑。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

白帽阿叁的博客 1586

python小游戏扫雷怎么玩_Python:游戏:扫雷(附源码)

这次我们基于 pygame 来做一个扫雷,上次有园友问我代码的 python 版本,我说明一下,我所有的代码都是基于 python 3.6 的。先看截图,仿照 XP 上的扫雷做的,感觉 XP 上的样式比 win7 上的好看多了。学习Python中有不明白推荐加入交流群号:960410445群里有志同道合的小伙伴,互帮互助,群里有不错的视频学习教程和PDF!image原谅我手残,扫雷基本就没赢过,测...

weixin_40009393的博客 415

Python扫雷游戏:期末作业的完美选择

Python扫雷游戏:期末作业的完美选择 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在期末作业的紧张氛围中,寻找一个既有趣又能提升编程技能的项目是每个学生的梦想。Python扫雷游戏正是这样一个理想的选择。这个开源项目提供了一个完整的Python扫雷游戏资源文件,不仅包含了实现扫雷游戏核心功能的源代码,还附带了详细的文档,帮助你快速理解和实现一个功能齐全的扫雷游戏...

gitblog_06669的博客 508

自动扫雷:运用Python征服Windows经典扫雷游戏

自动扫雷:运用Python征服Windows经典扫雷游戏 项目介绍 自动扫雷(Automatic-minesweeping) 是一个旨在自动化玩转Windows XP经典版本扫雷游戏的开源项目。该项目由Python 3.7驱动,利用编程智能应对扫雷中的逻辑挑战。开发者通过结合numpy进行高效矩阵运算,Pillow库用于截取游戏画面分析,以及pywin32来实现对游戏窗口的操作,如模拟鼠标点击和键...

gitblog_00726的博客 578

python做扫雷游戏_GitHub - kinegratii/minesweeper: Python代码编写的扫雷游戏

Minesweeper(扫雷)这是一个由Python编写的扫雷游戏,基于tkinter/Tkinter开发,支持python2和python3。功能概述基本功能:左键扫雷,右键标记记录游戏步数和时间游戏重置:同一地图可进行多次游戏自定义地图参数,默认提供初级、中级、高级三个级别算法概述游戏算法总体为一个有限状态机。一共有游戏中、成功、失败,其中后两种为最终状态。状态转化为点击某个方格。游戏的动作是...

weixin_31075273的博客 290

FreeSimpleGUI游戏开发:从扫雷到棋牌的Python GUI游戏实现

想要用Python创建交互式游戏界面,却担心GUI开发过于复杂?FreeSimpleGUI为你提供了一个简单易用的解决方案!🎮 这个免费的Python GUI库让游戏开发变得前所未有的简单,无论是经典的扫雷游戏还是复杂的棋牌游戏,都能轻松实现。 ## 为什么选择FreeSimpleGUI进行游戏开发? FreeSimpleGUI是一个功能强大的Python GUI库,它最大的优势就是**简单

gitblog_00418的博客 943

从零实现Python扫雷游戏:完整开发指南与深度解析

扫雷作为Windows经典游戏,承载了许多人的童年回忆。本文将详细介绍如何使用Python和Tkinter库从零开始构建一个功能完整的扫雷游戏,涵盖游戏设计、算法实现和界面开发的全过程。

盹猫的博客 1万+
上一篇: Python 2 与 3 共存了 11 年,新年就要和它告别
下一篇: 只因接了一个电话,程序员被骗 30 万!
菜鸟学Python
博客等级 码龄9年 8061粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值