144
社区成员




20222127李新卓 2022-2023-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2221
姓名: 李新卓
学号:20222127
实验教师:王志强
实验日期:2023年5月23日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等;
此次综合实践,实现经典小游戏扫雷。
2.实验环境
操作系统:Windows 10
Python版本:Python 3.8
开发工具:PyCharm 2020
3.实验步骤
建立Python项目
在PyCharm中新建Python项目,命名为"minesweeper"。
导入Tkinter库
在minesweeper项目中新建一个Python文件minesweeper.py,并导入tkinter库:
import tkinter as tk
实现Minesweeper类
在minesweeper.py中,实现Minesweeper类,该类负责管理游戏数据和游戏界面。
首先在构造函数中初始化游戏数据:雷区布局、地图状态、游戏状态、剩余雷数等。
在生成雷区布局的generate_board()函数实现中,随机放置10个地雷,并根据地雷分布生成数字标记。
在create_button(x, y)函数实现中,为雷区的每个方格创建一个按钮。每个按钮有一个回调函数callback,处理按钮的点击事件。
在回调函数中,需要根据点击的格子的值来确定游戏的状态并进行相应的操作,比如展开格子、展示地雷、展示胜利信息等。如果点开的是空白方块,需要递归展开周围方块。游戏状态和剩余雷数等信息需要实时在状态栏中显示。
最后,在if name == "main"部分调用Minesweeper类,并启动游戏主循环。
4.实验代码
import tkinter as tk
import random
class Minesweeper:
def __init__(self, master):
self.master = master
self.master.title("Minesweeper")
# 游戏数据:雷区布局、地图状态、游戏状态、剩余雷数
self.board = [[0 for _ in range(10)] for _ in range(10)]
self.map = [[None for _ in range(10)] for _ in range(10)]
self.game_over = False
self.mines_left = 10
# 生成雷区布局
self.generate_board()
# 界面设计:菜单栏、状态栏、游戏区
self.menu_bar = tk.Menu(self.master)
self.master.config(menu=self.menu_bar)
self.status_bar = tk.Label(self.master, text="Remaining mines: {}".format(self.mines_left))
self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
self.game_frame = tk.Frame(self.master, bd=2, relief=tk.RAISED)
self.game_frame.pack(side=tk.TOP, pady=2, padx=2)
# 游戏区填充按钮
self.buttons = [[self.create_button(x, y) for y in range(10)] for x in range(10)]
def generate_board(self):
# 随机放置10个地雷
for _ in range(10):
placed = False
while not placed:
x, y = random.randint(0, 9), random.randint(0, 9)
if self.board[x][y] == 0:
self.board[x][y] = -1
placed = True
# 根据地雷分布生成数字标记
for x in range(10):
for y in range(10):
if self.board[x][y] != -1:
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
if 0 <= x+dx < 10 and 0 <= y+dy < 10 and self.board[x+dx][y+dy] == -1:
self.board[x][y] += 1
def create_button(self, x, y):
def callback():
if self.game_over or self.map[x][y] is not None:
return
if self.board[x][y] == -1:
self.game_over = True
self.status_bar.config(text="Game over!")
# 显示所有地雷
for i in range(10):
for j in range(10):
if self.board[i][j] == -1:
self.buttons[i][j].config(fg="red", text="*")
else:
self.map[x][y] = self.board[x][y]
self.buttons[x][y].config(text=self.board[x][y])
# 如果点开的是空白方块,递归展开周围方块
if self.board[x][y] == 0:
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
if 0 <= x+dx < 10 and 0 <= y+dy < 10:
self.buttons[x+dx][y+dy].invoke()
# 检查游戏是否结束
mines_left = sum([row.count(None) for row in self.map])
if mines_left == 0:
self.game_over = True
self.status_bar.config(text="You win!")
button = tk.Button(self.game_frame, width=2, command=callback)
button.grid(row=x, column=y)
return button
if __name__ == "__main__":
root = tk.Tk()
app = Minesweeper(root)
root.mainloop()
5.代码分析
该代码实现了扫雷游戏的功能。它使用了Python的tkinter库来构建游戏界面,游戏数据存储在一个二维数组中。游戏区分为若干个按钮,每个按钮表示游戏中的一个格子。点击按钮时根据点击的格子的值来确定游戏的状态并进行相应的操作,比如展开格子、展示地雷、展示胜利信息等。通过随机放置地雷和生成数字标记来构建雷区。在游戏结束时,显示游戏胜利或失败的信息。整个游戏的逻辑由一系列函数实现,如随机放置地雷、生成数字标记、创建按钮等。整个游戏的主要逻辑由Minesweeper类实现,每个按钮的回调函数中处理按钮点击事件。游戏界面按照菜单栏、状态栏、游戏区的顺序从上到下排列。整个游戏由if name == "main"部分调用,即构造了一个Tk对象和Minesweeper对象,启动游戏主循环。
6.实验结果
利用Pycharm运行该代码,即可开启扫雷游戏。
游戏界面由菜单栏、状态栏和游戏区构成,如下图所示。
游戏开始前看不到任何数据,但地雷已经被随机放置在雷区中。点击右侧的按钮,即可开始游戏。每次点击将会展开一个方格,根据该方格的内容在地图上标记相关信息,如下图所示。
当点击到地雷时,游戏结束,界面显示“Game over!”;当剩余的未开方格全为地雷时,游戏胜利,界面显示“You win!”。
7.托管至gitee
8.实验中遇到的问题及解决措施
(1)问题:无法导入Tkinter库
解决措施:自己长时间摸索,求助同学帮助。
(2)问题:无法托管gitee,显示已存在
解决措施:上网查阅资料,得知可以直接提交
9.心得体会
本实验通过实现Python扫雷游戏,使我掌握了Python数值计算、控制语句和函数等基本编程语法,并学会了使用tkinter库构建简单的图形用户界面。实践证明,开发扫雷游戏是学习Python编程的一种很好的方式,可以提高编程能力,加深对Python编程语言的理解和运用。
10.课程总结
本学期原本选修Python课程,只是因为系统原因导致没选上喜欢的课。但真正接触这门课程后,我不禁为Python语言的精彩绝伦而拍手叫好,相较于C语言、JAVA等计算机语言,Python语言更显得实用与简便。它是一门非常有潜力的高级语言,在字符串上的处理,相对于其他程序有更多的便利。不仅如此,Python语言的库也很多,正因为它强大的库,让编程变得不再艰难。刚接触Python时,学会的代码print<“hello world!”>和print<"人生苦短,我用Python!">让我对这门课产生了极大兴趣,在这之后,不论是丰富的知识,还是老师幽默风趣的讲述,都让Python这门课程更加的吸引我。在后面几次Python课程的学习中,老师在课上讲得比较快,课上有时会跟不上,但是在课后也能够及时的去弥补不足,还是能够对Python学习的更多。虽然这几个月下来,我对Python的学习也仅仅只是它的基础方面,但Python的强大,也是足足地吸引着我。我希望自己能够在不断地学习中,将Python学习的更加好。