python 游戏扫雷_Python游戏:扫雷
原标题: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游戏:扫雷相关推荐
- python扫雷游戏代码_python实现扫雷游戏的示例
扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷, 踩到雷则失败,需重新开始. 本文 ...
- python扫雷_python做扫雷
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下本文 ...
- python 游戏开发_Python游戏开发入门
spContent=--玩游戏的最高境界是什么? --当然是设计一款属于自己的游戏! --设计游戏不是目的,从游戏看道理,从道理看人生,人生何尝不是属于自己的游戏? --"弹指之间·享受创新 ...
- 如何用python画帆船_python 游戏(船只寻宝)
1. 游戏思路和流程图 实现功能:船只在可以在大海上移动打捞宝藏,船只可以扫描1格范围内的宝藏(后续难度,可以调整扫描范围,可以调整前进的格数) 游戏流程图 2. 使用模块和游戏提示 import r ...
- python玩扫雷_python实现扫雷小游戏
前面我们用python实现了贪吃蛇.坦克大战.飞船大战.五子棋等游戏 今天我们用python来实现一下扫雷游戏 本游戏代码量和源文件较多 可以从我的GitHub地址中获取 构建地雷区import ra ...
- python游戏开发框架_Python游戏开发:数字华容道
今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...
- python人工智能计算器_python游戏dnf_招募:基于python的召唤师全时段全技能(含均值AI)计算器全程测试......
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 √ 功能简介 借助Python跨平台.轻量化的优点,解决常规excel无法完成的准确AI.速度量化.CD量化.前后摇量化的问题,制作可以自动最优选择技能连 ...
- python arcade库_python游戏库:Arcade教程(4)
动次打次+金币https://www.zhihu.com/video/1237694139854061568 步骤6-添加金币和音效 下面的代码添加了我们可以收集的硬币.它还添加了一个声音,当用户点击 ...
- python怎么制作游戏图片_Python游戏引擎开发(二):显示图片
本篇文章是Python游戏引擎开发系列的第二篇文章,主要介绍如何显示图片,大家可以学习下. 在上一章中我们讲了如何创建窗口以及对界面进行重绘.可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大 ...
最新文章
- 接口测试用例测试模板
- 【Linux】一步一步学Linux——ping命令(150)
- SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
- Three Bags CodeForces - 1467C
- 【Python文件处理】递归批处理文件夹子目录内所有txt数据
- OpenShift 4 - 用自定义的TLS证书对访问OpenShift的用户认证身份
- 系统无声音,播放器有声音
- 计算机普通用户禁止修改c盘,保护C盘数据win7中设置禁止修改C盘文件的方法
- pip install keras_常用基本pip命令及报错问题解决(不断更新)
- 简单理解JavaScript中的闭包
- 你的不好意思,正在摧毁你
- Hadoop_23_oozie
- 无废话aspose-words-18.6 java版破解
- 外卖类应用的竞争与趋势
- PROFINET非周期数据通信详解
- CS144 Lab1:StreamReAssemer
- 三种代码生成炫酷代码雨(推荐)
- html画布里面画圆,html5 canvas 画布画圆
- Unity支持的C#版本
- AWS 中文入门开发教学 35- MySQL@RDS - 建立MySQL数据库服务