2025-2026-2《Python程序设计》实验4报告
课程:《Python 程序设计》
班级:2542
姓名: 梁晋源
学号: 20254220
实验教师:王志强
实验日期: 2026 年5月26日
必修 / 选修:公选课
- 实验内容
本次实验是《Python程序设计》课程的综合性实践作业,核心任务是独立开发一个功能完整的Python小程序。我选择完成经典扫雷小游戏项目,属于课程实操要求中的小游戏开发实践方向。
本次实验主要围绕扫雷游戏核心功能展开,全程使用Python语言进行开发,主要内容包括:自主实现游戏地图生成、随机布雷、格子周边地雷数量统计、用户坐标交互、游戏胜负判定等核心功能。同时针对输入异常、地图边界、重复操作等特殊情况做了容错处理,保证程序稳定运行。本次实验全程使用PyCharm完成代码编写、功能调试和整体测试,完整走完了小型程序开发的全流程。 - 实验过程及结果
2.1 实验过程
需求分析与设计
我先梳理了经典扫雷游戏的基础规则,把整体项目拆分成五个核心模块,分别是地图生成、随机布雷、地雷数计算、用户交互输入、胜负判断。同时确定了程序的数据结构,用二维列表存储游戏地图,结合集合存储地雷坐标,从整体上理清了代码的编写逻辑和函数调用流程,避免后续编码出现逻辑混乱。
编码实现
根据拆分的模块逐一编写代码,自定义多个功能函数:通过create_board函数初始化游戏地图并随机布置地雷;利用count_mines函数遍历周边格子,统计每个位置的地雷数量;借助print_board函数可视化打印游戏界面;最后在main主函数中搭建游戏主循环,持续接收用户输入、更新游戏状态、判定游戏输赢,串联起整个游戏流程。
测试与调试
代码编写完成后,我进行了多场景测试,分别测试了合法坐标输入、超出地图范围的非法输入、非数字格式输入、重复打开格子等多种情况。针对测试中出现的索引越界、程序闪退、计数错误等问题逐一排查修改,不断优化代码,确保程序在各种场景下都能正常、稳定运行。
2.2 核心代码
扫雷小游戏 - Python期末作业
import random
def create_board(rows, cols, mines):
"""生成游戏地图并布置地雷"""
board = [[' ' for _ in range(cols)] for _ in range(rows)]
mine_positions = set()
# 利用集合去重,保证地雷位置唯一不重复
while len(mine_positions) < mines:
r = random.randint(0, rows-1)
c = random.randint(0, cols-1)
mine_positions.add((r, c))
# 批量布置地雷
for r, c in mine_positions:
board[r][c] = '💣'
return board, mine_positions
def count_mines(board, r, c, rows, cols):
"""计算指定格子周围的地雷数量"""
count = 0
# 遍历当前格子四周8个方向的位置
for dr in [-1, 0, 1]:
for dc in [-1, 0, 1]:
if dr == 0 and dc == 0:
continue
nr, nc = r + dr, c + dc
# 边界判断,避免索引越界报错
if 0 <= nr < rows and 0 <= nc < cols:
if board[nr][nc] == '💣':
count += 1
return count
def print_board(visible):
"""打印游戏地图界面"""
# 打印顶部列坐标
print(" " + " ".join(str(i) for i in range(len(visible[0]))))
print("--+" + "-+" * len(visible[0]))
# 逐行打印游戏地图
for i, row in enumerate(visible):
print(f"{i} |" + "|".join(row) + "|")
def main():
"""游戏主逻辑"""
# 初始化游戏参数:5*5地图,3个地雷
rows, cols, mines = 5, 5, 3
board, mine_pos = create_board(rows, cols, mines)
visible = [['■' for _ in range(cols)] for _ in range(rows)]
safe_cells = rows * cols - mines # 总安全格子数量
opened = 0 # 已开启的安全格子计数
print("===== 扫雷小游戏 =====")
print(f"地图大小:{rows}x{cols} | 地雷数:{mines}")
print("输入格式:行 列(例如:0 2)")
游戏主循环
while True:
print_board(visible)
# 捕获非法输入异常
try:
r, c = map(int, input("请输入坐标:").split())
except:
print("输入错误!请输入两个数字,如:0 1")
continue
判断坐标是否超出地图范围
if not (0 <= r < rows and 0 <= c < cols):
print("超出范围!")
continue
判断格子是否已经开启
if visible[r][c] != '■':
print("已经打开过了!")
continue
踩到地雷,游戏结束
if (r, c) in mine_pos:
print("")
print("💥 你踩到地雷了!游戏结束!")
print("")
print_board(board)
return
计算周边地雷数并更新界面
num = count_mines(board, r, c, rows, cols)
visible[r][c] = str(num)
opened += 1
全部安全格子开启,游戏胜利
if opened == safe_cells:
print("")
print("🎉 恭喜你!扫雷成功!")
print("")
print_board(board)
return
if name == "main":
main()
2.3 实验结果
本次编写的扫雷程序整体运行流畅,各项预设功能均正常实现。程序可以稳定生成规格为5×5的游戏地图,随机布置3个不重复的地雷,用户输入对应坐标即可开启格子,界面会精准显示周边地雷数量。当用户踩到地雷时,会及时提示游戏结束并展示完整的地雷分布;若成功打开所有安全格子,会触发胜利提示。同时程序对各类错误输入做了适配,面对非数字输入、坐标越界、重复点击格子等操作,都会给出清晰的文字提示,不会出现闪退、崩溃等问题,整体容错性良好。
3. 实验过程中遇到的问题和解决过程
随机布雷出现重复坐标,导致实际地雷数量不足
最初编写布雷逻辑时,单纯用循环随机生成坐标,经常出现地雷位置重复的情况,最终地图上的地雷数量达不到预设数值。后来我利用集合元素唯一、自动去重的特性,用集合存储所有地雷坐标,直到集合数量达到预设地雷数才停止循环,彻底解决了地雷重复、数量不足的问题。
输入格式错误时程序直接崩溃
测试过程中发现,当输入字母、单个数字或多个乱序字符时,程序会直接报错终止运行。针对这个问题,我添加了try-except异常捕获结构,专门处理用户输入异常的情况,同时添加文字提示,引导用户规范输入,保证程序不会因输入错误闪退。
重复打开同一格子会导致计数错误,提前触发胜利条件
初期代码没有格子状态判断,重复点击已开启的安全格子时,计数会持续累加,导致还没开完所有格子就判定游戏胜利。我通过增加状态判断,仅当格子为未开启的■状态时,才执行开启和计数操作,有效避免了重复计数的bug。
读取地图边缘格子周边信息时出现索引越界报错
在计算地图最边缘、最角落格子的周边地雷数时,程序会因为访问超出列表下标范围的位置而报错。我在遍历周边格子的逻辑中添加了坐标边界判断,只统计地图范围内的有效坐标,成功解决了索引越界的问题。
4. 课程总结与学习感悟
4.1 课程整体知识总结
本学期的《Python程序设计》课程内容循序渐进、由浅入深,让我从零开始系统接触并掌握了Python编程的核心知识。课程前期主要学习基础语法,包括变量、常用数据类型、运算符、输入输出等基础内容,搭建起了编程的知识框架。中期重点学习了程序流程控制,熟练掌握了if条件判断、for和while循环、break和continue跳转语句,能够独立编写具备完整逻辑的小程序。
同时课程还讲解了函数的定义与调用、参数传递、返回值等知识,让我学会将复杂代码拆分封装,让代码更简洁、复用性更强。除此之外,列表、集合等常用数据结构的用法、try-except异常处理等知识点,也让我掌握了优化代码、提升程序稳定性的方法。本次扫雷小游戏的开发,正是对本学期所有核心知识点的综合运用,让我把零散的理论知识整合起来,真正实现了学以致用。
4.2 课程学习体会
经过一学期的Python课程学习,我最大的感受是编程重在实践。刚开始上课时,我只能看懂课本上的理论代码,自己动手编写时总会出现各种小问题。随着不断敲代码、调试bug,我慢慢熟悉了编程逻辑,也养成了耐心排查问题的习惯。
这次扫雷实验让我收获很大,从一开始的功能拆解、逻辑构思,到逐行编码、调试纠错,全程都是独立思考和实践的过程。我彻底吃透了循环、条件判断、函数封装、异常处理这些核心知识点,也明白了编程不是死记硬背代码,而是学会用逻辑解决实际问题。每当修复一个bug、实现一个新功能时,都能感受到满满的成就感,也让我对编程产生了更浓厚的兴趣。
同时我也意识到自己的不足,比如代码优化能力较弱,编写逻辑不够简洁高效,后续还需要多练习、多积累,不断提升自己的编程思维和实操能力。
4.3 课程意见与建议
首先,非常感谢老师本学期的耐心教学,课程内容通俗易懂,很适合零基础同学入门,整体学习体验很好。结合自身学习情况,我有几点小小的建议。希望课堂可以增加更多趣味实操案例,比如简易计算器、猜数字游戏、批量处理文本等贴近日常的小项目,让我们能在课堂上即时练习,加深知识记忆。同时建议适当增加课堂互动和答疑环节,大家编写代码时遇到的问题各不相同,集中答疑可以帮助我们更快解决疑惑。对于学有余力的同学,可以适当拓展一些简单的进阶内容,比如基础的文件操作、第三方库使用等,拓宽大家的知识面。此外,也可以适当布置小组协作编程任务,锻炼团队合作开发的能力,为后续学习打下更好的基础。
5. 实验感悟与思考
本次综合实验是对我本学期Python学习成果的一次全面检验。通过自主开发扫雷小游戏,我彻底摆脱了只会看代码、不会写代码的困境,真正做到了灵活运用课堂所学知识。在不断调试、修改bug的过程中,我学会了拆解复杂问题、分步排查错误,逻辑思维和问题解决能力都得到了很大提升。
同时我也深刻认识到,编写程序不仅要实现基础功能,更要考虑程序的稳定性和用户体验,做好异常处理和边界判断,才能让程序更加完善。这次实验让我真切体会到编程的趣味性和实用性,也让我明白编程学习没有捷径,只有多动手、多思考、多复盘,才能稳步提升。未来我也会继续坚持练习,巩固所学知识,尝试开发更多有趣、实用的小程序。
参考资料
《Python 编程:从入门到实践》、Python 官方文档: https://docs.python.org/3/ 、扫雷游戏逻辑设计参考教程


