首页/新闻资讯/正文详情

python+pygame实现扫雷游戏之三

发布时间:2026/9/23 10:35:51 来源:云帆数科 栏目:资讯中心
python+pygame实现扫雷游戏之三
我们已经实现了pythonpygame实现扫雷游戏之一pythonpygame实现扫雷游戏之二下面就可以实例化MineBlock及响应鼠标消息循环了。其本质就是不停地接收鼠标事件改变二维数组的状态然后“画”在屏幕上就可以了。六、main.py# -*- coding: utf-8 -*- import sys import time import pygame from pygame.locals import * from mineblock import * from gamestatus import * # 游戏屏幕的宽 SCREEN_WIDTH BLOCK_WIDTH * SIZE # 游戏屏幕的高 SCREEN_HEIGHT (BLOCK_HEIGHT 2) * SIZE #要留出上面的位置显示剩余地雷的数量和用时。 def print_text(screen, font, x, y, text, fcolor(255, 255, 255)): imgText font.render(text, True, fcolor) screen.blit(imgText, (x, y)) def main(): pygame.init() screen pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption(扫雷) font1 pygame.font.Font(resources/bdm.TTF, SIZE * 2) # 地雷数量、事件的字体 fwidth, fheight font1.size(888) fontcolor (208, 38, 38) # 加载资源图片因为资源文件大小不一所以smoothscale做了统一的缩放处理 img0 pygame.image.load(resources/0.bmp).convert() img0 pygame.transform.smoothscale(img0, (SIZE, SIZE)) img1 pygame.image.load(resources/1.bmp).convert() img1 pygame.transform.smoothscale(img1, (SIZE, SIZE)) img2 pygame.image.load(resources/2.bmp).convert() img2 pygame.transform.smoothscale(img2, (SIZE, SIZE)) img3 pygame.image.load(resources/3.bmp).convert() img3 pygame.transform.smoothscale(img3, (SIZE, SIZE)) img4 pygame.image.load(resources/4.bmp).convert() img4 pygame.transform.smoothscale(img4, (SIZE, SIZE)) img5 pygame.image.load(resources/5.bmp).convert() img5 pygame.transform.smoothscale(img5, (SIZE, SIZE)) img6 pygame.image.load(resources/6.bmp).convert() img6 pygame.transform.smoothscale(img6, (SIZE, SIZE)) img7 pygame.image.load(resources/7.bmp).convert() img7 pygame.transform.smoothscale(img7, (SIZE, SIZE)) img8 pygame.image.load(resources/8.bmp).convert() img8 pygame.transform.smoothscale(img8, (SIZE, SIZE)) img_blank pygame.image.load(resources/blank.bmp).convert() img_blank pygame.transform.smoothscale(img_blank, (SIZE, SIZE)) img_flag pygame.image.load(resources/flag.bmp).convert() img_flag pygame.transform.smoothscale(img_flag, (SIZE, SIZE)) img_ask pygame.image.load(resources/ask.bmp).convert() img_ask pygame.transform.smoothscale(img_ask, (SIZE, SIZE)) img_mine pygame.image.load(resources/mine.bmp).convert() img_mine pygame.transform.smoothscale(img_mine, (SIZE, SIZE)) img_blood pygame.image.load(resources/blood.bmp).convert() img_blood pygame.transform.smoothscale(img_blood, (SIZE, SIZE)) img_error pygame.image.load(resources/error.bmp).convert() img_error pygame.transform.smoothscale(img_error, (SIZE, SIZE)) face_size int(SIZE * 1.25) img_face_fail pygame.image.load(resources/face_fail.bmp).convert() img_face_fail pygame.transform.smoothscale(img_face_fail, (face_size, face_size)) img_face_normal pygame.image.load(resources/face_normal.bmp).convert() img_face_normal pygame.transform.smoothscale(img_face_normal, (face_size, face_size)) img_face_success pygame.image.load(resources/face_success.bmp).convert() img_face_success pygame.transform.smoothscale(img_face_success, (face_size, face_size)) face_pos_x (SCREEN_WIDTH - face_size) // 2 face_pos_y (SIZE * 2 - face_size) // 2 img_dict { 0: img0, 1: img1, 2: img2, 3: img3, 4: img4, 5: img5, 6: img6, 7: img7, 8: img8 } bgcolor (225, 225, 225) # 背景色 block MineBlock() game_status GameStatus.readied start_time None # 开始时间 elapsed_time 0 # 耗时 while True: # 填充背景色 screen.fill(bgcolor) for event in pygame.event.get(): if event.type QUIT: sys.exit() elif event.type MOUSEBUTTONDOWN: mouse_x, mouse_y event.pos x mouse_x // SIZE y mouse_y // SIZE - 2 bLeft, bMiddle, bRight pygame.mouse.get_pressed() if game_status GameStatus.started: # 鼠标左右键同时按下如果已经标记了所有雷则打开周围一圈 # 如果还未标记完所有雷则有一个周围一圈被同时按下的效果 if bLeft and bRight: mine block.getmine(x, y) if mine.status BlockStatus.opened: if not block.double_mouse_button_down(x, y): game_status GameStatus.over elif event.type MOUSEBUTTONUP: if y 0: if face_pos_x mouse_x face_pos_x face_size \ and face_pos_y mouse_y face_pos_y face_size: game_status GameStatus.readied block MineBlock() start_time time.time() elapsed_time 0 continue if game_status GameStatus.readied: game_status GameStatus.started start_time time.time() elapsed_time 0 if game_status GameStatus.started: mine block.getmine(x, y) if bLeft and not bRight: # 按鼠标左键 if mine.status BlockStatus.normal: if not block.open_mine(x, y): game_status GameStatus.over elif not bLeft and bRight: # 按鼠标右键 if mine.status BlockStatus.normal: mine.status BlockStatus.flag elif mine.status BlockStatus.flag: mine.status BlockStatus.ask elif mine.status BlockStatus.ask: mine.status BlockStatus.normal elif bLeft and bRight: if mine.status BlockStatus.double: block.double_mouse_button_up(x, y) flag_count 0 opened_count 0 for row in block.block: for mine in row: pos (mine.x * SIZE, (mine.y 2) * SIZE) if mine.status BlockStatus.opened: screen.blit(img_dict[mine.around_mine_count], pos) opened_count 1 elif mine.status BlockStatus.double: screen.blit(img_dict[mine.around_mine_count], pos) elif mine.status BlockStatus.bomb: screen.blit(img_blood, pos) elif mine.status BlockStatus.flag: screen.blit(img_flag, pos) flag_count 1 elif mine.status BlockStatus.ask: screen.blit(img_ask, pos) elif mine.status BlockStatus.hint: screen.blit(img0, pos) elif game_status GameStatus.over and mine.value: screen.blit(img_mine, pos) elif mine.value 0 and mine.status BlockStatus.flag: screen.blit(img_error, pos) elif mine.status BlockStatus.normal: screen.blit(img_blank, pos) print_text(screen, font1, 28, (SIZE * 2 - fheight) // 2 - 2, %02d % (MINE_COUNT - flag_count), fontcolor) if game_status GameStatus.started: elapsed_time int(time.time() - start_time) print_text(screen, font1, SCREEN_WIDTH - fwidth - 8, (SIZE * 2 - fheight) // 2 - 2, %03d % elapsed_time, fontcolor) if flag_count opened_count BLOCK_WIDTH * BLOCK_HEIGHT: game_status GameStatus.win if game_status GameStatus.over: screen.blit(img_face_fail, (face_pos_x, face_pos_y)) elif game_status GameStatus.win: screen.blit(img_face_success, (face_pos_x, face_pos_y)) else: screen.blit(img_face_normal, (face_pos_x, face_pos_y)) pygame.display.update() if __name__ __main__: main() #pygame.mouse.get_pressed() —— 获取鼠标按键的情况是否被按下 #返回一个由布尔值组成的列表代表所有鼠标按键被按下的情况。True意味着在调用此方法时该鼠标按键正被按下 #(1, 0, 1) 表示左键和右键被按下(左键、中键、右键) #pygame.mouse.get_pos() —— 获取鼠标光标的位置 #返回鼠标光标的坐标 (x, y)。这个坐标以窗口左上角为基准点 # pygame.mouse.get_rel() —— 获取鼠标与前一位置的偏移量 # pygame.mouse.set_pos(pos) —— 设置鼠标光标的位置 #如果鼠标光标是可视的则光标将会跳到新的坐标上。移动鼠标将会产生一个新的 pygame.MOUSEMOTION 事件 # pygame.mouse.set_visible(bool) —— 隐藏或显示鼠标光标 # bpygame.mouse.set_visible(False) #设置鼠标是否可见 True 可见False 不可见 # 返回值返回在设置之前的状态 # pygame.mouse.get_focused() —— 检查程序界面是否获得鼠标焦点 # 当 pygame 正在接受鼠标输入事件即说鼠标正在处于“active”或“focus”状态返回值为 True # pygame.mouse.set_cursor() —— 设置鼠标光标在程序内的显示图像 # pygame.mouse.get_cursor() —— 获取鼠标光标在程序内的显示图像 # flip函数和update函数的主要区别在于它们处理屏幕重绘的方式和效率。‌ # flip函数‌flip函数会重新绘制整个屏幕对应的窗口。‌这意味着‌无论屏幕上哪个部分是否发生变化‌flip函数都会导致整个屏幕被重新绘制。‌\ # 这种方式适用于需要快速、‌完全更新屏幕内容的情况‌例如在场景变化非常频繁的游戏中。‌ # update函数‌相比之下‌Update函数仅重新绘制窗口中有变化的区域。‌如果屏幕上只有少数物体在移动或变化‌update函数只会重绘那些实际移动或变化的部分‌而不会重绘没有变化的部分。‌\ # 这种方式能够提高效率‌因为它减少了不必要的屏幕重绘操作‌从而可能提供更好的性能‌尤其是在场景变化不是非常频繁的情况下。‌ # 总的来说flip函数适用于需要快速、‌完全更新屏幕内容的场景‌而update函数则更适合于只需要更新屏幕部分内容的场景‌特别是在性能优化方面有要求的情况下。‌结合代码理解一下逻辑6.1 一直到bgcolor (225, 225, 225) # 背景色这里都是一些资源的加载没有太多需要理解的6.2 先实例化MineBlock的对象为block将游戏状态设为准备好了GameStatus.readied开始时间耗时等初始化工作6.3 消息循环6.3.1 QUIT6.3.2 鼠标按下游戏场景中只需要监测左右键同时按下事件对应的是MineBlock中的 double_mouse_button_down函数6.3.3 鼠标弹起6.3.3.1 鼠标在笑脸的地方重玩游戏6.3.3.2 GameStatus.readied改成GameStatus.started后只左键弹起对应的是 MineBlock中的open_mine函数6.3.3.3 鼠标右键弹起走马灯效果状态转换normal--flag--ask--normal6.3.3.4 左右键同时弹起对应的是MineBlock中的double_mouse_button_up函数6.4 前面都是返回的状态接下来就将状态和显示的图片资源结合起来即哪个坐标的状态 对应哪个图片将整个屏幕在内存中blit出来6.5 最后pygame.display.update即可当然这个游戏还没有计分升级的功能这就留给大家自行研究和实现老规矩代码及资源

相关推荐

公考高频成语解析:安之若素的正确用法与答题技巧
公考高频成语解析:安之若素的正确用法与答题技巧

1. 成语解析:安之若素的核心要义"安之若素"这个成语在公考行测中出现的频率相当高,但很多考生往往只记住了表面意思,在实际做题时却容易混淆。我们先从最基础的层面来拆解这个成语。1.1 字面拆解与读音要点这个成语的正确读音是&qu… · 2026/9/23 10:35:45

R星底层逻辑:从报错崩溃到面试通关的实战指南
R星底层逻辑:从报错崩溃到面试通关的实战指南

R星底层逻辑:从报错崩溃到面试通关的实战指南 盯着屏幕上那一片红色的 StackTrace,心跳瞬间漏了一拍。这是每个接触 r星… · 2026/9/23 10:35:38

手写数字识别系统从零到部署:CNN模型训练、优化与GUI界面完整实践
手写数字识别系统从零到部署:CNN模型训练、优化与GUI界面完整实践

简介:这是一套用于手写数字识别系统的Python毕业设计完整源码与数据包,整体难度适中,主要面向计算机相关专业正在筹备大作业、毕业设计的学生,也适合希望通过项目实战提升图像识别能力的进阶学习者。项目包含卷积神经网络与反向传… · 2026/9/23 10:35:38

AI代码审查工具登顶GitHub热榜:原理、接入与踩坑指南
AI代码审查工具登顶GitHub热榜:原理、接入与踩坑指南

今天打开 GitHub 今日热榜(2026-09-16),排在最前面的不是某个新框架,也不是明星模型,而是阿里开源的一款代码审查工具。作为每天早晚各刷一次 Trending 的老用户,我第一反应是意外,第二反应是&q… · 2026/9/23 11:19:27

Kinect骨骼估计精度优化:从传感器调优到滤波参数扫描
Kinect骨骼估计精度优化:从传感器调优到滤波参数扫描

简介:一份PDF格式的学术论文,面向从事动作捕捉、医疗康复、步态识别与人机交互等方向的研究者与开发者,针对微软Kinect v2骨骼估计在真实场景下误差较大的问题,系统提出基于统计度量、运动范围分析、重复动作聚合与运动方向判断的… · 2026/9/23 11:19:20

咬尾卷积码实战:从生成多项式到循环维特比译码
咬尾卷积码实战:从生成多项式到循环维特比译码

简介:围绕(13,17)卷积码与咬尾卷积码,这份MATLAB实现包面向通信工程、信号处理及信息论方向的学习者和研究者,用于理解卷积编码、软输出解码及系统性能评估等核心问题。压缩包共11个文件,以10个… · 2026/9/23 11:19:20

GPU加速SOD评估:PyTorch一键计算MAE、F-measure、S-measure、E-measure
GPU加速SOD评估:PyTorch一键计算MAE、F-measure、S-measure、E-measure

简介:这份资源面向从事计算机视觉与显着性对象检测研究的开发者与研究生,提供一套基于 PyTorch 的 GPU 加速评估工具,用于一键计算 MAE、Max F-measure、S-measure、E-measure 四项常用指标。其代码由 dpfan.net 的 MATLAB 版本重新实现&… · 2026/9/23 11:19:20

Codex切换模型处显示自定义解决方法:用CC-Switch配TaoToken统一Key的config.toml骨架
Codex切换模型处显示自定义解决方法:用CC-Switch配TaoToken统一Key的config.toml骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 11:19:14

拒绝报错噩梦:细分市场案例性能优化速查手册
拒绝报错噩梦:细分市场案例性能优化速查手册

拒绝报错噩梦:细分市场案例性能优化速查手册 盯着屏幕上一片红色的 StackTrace,你是不是也头疼欲裂?日志刷屏到根本找不到根源,改一行崩两行,心态直接崩盘。别慌,这份 细分市场案例 的 速查手册 就是为你准备的。… · 2026/9/23 11:19:14

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码