python实战游戏之史上最难最虐的扫雷游戏没有之一
作者:顾木子吖 发布时间:2021-03-08 04:43:03
标签:python,扫雷,游戏
导语
每日游戏更新系列——今天带大家来看看扫雷小游戏!
它是许多人接触到的第一款游戏,大概也是广大办公族和无网学生无聊时消遣的最佳游戏。
在那些还没有网(被切断网)的岁月,扫雷曾陪伴无数人度过了他们的童年。你的最佳纪录是多少了?
对于许多90后、00后来说,扫雷这个电脑上自带的小游戏早就变成古早的历史,再一次提到扫雷这个名字的时候,对许多人来说,仿佛就是上世纪的事情了。
就像是偶尔点开微信的跳一跳小游戏,发现排行榜上还有人在孤独的霸榜一样。已经2021年了,还有许多90后、00后坚守在扫雷这个游戏上~
首先准备好相应的素材可自选:
环境安装:依旧是游戏模块pygame,python3.6,pycharm2021。
pip install pygame
游戏规则:
在有限的时间里面用最短的时间找到所有的雷,每个数字代表附近有几颗雷,踩到雷结束,找到全部的雷即过关。
导入所有的字体,图片等:
def main():
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('扫雷小游戏')
images = {}
for key, value in cfg.IMAGE_PATHS.items():
if key in ['face_fail', 'face_normal', 'face_success']:
image = pygame.image.load(value)
images[key] = pygame.transform.smoothscale(image, (int(cfg.GRIDSIZE*1.25), int(cfg.GRIDSIZE*1.25)))
else:
image = pygame.image.load(value).convert()
images[key] = pygame.transform.smoothscale(image, (cfg.GRIDSIZE, cfg.GRIDSIZE))
font = pygame.font.Font(cfg.FONT_PATH, cfg.FONT_SIZE)
pygame.mixer.music.load(cfg.BGM_PATH)
pygame.mixer.music.play(-1)
定义表情按钮,点开微笑即可重新开始游戏!
class EmojiButton(pygame.sprite.Sprite):
def __init__(self, images, position, status_code=0, **kwargs):
pygame.sprite.Sprite.__init__(self)
# 导入图片
self.images = images
self.image = self.images['face_normal']
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
# 表情按钮的当前状态
self.status_code = status_code
'''画到屏幕上'''
def draw(self, screen):
# 状态码为0, 代表正常的表情
if self.status_code == 0:
self.image = self.images['face_normal']
# 状态码为1, 代表失败的表情
elif self.status_code == 1:
self.image = self.images['face_fail']
# 状态码为2, 代表成功的表情
elif self.status_code == 2:
self.image = self.images['face_success']
# 绑定图片到屏幕
screen.blit(self.image, self.rect)
'''设置当前的按钮的状态'''
def setstatus(self, status_code):
self.status_code = status_code
随机生成雷:
class MinesweeperMap():
def __init__(self, cfg, images, **kwargs):
self.cfg = cfg
# 雷型矩阵
self.mines_matrix = []
for j in range(cfg.GAME_MATRIX_SIZE[1]):
mines_line = []
for i in range(cfg.GAME_MATRIX_SIZE[0]):
position = i * cfg.GRIDSIZE + cfg.BORDERSIZE, (j + 2) * cfg.GRIDSIZE
mines_line.append(Mine(images=images, position=position))
self.mines_matrix.append(mines_line)
# 随机埋雷
for i in random.sample(range(cfg.GAME_MATRIX_SIZE[0]*cfg.GAME_MATRIX_SIZE[1]), cfg.NUM_MINES):
self.mines_matrix[i//cfg.GAME_MATRIX_SIZE[0]][i%cfg.GAME_MATRIX_SIZE[0]].burymine()
count = 0
for item in self.mines_matrix:
for i in item:
count += int(i.is_mine_flag)
# 游戏当前的状态
self.status_code = -1
# 记录鼠标按下时的位置和按的键
self.mouse_pos = None
self.mouse_pressed = None
记录方格状态,是不是点开了雷,状态如何。
class Mine(pygame.sprite.Sprite):
def __init__(self, images, position, status_code=0, **kwargs):
pygame.sprite.Sprite.__init__(self)
# 导入图片
self.images = images
self.image = self.images['blank']
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
# 雷当前的状态
self.status_code = status_code
# 真雷还是假雷(默认是假雷)
self.is_mine_flag = False
# 周围雷的数目
self.num_mines_around = -1
'''设置当前的状态码'''
def setstatus(self, status_code):
self.status_code = status_code
'''埋雷'''
def burymine(self):
self.is_mine_flag = True
'''设置周围雷的数目'''
def setnumminesaround(self, num_mines_around):
self.num_mines_around = num_mines_around
'''画到屏幕上'''
def draw(self, screen):
# 状态码为0, 代表该雷未被点击
if self.status_code == 0:
self.image = self.images['blank']
# 状态码为1, 代表该雷已被点开
elif self.status_code == 1:
self.image = self.images['mine'] if self.is_mine_flag else self.images[str(self.num_mines_around)]
# 状态码为2, 代表该雷被玩家标记为雷
elif self.status_code == 2:
self.image = self.images['flag']
# 状态码为3, 代表该雷被玩家标记为问号
elif self.status_code == 3:
self.image = self.images['ask']
# 状态码为4, 代表该雷正在被鼠标左右键双击
elif self.status_code == 4:
assert not self.is_mine_flag
self.image = self.images[str(self.num_mines_around)]
# 状态码为5, 代表该雷在被鼠标左右键双击的雷的周围
elif self.status_code == 5:
self.image = self.images['0']
# 状态码为6, 代表该雷被踩中
elif self.status_code == 6:
assert self.is_mine_flag
self.image = self.images['blood']
# 状态码为7, 代表该雷被误标
elif self.status_code == 7:
assert not self.is_mine_flag
self.image = self.images['error']
# 绑定图片到屏幕
screen.blit(self.image, self.rect)
游戏主循环:
clock = pygame.time.Clock()
while True:
screen.fill(cfg.BACKGROUND_COLOR)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = event.pos
mouse_pressed = pygame.mouse.get_pressed()
minesweeper_map.update(mouse_pressed=mouse_pressed, mouse_pos=mouse_pos, type_='down')
elif event.type == pygame.MOUSEBUTTONUP:
minesweeper_map.update(type_='up')
if emoji_button.rect.collidepoint(pygame.mouse.get_pos()):
minesweeper_map = MinesweeperMap(cfg, images)
time_board.update('000')
time_board.is_start = False
remaining_mine_board.update(str(cfg.NUM_MINES))
emoji_button.setstatus(status_code=0)
if minesweeper_map.gaming:
if not time_board.is_start:
start_time = time.time()
time_board.is_start = True
time_board.update(str(int(time.time() - start_time)).zfill(3))
remianing_mines = max(cfg.NUM_MINES - minesweeper_map.flags, 0)
remaining_mine_board.update(str(remianing_mines).zfill(2))
if minesweeper_map.status_code == 1:
emoji_button.setstatus(status_code=1)
if minesweeper_map.openeds + minesweeper_map.flags == cfg.GAME_MATRIX_SIZE[0] * cfg.GAME_MATRIX_SIZE[1]:
minesweeper_map.status_code = 1
emoji_button.setstatus(status_code=2)
minesweeper_map.draw(screen)
emoji_button.draw(screen)
remaining_mine_board.draw(screen)
time_board.draw(screen)
pygame.display.update()
clock.tick(cfg.FPS)
游戏效果:
来源:https://blog.csdn.net/weixin_55822277/article/details/120282229
0
投稿
猜你喜欢
- 平行坐标图,一种数据可视化的方式。以多个垂直平行的坐标轴表示多个维度,以维度上的刻度表示在该属性上对应值,相连而得的一个折线表示一个样本,以
- 本期薯片会的目的是讨论人物角色在设计中如何应用的问题。围绕了以下几个问题开展了讨论:1、 角色能干什么?2、 包含哪
- 总经一下前段时间用于的jQuery方法:find及children。需要的朋友可以参考下。首先看看英文解释吧: children方法:fin
- 前面的文章,主要讲到如何使用无序列表ul元素来实现复杂柱状图,但是在Web标准中,除了注重表现外,更加注重语意,所谓的语意就是样式和内容的相
- 网页制作中需要把握好很多原则和细节,今天我们来谈谈网页设计中的平衡、对比、连贯和留白。一、平衡如果你的页面是平衡的,当用户浏览这个页面的时候
- 在使用ASP来进行后端的数据合法性校验的时候,有些人为满足不同环境下面的数据校验,编写了很多的函数来实现,比如,我们想要校验用户输入的URL
- 数据库设计(Database Design)的概念:数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之
- 一:队列配置队列的配置文件放置在config/queue.php文件中,laravel框架中支持的队列驱动有:sync, database,
- 七夕节简介每年农历七月初七这一天是我国汉族的传统节日七夕节。因为此日活动的主要参与者是少女,而节日活动的内容又是以乞巧为主,故而人们称这天为
- 你可能在使用MySQL过程中,各种意外导致数据库表的损坏,而且这些数据往往是最新的数据,通常不可能在备份数据中找到。本章将讲述如何检测MyS
- 本文实例讲述了php利用cookies实现购物车的方法。分享给大家供大家参考。具体分析如下:php购物车是在电子商务网站会用到的,一种像超市
- 前一段时间碰到这样的的问题,Ajax从后台得到的中文信息怎么都是空。后来到网上搜资料,大多是以下这样。用AJAX来GET回一个页面时,RES
- 在这里奉上源代码,没有做样式处理,不过功能是可以的,希望大家可以和我交流交流!<html> <head>&
- 在php中判断一个文件或目录是否存在,大家通常都会想到is_file和file_exists两个函数。但这两个函数再判断一个远程url文件是
- 1.函数array()功能:创建一个数组变量格式:array(list)参数:list为数组变量中的每个数值列,中间用逗号间隔例子:<
- 每个 batch 前清空梯度,否则会将不同 batch 的梯度累加在一块,导致模型参数错误。然后我们将输入和目标张量都移动到所需的设备上,并
- var fso = new ActiveXObject("Scripting.
- 无意中看到一位学员的屏保,感觉挺有意思的,就把它实现了下来效果如下:<!DOCTYPE html PUBLIC "-//W3
- 作者:Robert Lair and Jason Lefebvr Intensity Software, Inc.
- icech: 在制作网页的时候,常常要遇到制作虚线表格的问题,下面的文章就能解决这个问题。方法一:作一个1X2的图。半黑半白,再利用表格作成