原标题:Python游戏:扫雷

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

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

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

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

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

classBlockStatus(Enum):

normal = 1# 未点击

opened = 2# 已点击

mine = 3# 地雷

flag = 4# 标记为地雷

ask = 5# 标记为问号

bomb = 6# 踩中地雷

hint = 7# 被双击的周围

double = 8# 正被鼠标左右键双击

classMine:

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

returnstr(self._value)

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

defget_x(self):

returnself._x

defset_x(self, x):

self._x = x

x = property(fget=get_x, fset=set_x)

defget_y(self):

returnself._y

defset_y(self, y):

self._y = y

y = property(fget=get_y, fset=set_y)

defget_value(self):

returnself._value

defset_value(self, value):

ifvalue:

self._value = 1

else:

self._value = 0

value = property(fget=get_value, fset=set_value, doc= '0:非地雷 1:雷')

defget_around_mine_count(self):

returnself._around_mine_count

defset_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= '四周地雷数量')

defget_status(self):

returnself._status

defset_status(self, value):

self._status = value

status = property(fget=get_status, fset=set_status, doc= 'BlockStatus')

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

classMineBlock:

def__init__(self):

self._block = [[Mine(i, j) fori inrange(BLOCK_WIDTH)] forj inrange(BLOCK_HEIGHT)]

# 埋雷

fori inrandom.sample(range(BLOCK_WIDTH * BLOCK_HEIGHT), MINE_COUNT):

self._block[i // BLOCK_WIDTH][i % BLOCK_WIDTH].value = 1

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

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

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

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

classMineBlock:

defopen_mine(self, x, y):

# 踩到雷了

ifself._block[y][x].value:

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

returnFalse

# 先把状态改为 opened

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

around = _get_around(x, y)

_sum = 0

fori, j inaround:

ifself._block[j][i].value:

_sum += 1

self._block[y][x].around_mine_count = _sum

# 如果周围没有雷,那么将周围8个未中未点开的递归算一遍

# 这就能实现一点出现一大片打开的效果了

if_sum == 0:

fori, j inaround:

ifself._block[j][i].around_mine_count == -1:

self.open_mine(i, j)

returnTrue

def_get_around(x, y):

"""返回(x, y)周围的点的坐标"""

# 这里注意,range 末尾是开区间,所以要加 1

return[(i, j) fori inrange(max( 0, x - 1), min(BLOCK_WIDTH - 1, x + 1) + 1)

forj inrange(max( 0, y - 1), min(BLOCK_HEIGHT - 1, y + 1) + 1) ifi != x orj != y]

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

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

classMineBlock:

defdouble_mouse_button_down(self, x, y):

ifself._block[y][x].around_mine_count == 0:

returnTrue

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

around = _get_around(x, y)

sumflag = 0# 周围被标记的雷数量

fori, j in_get_around(x, y):

ifself._block[j][i].status == BlockStatus.flag:

sumflag += 1

# 周边的雷已经全部被标记

result = True

ifsumflag == self._block[y][x].around_mine_count:

fori, j inaround:

ifself._block[j][i].status == BlockStatus.normal:

ifnotself.open_mine(i, j):

result = False

else:

fori, j inaround:

ifself._block[j][i].status == BlockStatus.normal:

self._block[j][i].status = BlockStatus.hint

returnresult

defdouble_mouse_button_up(self, x, y):

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

fori, j in_get_around(x, y):

ifself._block[j][i].status == BlockStatus.hint:

self._block[j][i].status = BlockStatus.normal

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

后台 “扫雷” 获取源码

责任编辑:

python 游戏扫雷_Python游戏:扫雷相关推荐

  1. python扫雷游戏代码_python实现扫雷游戏的示例

    扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷, 踩到雷则失败,需重新开始. 本文 ...

  2. python扫雷_python做扫雷

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下本文 ...

  3. python 游戏开发_Python游戏开发入门

    spContent=--玩游戏的最高境界是什么? --当然是设计一款属于自己的游戏! --设计游戏不是目的,从游戏看道理,从道理看人生,人生何尝不是属于自己的游戏? --"弹指之间·享受创新 ...

  4. 如何用python画帆船_python 游戏(船只寻宝)

    1. 游戏思路和流程图 实现功能:船只在可以在大海上移动打捞宝藏,船只可以扫描1格范围内的宝藏(后续难度,可以调整扫描范围,可以调整前进的格数) 游戏流程图 2. 使用模块和游戏提示 import r ...

  5. python玩扫雷_python实现扫雷小游戏

    前面我们用python实现了贪吃蛇.坦克大战.飞船大战.五子棋等游戏 今天我们用python来实现一下扫雷游戏 本游戏代码量和源文件较多 可以从我的GitHub地址中获取 构建地雷区import ra ...

  6. python游戏开发框架_Python游戏开发:数字华容道

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  7. python人工智能计算器_python游戏dnf_招募:基于python的召唤师全时段全技能(含均值AI)计算器全程测试......

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 √ 功能简介 借助Python跨平台.轻量化的优点,解决常规excel无法完成的准确AI.速度量化.CD量化.前后摇量化的问题,制作可以自动最优选择技能连 ...

  8. python arcade库_python游戏库:Arcade教程(4)

    动次打次+金币https://www.zhihu.com/video/1237694139854061568 步骤6-添加金币和音效 下面的代码添加了我们可以收集的硬币.它还添加了一个声音,当用户点击 ...

  9. python怎么制作游戏图片_Python游戏引擎开发(二):显示图片

    本篇文章是Python游戏引擎开发系列的第二篇文章,主要介绍如何显示图片,大家可以学习下. 在上一章中我们讲了如何创建窗口以及对界面进行重绘.可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大 ...

最新文章

  1. 推荐给程序员的书:七月图书推荐
  2. python 4.5%2_程序运行慢?你怕是写的假 Python
  3. 设置NotePad++设置不打开上次关闭的文件
  4. 安装Windows服务时出现试图加载格式不正确的程序或系统找不到指定的文件以及相关问题
  5. Webservice入门教程_编写天气预报的webservice
  6. python人工智能——机器学习——数据的划分和介绍
  7. mvn 本地jar包 加入自己的maven仓库
  8. 请求分页算法 Python实现
  9. ARC106E-Medals【hall定理,高维前缀和】
  10. jaxb 处理_休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程
  11. _.uniq_在Ruby中使用Array.compact和Array.uniq方法从Array中移除元素
  12. ASP.NET MVC 使用Log4Net在不同目录中记录不同类型的日志
  13. base64码通过http传输 +号变 空格 以及 图片编码后字符串较长导致POST提交失败 问题解决...
  14. java 获取音频文件时长
  15. Extjs4.2如何实现鼠标点击统计图时弹出窗口来展示统计的具体列表信息
  16. TDH 更新Inceptor UDF步骤
  17. 计算机网络基础 — Bypass 网卡
  18. html百度地图导航起点默认定位位置,百度地图如何设置起点
  19. 远程桌面连接服务器显示内部错误,解决远程桌面连接出现了内部错误
  20. centos安装部分开发软件

热门文章

  1. 前端知识点之关于SEO
  2. Dijkstra最短路径算法详细过程附C++详细代码
  3. 中国计划新建逾60万个5G基站
  4. 追格小程序重磅升级 新亮点来袭!
  5. mysql isnull()用法
  6. C# Winform 常用控件介绍
  7. 从老罗的坚果手机看手机软件创新
  8. 数组模拟实现队列(Java语言描述)
  9. Redis 缓存雪崩
  10. 【云原生与5G】微服务加持5G核心网