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显示不了中文的版本问题),或者在课堂上进行简单介绍,帮助我们更好地使用这些工具。

参考资料

posted @ 2025-05-27 09:56  20244319梁悦  阅读(60)  评论(0)    收藏  举报