20254217 实验四 Python综合实践 实验报告
20254217 2025-2026-2 《Python程序设计》综合实践报告
课程:《Python程序设计》
班级:2542
姓名:刘镇源
学号:20254217
实验教师:王志强老师
实验日期:2026年5月26日
必修/选修: 专选课
一、实验要求
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
批阅:注意本次实验不算做实验总分,前三个实验每个实验15分,累计45分。本次实践算入综合实践,打分为45分。
评分标准:
(1)程序能运行,功能丰富(至少5个功能)。(需求提交源代码,并建议录制程序运行的视频)15分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。20分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。10分
二、实验内容
扫雷是自己从小玩到大的游戏,也是自己对小游戏的一段回忆。依然记得初中课间几个人围着一台文曲星玩扫雷(说也奇怪,围在一起玩扫雷的是班上成绩最好的几个人,于是传出了某班成绩前几聚众“扫雷”的新闻),但是自己一直没有写过一个扫雷游戏。这次实验要求综合应用Python语言,给到我一个契机,于是决定借助自己的Python知识和LLM编写一个扫雷小游戏。
(一)游戏程序各部分代码介绍
1.安装相应的开发库与开发库引用说明
扫雷作为一个在Python语言下运行的游戏,其中的交互动画等元素需要调用pygame开发库。打开终端,运用pip install语句进行下载即可。
最终版程序调用的库如下:

2.扫雷游戏基础环境配置
基础环境包括棋盘参数,各交互页面,各元素大小、颜色、数量、分布等,各参数配置说明如下图:

3.创建棋盘类,构造init函数,设计单人和双人棋盘。其中双人棋盘一半先置空,进入双人模式后再实例化

4.绘制欢迎页(其中部分内部逻辑前置)


由于单人和双人模式操作方法不同,在设计按钮时使用分支语句逻辑实现。
5.回到棋盘参数设置部分,进行细化规定

6.设计结算页面


7.两个模式的操作具体实现

8.设计游戏入口,引导主循环运行

(二)游戏功能开发与测试过程中遇到的问题和解决过程
说明:注释前的单引号用于与markdown格式的#区分开来
1.第一阶段:仅单人,单一难度,文字无法正常显示,几乎没有交互逻辑
扫雷1:只有基本逻辑框架,存在语法错误无法运行
`#调用
import pygame#图形绘制与交互窗口
import random#用于随机生成地雷坐标
'#以下是游戏基础配置
'#1.棋盘、地雷数基础参数(其中Level 1为99,有10个地雷)
ROW=9
COL=9
MINE_COUNT=10
CELL_SIZE=40#规定格子尺寸
WIDTH=COLCELL_SIZE
HEIGHT=ROW*CELL_SIZE
'#2.用RGP颜色区分不同类型标记:窗口背景色、未翻格子色、被翻格子色、格子边框线条色、插旗色附近地雷数的数字颜色等
BG_COLOR=(192,192,192)
CELL_COLOR=(220,220,220)
OPEN_COLOR=(160,160,160)
LINE_COLOR=(100,100,100)
FLAG_COLOR=(255,0,0)
MINE_COLOR=(255,255,255)
NUM_COLORS = [
(0, 0, 250), # 索引0 → 数字1
(0, 128, 0), # 索引1 → 数字2
(250, 0, 0), # 索引2 → 数字3
(0, 0, 128), # 索引3 → 数字4
(128, 0, 0), # 索引4 → 数字5
(0, 128, 128), # 索引5 → 数字6
(0, 0, 0), # 索引6 → 数字7
(128, 128, 128) # 索引7 → 数字8
]#创建列表,每个元素对应数字1-8
'#3.模拟遍历,统计格子,展开空白格
DIRS=[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]
'#4.构造程序启动自动执行模块
'#(1)pygame基础初始化,创建游戏窗口,设置标题,规定画面刷新帧率,设置文本字体字号
class MineSweeper:
def init(self):
pygame.init()
self.screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("欢迎来到扫雷")
self.clock=pygame.time.Clock()
self.font=pygame.font.SysFont(None,30)
' #(2)模拟随机布雷、翻开格子、插旗、胜负结算等模块
self.mine_map = [[0 for _ in range(COL)] for _ in range(ROW)]
self.count_map = [[0 for _ in range(COL)] for _ in range(ROW)]
self.open_map = [[0 for _ in range(COL)]
for _ in range(ROW)]
self.flag_map = [[0 for _ in range(COL)]
for _ in range(ROW)]
self.game_over = False
self.win = False
#(3)随机布雷
self.init_mine()
self.calc_mine_num()
def init_mine(self):
cnt = 0
while cnt < MINE_COUNT:
r = random.randint(0, ROW - 1)
c = random.randint(0, COL - 1)
if self.mine_map[r][c] == 0:
self.mine_map[r][c] = 1
cnt += 1
#(4)计算每个格子周围地雷数量
def calc_mine_num(self):
for r in range(ROW):
for c in range(COL):
if self.mine_map[r][c] == 1:
continue
num = 0
for dr, dc in DIRS:
nr, nc = r + dr, c + dc
if 0 <= nr < ROW and 0 <= nc < COL:
if self.mine_map[nr][nc] == 1:
num += 1
self.count_map[r][c] = num
#(5)递归翻开空白格子(核心连锁展开)
def open_cell(self, r, c):
# 越界 / 已翻开 / 插旗 直接返回
if r < 0 or r >= ROW or c < 0 or c >= COL:
return
if self.open_map[r][c] == 1 or self.flag_map[r][c] == 1:
return
self.open_map[r][c] = 1
# 当前格子周围无雷,递归展开周围8格
if self.count_map[r][c] == 0:
for dr, dc in DIRS:
self.open_cell(r + dr, c + dc)
'#(6)检查游戏胜利
def check_win(self):
#所有非地雷格子都被翻开则胜利
total = ROW * COL
open_cells = 0
mine_cells = 0
for r in range(ROW):
for c in range(COL):
if self.mine_map[r][c] == 1:
mine_cells += 1
elif self.open_map[r][c] == 1:
open_cells += 1
if open_cells == total - mine_cells:
self.win = True
self.game_over = True
' # 5. 绘制整个棋盘
def draw_board(self):
self.screen.fill(BG_COLOR)
for r in range(ROW):
for c in range(COL):
x = c * CELL_SIZE
y = r * CELL_SIZE
rect = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)
' # 已翻开格子
if self.open_map[r][c] == 1:
pygame.draw.rect(self.screen, OPEN_COLOR, rect)
pygame.draw.rect(self.screen, LINE_COLOR, rect, 1)
mine_num = self.count_map[r][c]
# 绘制数字
if mine_num > 0:
text = self.font.render(
str(mine_num), True, NUM_COLORS[mine_num - 1])
tx = x + (CELL_SIZE - text.get_width()) // 2
ty = y + (CELL_SIZE - text.get_height()) // 2
self.screen.blit(text, (tx, ty))
# 游戏结束,绘制地雷
if self.game_over and self.mine_map[r][c] == 1:
text = self.font.render("💣", True, MINE_COLOR)
tx = x + (CELL_SIZE - text.get_width()) // 2
ty = y + (CELL_SIZE - text.get_height()) // 2
self.screen.blit(text, (tx, ty))
# 未翻开格子
else:
pygame.draw.rect(self.screen, CELL_COLOR, rect)
pygame.draw.rect(self.screen, LINE_COLOR, rect, 1)
# 绘制旗子
if self.flag_map[r][c] == 1:
text = self.font.render("🚩",True,FLAG_COLOR)
tx = x + (CELL_SIZE-text.get_width()) // 2
ty = y + (CELL_SIZE-text.get_height()) // 2
self.screen.blit(text, (tx, ty))
'# 游戏结束提示
if self.game_over:
if self.win:
tip = self.font.render("游戏胜利!", True, (0, 255, 0))
else:
tip = self.font.render("游戏失败!", True, (250,250,250))
self.screen.blit(tip, (WIDTH//2 - tip.get_width()//2, HEIGHT//2))
'# 6. 鼠标事件处理
def handle_event(self):
for event in pygame.event.get():
# 关闭窗口
if event.type == pygame.QUIT:
pygame.quit()
exit()
# 游戏结束不再响应点击
if self.game_over:
continue
'# 鼠标左键:翻开格子
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
mx, my = pygame.mouse.get_pos()
c = mx // CELL_SIZE
r = my // CELL_SIZE
# 点到地雷 → 游戏结束
if self.mine_map[r][c] == 1:
self.game_over = True
else:
self.open_cell(r, c)
self.check_win()
'# 鼠标右键:插旗/取消旗子
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 3:
mx, my = pygame.mouse.get_pos()
c = mx // CELL_SIZE
r = my // CELL_SIZE
if self.open_map[r][c] == 0:
self.flag_map[r][c] = 1 - self.flag_map[r][c]
'# 主游戏循环
def run(self):
while True:
self.handle_event()
self.draw_board()
pygame.display.update()
self.clock.tick(60)
if name == "main":
game = MineSweeper()
game.run()
`
扫雷2:修复语法错误,可以正常运行

扫雷3:通过调整为绝对路径调用本地字体,所有文字内容成功正常显示

2.第二阶段:功能增加与调整,提升用户体验
扫雷4:增加难度设置和调整按钮

扫雷5:用户交互逻辑完整化调整:增加欢迎页和玩法说明

扫雷6:用户交互逻辑完整化调整:难度在游戏前先进行调整和确认,正式游戏时不再受到难度选择干扰,提升游戏过程体验

扫雷7:用户交互逻辑完整化调整:增加游戏结算后返回或继续选项而非直接退出程序,提升用户游戏体验

扫雷8:用户交互美观化调整:按钮与选项完全显示,提升用户游戏体验

3.第三阶段:从单人到互动,最终完善形成终版游戏程序
扫雷9:功能增加,玩法多样化、趣味化、互动性、竞技性增强:新增双人对战模式




扫雷10:增加地雷数、插旗数统计,完善正确率优先,正确率相同用时短者胜赛制的具体实现,形成终版Python扫雷小游戏

(三)游戏效果演示视频
由于自己没有B站账号,视频没有放到B站上,已在本地存储后打包提交。
三、全课总结、感想体会、意见建议
(一)全课总结
1.理论课上的知识
一句话:
系统讲解了Python语言本身的基础语法、Python语言程序设计集成开发环境的功能与用法。
具体讲:那还说啥了,来人上干货(bushi)

2.实验积累的经验
每一次实验都是对新任务、新知识、新技能的探索,发现新情况,解决新问题,具体的问题分析与解决方式,一些写入了之前的和这个实验报告,还有更多的是当场摸索着解决掉,但是后面写实验报告没有提的问题。实验报告上满满的是成长、提高和成就感,作为课代表或是专业内相对擅长计算机和程序设计的同学,帮助其他同学时也满满的是成长、提高和成就感。
(二)感想体验
早在选择Python程序设计课、见到Blackwall老师之前我就听到了各系学长学姐评价老师是人很好、教学能力和科研能力也都非常强的老师。在接触到王老师后我也有这样的感觉(后来听到老师说自己是0321班的DKYer——身为刚来不到一年的DKYer决定要认真积极向优秀的前辈请教学习),听老师讲课、被带着做实验、课下找老师答疑的时候觉得又学到知识又玩尽兴了,果断争取来当老师的课代表。
在听Python程序设计课之前,我之前有零散学习Python、C语言程序设计的经历,这次学习对我而言是对Python基础知识进行了一个体系化的梳理和更多实用Python程序设计技能的培养和锻炼,加深了我对Python语言的理解和运用能力。
课下答疑的时候老师认真耐心讲解,把每个问题都拆分成几个部分分别讲解清楚。除了课程本身需要解决的问题以外,老师也鼓励大家积极拓展探索。除了带着我解决一系列在实验中遇到的问题外,我还记得之前拿着蓝桥、洛谷的题(确实在这方面属于又菜又爱玩那种)找老师,本来这个与课程关系不大,但是老师带着我找我的答案的问题,然后摸索出更好的答案。
老师还注重我们的习惯养成,鼓励我们坚持英语单词打卡,这也是上老师的课除了学Python学到的又一样东西。
很高兴遇见老师,很高兴能成为老师的课代表,很高兴能在老师的带领下受益良多,期待和老师再见面!
(三)意见建议
其实我觉得老师这门课已经特别好了,如果非要提意见建议我想提这几点:
1.知识本身简单基础,老师的上课节奏还可以再快一些,把知识点讲得更多更深入一点。
2.课堂互动和平时复习可以采取更多的形式,除了知识点抽问以外强烈建议出代码补全题考察对知识的应用水平。(期待期待【坏笑】)
3.基础的代码补全题和程序设计应用题可以留作平时作业或是课后思考题,供学有余力的同学探索和提高。
浙公网安备 33010602011771号