144
社区成员




课程:《Python程序设计》
班级: 2022
姓名: 尹毅
学号:20221115
实验教师:王志强
实验日期:2022年5月25日
必修/选修: 公选课
Python综合应用:编写小游戏———flappybird.
实验代码:
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()
引用的图片:
运行视频:
将代码上传到gitee:
选择flappybird这个游戏是因为我以前用过C语言编译过这个的游戏,但是那个更加简单,图案也非常单调,而利用python编译的这个游戏时之前的经历给了我很大帮助,有了基本的思路,把这个复杂的程序分成几个小的部分,逐一解决,再一次又一次的代码纠错,程序能够运行的时候,看到屏幕上运行着自己尝试制作的小游戏,我的内心十分有成就感。在兴奋之余,我也在思考这个程序可以完善改进的地方,比如柱子的高度可以改成随机的,且死亡之后添加是否继续的对话框,选择难度等等。我相信在我对python有更深一步的理解和学习后这些问题都能够解决。
转眼间Python就结课了,在这之中我学到很多Python基础知识,如面向对象,字典,爬虫等等。在课程中,我见识了Python相对于C语言的便捷之处,“人生苦短,我用python”。对我来说,最震撼的就是Python的库和函数的量,很多都可以用库中函数来很容易的解决,无需像C语言一样写很多的函数。我对python教学过程中深刻就是对爬虫的学习,在学长讲完爬虫后,我见证了Python的应用之广泛与强大,同时,运用爬虫在Python上运用ChatGPT和拟声,在我认为这会需要很多代码,但却只需要十几行代码,这让我很震撼。同时,我还对web编程十分感兴趣,我试过做过一个html链接,也看到过很多神奇的应用,在我们学校C语言练习网站上,有一个小游戏2048就是用HTMl写的。在进行对python的有关学习之后,我对它的兴趣更加浓厚。至于意见,在我看来,老师讲课很有趣,有很多操作实例,这让我有了一个很直观的认识,也让我很好的去理解陌生的知识。但我建议老师可以平时多分享一些python简单但是有趣的小程序,多让同学动手操作,同时多分享一些教辅资料。