20221115 实验四《Python程序设计》实验报告

毅秋 2023-05-25 22:27:37

20221115 2022-2023-2 《Python程序设计》实验x报告

课程:《Python程序设计》
班级: 2022
姓名: 尹毅
学号:20221115
实验教师:王志强
实验日期:2022年5月25日
必修/选修: 公选课

1.实验内容

Python综合应用:编写小游戏———flappybird.

2. 实验过程及结果

实验代码:
import pygame
import sys
import random

class Bird(object):
"""定义一个鸟类"""

def __init__(self):
    """定义初始化方法"""
    self.birdRect = pygame.Rect(65, 50, 50, 50)  # 鸟的矩形
    # 定义鸟的3种状态列表
    self.birdStatus = [pygame.image.load("assets/1.png"),
                       pygame.image.load("assets/2.png"),
                       pygame.image.load("assets/dead.png")]
    self.status = 0  # 默认飞行状态
    self.birdX = 120  # 鸟所在X轴坐标,即是向右飞行的速度
    self.birdY = 350  # 鸟所在Y轴坐标,即上下飞行高度
    self.jump = False  # 默认情况小鸟自动降落
    self.jumpSpeed = 10  # 跳跃高度
    self.gravity = 5  # 重力
    self.dead = False  # 默认小鸟生命状态为活着

def birdUpdate(self):
    if self.jump:
        # 小鸟跳跃
        self.jumpSpeed -= 1  # 速度递减,上升越来越慢
        self.birdY -= self.jumpSpeed  # 鸟Y轴坐标减小,小鸟上升
    else:
        # 小鸟坠落
        self.gravity += 0.2  # 重力递增,下降越来越快
        self.birdY += self.gravity  # 鸟Y轴坐标增加,小鸟下降
    self.birdRect[1] = self.birdY  # 更改Y轴位置

class Pipeline(object):
"""定义一个管道类"""

def __init__(self):
    """定义初始化方法"""
    self.wallx = 400;  # 管道所在X轴坐标
    self.pineUp = pygame.image.load("assets/top.png")
    self.pineDown = pygame.image.load("assets/bottom.png")

def updatePipeline(self):
    """"管道移动方法"""
    self.wallx -= 5  # 管道X轴坐标递减,即管道向左移动
    # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
    if self.wallx < -80:
        global score
        score += 1
        self.wallx = 400

def createMap():
"""定义创建地图的方法"""
screen.fill((255, 255, 255)) # 填充颜色
screen.blit(background, (0, 0)) # 填入到背景

# 显示管道
screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300));  # 上管道坐标位置
screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500));  # 下管道坐标位置
Pipeline.updatePipeline()  # 管道移动

# 显示小鸟
if Bird.dead:  # 撞管道状态
    Bird.status = 2
elif Bird.jump:  # 起飞状态
    Bird.status = 1
screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))  # 设置小鸟的坐标
Bird.birdUpdate()  # 鸟移动

# 显示分数
screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50))  # 设置颜色及坐标位置
pygame.display.update()  # 更新显示

def checkDead():
# 上方管子的矩形位置
upRect = pygame.Rect(Pipeline.wallx, -300,
Pipeline.pineUp.get_width() - 10,
Pipeline.pineUp.get_height())

# 下方管子的矩形位置
downRect = pygame.Rect(Pipeline.wallx, 500,
                       Pipeline.pineDown.get_width() - 10,
                       Pipeline.pineDown.get_height())
# 检测小鸟与上下方管子是否碰撞
if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
    Bird.dead = True
# 检测小鸟是否飞出上下边界
if not 0 < Bird.birdRect[1] < height:
    Bird.dead = True
    return True
else:
    return False

def getResutl():
final_text1 = "Game Over"
final_text2 = "Your final score is: " + str(score)
ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体
ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 设置第一行文字颜色
ft2_font = pygame.font.SysFont("Arial", 50) # 设置第二行文字字体
ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置第二行文字颜色
screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置
screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 设置第二行文字显示位置
pygame.display.flip() # 更新整个待显示的Surface对象到屏幕上

if name == 'main':
"""主程序"""
pygame.init() # 初始化pygame
pygame.font.init() # 初始化字体
font = pygame.font.SysFont("Arial", 50) # 设置字体和大小
size = width, height = 400, 650 # 设置窗口
screen = pygame.display.set_mode(size) # 显示窗口
clock = pygame.time.Clock() # 设置时钟
Pipeline = Pipeline() # 实例化管道类
Bird = Bird() # 实例化鸟类
score = 0
while True:
clock.tick(60) # 每秒执行60次
# 轮询事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
Bird.jump = True # 跳跃
Bird.gravity = 5 # 重力
Bird.jumpSpeed = 10 # 跳跃速度

    background = pygame.image.load("assets/background.png")  # 加载背景图片
    if checkDead():  # 检测小鸟生命状态
        getResutl()  # 如果小鸟死亡,显示游戏总分数
    else:
        createMap()  # 创建地图
pygame.quit()

引用的图片:

img

img

img

img

img

img

img

运行视频:

将代码上传到gitee:

img

3. 实验过程中遇到的问题和解决过程

  • 问题1:一开始跟着书上的代码敲无法正常运行
  • 问题1解决方案:在项目里面下载pygame后能够正常运行
  • 问题2:书中代码并不完善
  • 问题2解决方案:上网寻找资料将省略的代码完善。
  • ...

心得体会(感悟、思考等)

选择flappybird这个游戏是因为我以前用过C语言编译过这个的游戏,但是那个更加简单,图案也非常单调,而利用python编译的这个游戏时之前的经历给了我很大帮助,有了基本的思路,把这个复杂的程序分成几个小的部分,逐一解决,再一次又一次的代码纠错,程序能够运行的时候,看到屏幕上运行着自己尝试制作的小游戏,我的内心十分有成就感。在兴奋之余,我也在思考这个程序可以完善改进的地方,比如柱子的高度可以改成随机的,且死亡之后添加是否继续的对话框,选择难度等等。我相信在我对python有更深一步的理解和学习后这些问题都能够解决。

全课总结

转眼间Python就结课了,在这之中我学到很多Python基础知识,如面向对象,字典,爬虫等等。在课程中,我见识了Python相对于C语言的便捷之处,“人生苦短,我用python”。对我来说,最震撼的就是Python的库和函数的量,很多都可以用库中函数来很容易的解决,无需像C语言一样写很多的函数。我对python教学过程中深刻就是对爬虫的学习,在学长讲完爬虫后,我见证了Python的应用之广泛与强大,同时,运用爬虫在Python上运用ChatGPT和拟声,在我认为这会需要很多代码,但却只需要十几行代码,这让我很震撼。同时,我还对web编程十分感兴趣,我试过做过一个html链接,也看到过很多神奇的应用,在我们学校C语言练习网站上,有一个小游戏2048就是用HTMl写的。在进行对python的有关学习之后,我对它的兴趣更加浓厚。至于意见,在我看来,老师讲课很有趣,有很多操作实例,这让我有了一个很直观的认识,也让我很好的去理解陌生的知识。但我建议老师可以平时多分享一些python简单但是有趣的小程序,多让同学动手操作,同时多分享一些教辅资料。

...全文
236 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

144

社区成员

发帖
与我相关
我的任务
社区描述
开展Python教学和技术交流
python 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧