20192415 2020-2021-2 《Python程序设计》实验4报告

20192415 2020-2021-2 《Python程序设计》实验4报告

  • 课程:《Python程序设计》
  • 班级: 1924
  • 姓名: 邢质斌
  • 学号: 20192415
  • 实验教师:王志强
  • 实验日期:2021年6月20日
  • 选修: 公选课

一.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

二. 实验过程及结果

(一) 实验分析与设计

该游戏来源于Flappy Bird——一款鸟类飞行游戏,通过一根手指操控按下小鸟上飞。

游戏中主要有两个对象:小鸟、柱,创建Brid类和Pillar类分别表示两个对象。小鸟需要上下移动来躲避柱,在Brid类中创建一个bridUpdate()方法,实现小鸟的上下移动。为了体现小鸟向前飞行的特征,需要让柱一直向左侧(后侧)移动,这样在画面中就好像小鸟在向前(左侧)飞行。因此在Pillar类中需要updatePillar()方法实现柱的移动。

此外,使用createMap()函数绘制地图(背景与必要的文字说明);使用checkDead()函数判断小鸟的生命状态,是否发生碰撞,若碰撞则游戏结束;使用getResult()函数获取得分,成功飞越一对上下柱得一分。

(二) 实现过程

  1. 安装Pygame

    Pygame是一组跨平台的Python模块, 用于创建视频游戏,现已已被用于数百种商业和开源游戏。

     python -m pip install pygame
    

  1. 创建并保持游戏窗口

    导入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
    
  2. 游戏图片的加载与移动

    使用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
    
  3. 碰撞检测

    当小鸟撞到柱子上或飞得过高过低时形成碰撞,此后小鸟将改变原本的飞行状态,直接坠落,游戏结束。因此,需要有碰撞检测功能。

     # 检测小鸟与上下方柱是否碰撞
     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!

四. 参考资料

posted @ 2021-06-23 21:50  20192415邢质斌  阅读(265)  评论(0编辑  收藏  举报