20192415 2020-2021-2 《Python程序设计》实验4报告
- 课程:《Python程序设计》
- 班级: 1924
- 姓名: 邢质斌
- 学号: 20192415
- 实验教师:王志强
- 实验日期:2021年6月20日
- 选修: 公选课
一.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
二. 实验过程及结果
(一) 实验分析与设计
该游戏来源于Flappy Bird——一款鸟类飞行游戏,通过一根手指操控按下小鸟上飞。
游戏中主要有两个对象:小鸟、柱,创建Brid类和Pillar类分别表示两个对象。小鸟需要上下移动来躲避柱,在Brid类中创建一个bridUpdate()方法,实现小鸟的上下移动。为了体现小鸟向前飞行的特征,需要让柱一直向左侧(后侧)移动,这样在画面中就好像小鸟在向前(左侧)飞行。因此在Pillar类中需要updatePillar()方法实现柱的移动。
此外,使用createMap()函数绘制地图(背景与必要的文字说明);使用checkDead()函数判断小鸟的生命状态,是否发生碰撞,若碰撞则游戏结束;使用getResult()函数获取得分,成功飞越一对上下柱得一分。
(二) 实现过程
-
安装Pygame
Pygame是一组跨平台的Python模块, 用于创建视频游戏,现已已被用于数百种商业和开源游戏。
python -m pip install pygame
-
创建并保持游戏窗口
导入pygame模块,调用init()方法初始化pygame模块。设置窗口的宽和高,使用display模块显示窗体。
import sys import pygame pygame.init() # 初始化pygame size = width, height = 400, 650 # 设置窗口大小,宽400,高650 screen = pygame.display.set_mode() # 显示窗口
完成上述步骤后,得到一个“出现后一闪而过的黑色窗口”。这是因为程序执行完成后,会自动关闭。如果想要让窗口一直显示,需要使用while True让程序一直执行。使用pygame.event.get()获取事件队列,使用for...in遍历事件。还需要设置关闭按钮。根据type属性判断事件类型,event.type等于pygame.QUIT表示检测到关闭pygame窗口事件。
while True: # 死循环确保窗口一直显示 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() pygame.quit() # 退出pygame
-
游戏图片的加载与移动
使用pygame中iamge模块的load()方法加载图片,其返回值是一个Surface对象。Surface是用来代表图片的pygame对象,可以对其进行涂画、变形、复制等操作。屏幕也是一个Surface,pygame.display.set_mode()返回了一个屏幕Surface对象。将小鸟、柱的Surface对象画到屏幕的Surface对象上,需要使用blit()方法。而display模块的flip()方法可以将整个待显示的Surface对象更新到屏幕上。
以柱的图片加载和显示为例:
#初始化定义柱中加载上、下两根柱的图片 self.pillUp = pygame.image.load("assets/top.png") self.pillDown = pygame.image.load("assets/bottom.png") # 显示柱 screen.blit(Pillar.pillUp, (Pillar.wallx, -300)) # 上柱坐标位置 screen.blit(Pillar.pillDown, (Pillar.wallx, 500)) # 下柱坐标位置 Pillar.updatePillar() # 柱移动 # 更新整个待显示的Surface对象到屏幕上 pygame.display.flip()
游戏过程中,柱需要向后移动,小鸟需要上下飞翔,这就涉及到其对应Surface对象的移动。Pygame通过Rect对象存储和操作矩形区域。首先利用Rect初始化上、下两根柱的垂直位置。接着构造柱的移动方法,通过改变柱所在X轴坐标进行水平移动。
以柱的移动为例:
# 上方柱的矩形位置 upRect = pygame.Rect(Pillar.wallx, -300, Pillar.pillUp.get_width() - 10, Pillar.pillUp.get_height()) # 下方柱的矩形位置 downRect = pygame.Rect(Pillar.wallx, 500, Pillar.pillDown.get_width() - 10, Pillar.pillDown.get_height()) def updatePillar(self): self.wallx -= 5 # 柱X轴坐标递减,即柱向左移动 # 当柱运行到一定位置,即小鸟飞越柱,分数加1同时重置柱 if self.wallx < -80: global score score += 1 self.wallx = 400
-
碰撞检测
当小鸟撞到柱子上或飞得过高过低时形成碰撞,此后小鸟将改变原本的飞行状态,直接坠落,游戏结束。因此,需要有碰撞检测功能。
# 检测小鸟与上下方柱是否碰撞 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
(三) 实验结果
(四)将代码push至码云
三. 课程感想与意见建议
经过这一学期学习,我掌握了Python的语言基础、流程控制语句、序列的应用、有关字符串的操作、文件操作、异常处理,学习了解了正则表达式、网络爬虫、Socket编程、Python操作数据库等等。这门课程令人受益匪浅。
同时,我还在原先的认知水平上又了解到了Git这样一个平台,对于未来的学习大有帮助。其中令我感触最深的就是Python的第三方库的数量之多、覆盖面之广,利用这些第三方库可以轻松实现许多复杂的功能,对于深入学习和创新实践大有裨益。
“师傅领进门,修行在个人。”虽然课程结束了,但对Python的学习仍要继续、仍在路上。以后,我会继续坚持以不息为体,以日新为道,注重知识积累,渴求能力提升,fighting!