原标题: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. 【Linux】一步一步学Linux——ping命令(150)
  3. SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
  4. Three Bags CodeForces - 1467C
  5. 【Python文件处理】递归批处理文件夹子目录内所有txt数据
  6. OpenShift 4 - 用自定义的TLS证书对访问OpenShift的用户认证身份
  7. 系统无声音,播放器有声音
  8. 计算机普通用户禁止修改c盘,保护C盘数据win7中设置禁止修改C盘文件的方法
  9. pip install keras_常用基本pip命令及报错问题解决(不断更新)
  10. 简单理解JavaScript中的闭包
  11. 你的不好意思,正在摧毁你
  12. Hadoop_23_oozie
  13. 无废话aspose-words-18.6 java版破解
  14. 外卖类应用的竞争与趋势
  15. PROFINET非周期数据通信详解
  16. CS144 Lab1:StreamReAssemer
  17. 三种代码生成炫酷代码雨(推荐)
  18. html画布里面画圆,html5 canvas 画布画圆
  19. Unity支持的C#版本
  20. AWS 中文入门开发教学 35- MySQL@RDS - 建立MySQL数据库服务

热门文章

  1. 管理远程 Windows 剪贴板
  2. item_search - 虾皮根据关键词取商品列表
  3. windows下安装rattle包所踩的坑
  4. 离散数学学习笔记-02-对偶和范式
  5. 博图v15.1多用户服务器项目,博途 V15.1安装步骤
  6. RISC-V (CH32V103)与Cortex-M3内核(CH32F103)单片机中断延时测评
  7. 模拟不稳定的网络状况的软件clumsy
  8. deepin系统如何安装惠普打印机
  9. windows使用命令行压缩/解压文件
  10. 经典回顾超炫酷阅读效果3D Book使用方法