20244319 实验四《Python程序设计》实验报告
20244319 2024-2025-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级:2443
姓名:梁悦
学号:20244319
实验教师:王志强
实验日期:2025年5月14日
必修/选修: 公选课
一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
本次结课大作业,我选择了 “编写小游戏” 的方向~打算用 Python 来实现一个钢琴块小游戏!部分代码是跟着网上的教程学的,边学边琢磨,然后再把自己的想法加进去,一点一点把程序搭起来啦~感觉像拼积木一样,特别有成就感!😊
二、实验过程
(一)安装Pygame库

(二)初始化Pygame库并创建一个显示窗口
点击查看代码
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 600))
pygame.display.set_caption("钢琴块小游戏")
clock = pygame.time.Clock()
运行结果截图:

(三)搭建游戏循环框架
代码及运行结果截图:

(四)绘制游戏元素
所用函数:
矩形:pygame.draw.rect(surface, color, rect(距左边线距离,距上边线距离,宽,长), width=0)
线:pygame.draw.line(surface, color, start_pos(开始位置), end_pos(结束位置), width=1(线条像素宽度))
绘制分割线和钢琴块(为了实现钢琴块出现的随机性,我导入了random模块):
点击查看代码
import random
pygame.draw.rect(screen, (0, 0, 0), ((random.randint(0, 3) *100), 0, 100, 60))
pygame.draw.line(screen, (0,0,0), (100, 0), (100, 600), 2)
pygame.draw.line(screen, (0, 0, 0), (200, 0), (200, 600), 2)
pygame.draw.line(screen, (0, 0, 0), (300, 0), (300, 600), 2)
运行结果截图:

(五)实现钢琴块下落
点击查看代码
block_x = random.randint(0, 3) * 100
block_y = 0
block_speed = 5
block_y += block_speed
if block_y > 600:
block_y = 0
运行效果视频:钢琴块下落
(六)实现点击后钢琴块的更新
我的思路是,获取鼠标点击的位置,若落在钢琴块区域内,则钢琴块更新;若未落在钢琴块区域内,则游戏结束。
点击查看代码
elif event.type == pygame.MOUSEBUTTONDOWN:
click_pos = event.pos
rect = pygame.Rect(block_x,block_y, 100, 60)
if rect.collidepoint(event.pos):
block_x = random.randint(0, 3) * 100
block_y = 0
else:
running = False
运行效果视频:点击后钢琴块的更新
(七)实现分数统计、绘制分数界面
思路:分数初始化为0,点击钢琴块后,分数++;左上角显示得分情况;
点击查看代码
score_text = font.render(f"得分: {score}", True, (0,0,0))
screen.blit(score_text, (10, 10))
运行效果视频:左上角显示得分
(八)绘制游戏结束画面
思路:居中显示“游戏结束”、“得分”等元素
点击查看代码
game_over_text = font.render(f"游戏结束!得分:{score} ", True,(0,0,0))
screen.fill((255,255,255))
screen.blit(game_over_text,(200 - game_over_text.get_width() // 2, 300- game_over_text.get_height() // 2))
pygame.display.flip()

(九)程序代码托管到码云

链接:程序代码托管到码云
三、 实验过程中遇到的问题和解决过程
-
问题1:撰写实验报告过程中,博客园自动保存功能异常,导致需要重写实验报告TAT。
-
问题1解决方案:每写一部分的实验报告就手动保存一次草稿,并重新进入博客园页面检查保存效果。
-
问题2:游戏界面不能正确显示中文
![]()
-
问题2解决方案:用系统自己带的字体
即将
font=pygame.font.Font(None,36)
改为:
font = pygame.font.SysFont(["SimHei", "WenQuanYi Micro Hei", "Heiti TC"], 20)
改后效果:

-
问题3:游戏结算画面闪过太快
-
问题3解决方案:导入 pygame.time.wait()模块即可实现画面停留
-
问题4:游戏存在"若玩家不点击游戏界面,游戏不会自动结束"的bug
-
问题4解决方案:更新代码逻辑
即把
if block_y > 600:
block_y= 0
改为:
if block_y > 600:
running = False
四、最终运行结果
运行效果视频:钢琴块最终运行效果
点击查看代码
import pygame
import random
pygame.init()
screen = pygame.display.set_mode((400, 600))
pygame.display.set_caption("钢琴块小游戏")
block_x = random.randint(0, 3) * 100
block_y = 0
block_speed = 5
score=0
font = pygame.font.SysFont(["SimHei", "WenQuanYi Micro Hei", "Heiti TC"], 20)
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
click_pos = event.pos
rect = pygame.Rect(block_x,block_y, 100, 60)
if rect.collidepoint(event.pos):
score += 1
block_x = random.randint(0, 3) * 100
block_y = 0
else:
running = False
block_y += block_speed
if block_y > 600:
running = False
screen.fill((255,255,255))
pygame.draw.rect(screen, (0, 0, 0), (block_x, block_y, 100, 60))
pygame.draw.line(screen, (0,0,0), (100, 0), (100, 600), 2)
pygame.draw.line(screen, (0, 0, 0), (200, 0), (200, 600), 2)
pygame.draw.line(screen, (0, 0, 0), (300, 0), (300, 600), 2)
score_text = font.render(f"得分: {score}", True, (0, 0, 0))
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(60)
game_over_text = font.render(f"游戏结束!得分:{score} ", True,(0,0,0))
screen.fill((255,255,255))
screen.blit(game_over_text,(200 - game_over_text.get_width() // 2, 300- game_over_text.get_height() // 2))
pygame.display.flip()
pygame.time.wait(2000)
pygame.quit()
五、其他(感悟、思考等)
1.全课总结:
不知不觉中,咱们的Python 课程已落下帷幕,在学习 Python 的这段日子里,虽未深入高阶领域,但收获已然不少。初见Python代码时,我满是陌生与困惑,但随着课程推进,我逐渐熟悉了基础语法,能编写一些简单的程序。最令我惊喜的是,最终在完成结课作业时,我竟然能完成了一个简单的钢琴块小游戏的编写~。虽仍有许多知识待探索,但这段经历让我对Python有了初步认识,也让我明白学习需要耐心与坚持。未来,我会继续努力,探索未知,弥补不足,逐步提升 Python 水平,向着更广阔的编程天地迈进。
2.课程感想体会:
要特别感谢王志强老师。王老师上课讲得既清楚又有趣,让我更容易理解那些复杂的概念。在学习过程中,老师总是耐心解答我的问题,哪怕是那些很“低级”的问题。虽然我的PyCharm 总是出问题,但老师的帮助让我顺利克服困难。(此处真的要吐槽一下,为啥我的 PyCharm 总是出问题啊啊啊啊啊!?🥲)我的学习进步离不开老师的帮助,真心感谢王老师!
3.意见和建议:
我建议可以多增加一些课堂互动,让下边的学生更多参与到课堂中来;课上所用到的代码(作业代码除外),下课后可以选择性发群里,方便有需要的同学复习;针对PyCharm,老师可以提前准备一些常见问题的解决方案(比如我的最新版pycharm显示不了中文的版本问题),或者在课堂上进行简单介绍,帮助我们更好地使用这些工具。

参考资料
-
《零基础学Python》(2018 明日科技编著)
-
豆包ai

浙公网安备 33010602011771号