• 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!

    四. 参考资料

  • 相关阅读:
    《梦段代码》阅读笔记03
    用户场景
    冲刺!
    冲刺!
    周总结8
    冲刺!
    冲刺!
    PMS权限管理和鉴权过程
    PMS构造函数以及apk如何扫描
    PMS的学习之旅
  • 原文地址:https://www.cnblogs.com/lanvin/p/14924601.html
Copyright © 2020-2023  润新知