Pygame据说这是史上最难扫雷游戏,没有:一,你们感受下......
导语
每日游戏更新系列——今天带大家来看看扫雷小游戏!
它是许多人接触到的第一款游戏,大概也是广大办公族和无网学生无聊时消遣的最佳游戏。
在那些还没有网(被切断网)的岁月,扫雷曾陪伴无数人度过了他们的童年。你的最佳纪录是多少了?
对于许多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]][ig.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)
游戏效果:
总结
今日游戏更新好啦!我要去战斗了!我就不信我过不了。。。。。。小声BB:不行的话还是开个挂吧!
制作不易,记得一键三连哦!!
如需打包好的源码 素材免费分享滴
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggchkc
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13