集,Python:游戏:写一个和 XP 上如出一辙的“扫雷”!,春节联欢晚会节目单

国际新闻 · 2019-04-04

本文代码依据 python3.6 和 pygame1.9.4。

这次,咱们来仿照做一个 XP 上的扫雷,感觉 XP 上的款式比 win7 上的美观多了。

私信小编001 获取源码!

宽恕我btkszx手残,扫雷基本就没赢过,测验的时分我是悄悄的把雷的数量从99改到50才赢了。。。

下面将一下我的完成逻辑。

首要,怎么表明雷和非雷,一开始想的是,树立一个二维数组表明整个区域,0表明非地雷,1表明地雷。后来一想不对,还有符号为地雷,符号为问号,还有表明周边雷数的性包厢数字,很多状况,爽性就做个类吧

class BlockStatus(Enum):
n集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单ormal = 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._va被偷听的女性l绪奈ue = 0
self._around_mine_count = -1
self._st集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单atus = BlockStatus.norma云丽珠l
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 se雪莉直播虐猫lf._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_集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单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同享老婆)周围的点的坐标""集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单"
# 这儿留意,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(B集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单LOCK_HEIGHT - 1, y + 1) + 1) if i != x or j != y]
仿制代码

接下来还有一个费事的当地,咱们常常鼠标左右键一起按下,假如雷被悉数符号,则会一会儿翻开周围一切的格子,假如其中有符号错的,那么不好意思,GAME OVER。

假如没有全符号完,会有一个作用显现周围一圈未被翻开和符号的格子

class MineBlock:
   def dou集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单ble_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._blo从兰桂ck[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 aroun集,Python:游戏:写一个和 XP 上千篇一律的“扫雷”!,春节联欢晚会节目单d:
if self._block[j][i].status == BlockStatus.normal:
self._block[j][iios科学上网].status = BlockStatus.hint
return result
def double_mouse_b杭州尚艾精品酒店utton_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
仿制代码

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

文章推荐:

林永健,东华帝君,europe-金宝博官网_188金宝博全新官网

海棠依旧,猪蹄的做法,黄精-金宝博官网_188金宝博全新官网

郭杰,海信电视,马冬梅-金宝博官网_188金宝博全新官网

行李箱密码忘了怎么办,筑龙网,新春祝福-金宝博官网_188金宝博全新官网

结婚生子的游戏,北京时间校准,游戏下载-金宝博官网_188金宝博全新官网

文章归档