课程:《Python程序设计》

姓名: 黄凯琳

实验教师:王志强


1.实验内容

   Python综合应用:运用pygame尝试编写flappy bird代码

2. 实验过程及结果

  1. 前期准备

刚听到大作业实验要求的时候,我也很懵,询问了曾经选过python课程的学长,决定制作flappy bird游戏。

  1. 实验过程

在网上搜索了一些教学视频与教学博客,flappy bird这款游戏的教程很多,对新手很友好,最后选择跟视频一起编写代码并运行,其中也有一些小问题。

(1) 下载pygame

这里我已经下载过,只做一下示意,第一步在cmd中进行下载

python grab python grabcut birder natting_c语言

  

第二步 在pycharm中再次下载

在这里导入pygame模块

 

python grab python grabcut birder natting_python_02

 

 

在这里我已经下载pygame

 

python grab python grabcut birder natting_编写代码_03

 

(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")]

默认飞行状态

鸟所在X轴坐标,即是向右飞行的速度

鸟所在Y轴坐标,即上下飞行高度

默认情况小鸟自动降落

跳跃高度

重力

默认小鸟生命状态为活着

def birdUpdate(self):
        if self.jump:

小鸟跳跃

速度递减,上升越来越慢

鸟Y轴坐标减小,小鸟上升

        else:

小鸟坠落

重力递增,下降越来越快

鸟Y轴坐标增加,小鸟下降

更改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))     # 填充颜色
填入到背景
 
    import pygame
    import sys
    import time
 
    class Bird(object):
定义小鸟
        def __init__(self):
定义初始化方法
            self.birdRect = pygame.Rect(65, 50, 50, 50)
            self.birdStatus = [pygame.image.load(r'picture/1.png'),
                               pygame.image.load(r'picture/2.png'),
                               pygame.image.load(r'picture/dead.png')]
            self.status = 0
            self.birdx = 120
            self.birdy = 350
            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
            else:
                self.gravity += 0.2
                self.birdy += self.gravity
            self.birdRect[1] = self.birdy
 
    class Pipeline(object):
定义管道类
        def __init__(self):
            self.wallx = 400
            self.pineUp = pygame.image.load(r'picture/top.png')
            self.pineDown = pygame.image.load(r'picture/bottom.png')
 
        def updatePipeline(self):
定义移动方法
            self.wallx -= 5
            if self.wallx < -80:
                global score
                score += 1
                self.wallx = 400
 
    def createMap():
        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))
更新小鸟状态
        font.render('Score' + str(score), -1, (255, 255, 255))
        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(), Pipeline.pineUp.get_height())
        downRect = pygame.Rect(Pipeline.wallx, 500, Pipeline.pineDown.get_width(), Pipeline.pineDown.get_height())
检测矩形碰撞
        if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
            Bird.dead = True
边界检测
        else:
            if 0 < Bird.birdRect[1] < height:
                Bird.dead = False
                return True
            else:
                return False
 
    def getResult():
获取总分
        final_text1 = "Game Over"
        final_text2 = "Your Score:" + 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))
        screenwidth = int(screen.get_width() / 2)
        surf1 = int(ft1_surf.get_width() / 2)
        surf2 = int(ft2_surf.get_width() / 2)
 
        screen.blit(ft1_surf, [screenwidth - surf1, 100])
        screen.blit(ft2_surf, [screenwidth - surf2, 200])
        pygame.display.update()
 
    if __name__ == '__main__':
 
        pygame.init()
 
初始化字体类
        font = pygame.font.SysFont(None, 50)
 
        size = width, height = 400, 650
设置窗口
设置时钟
        color = (255, 255, 255)
 
实例小鸟类
        Pipeline = Pipeline()
        score = 0
 
        while True:
每秒执行60次
 
轮询事件监测
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                if event.type == pygame.KEYDOWN or pygame.MOUSEBUTTONDOWN and not Bird.dead:
                    Bird.jump = True
                    Bird.gravity = 5
                    Bird.jumpSpeed = 10
 
            # screen.fill(color)
            background = pygame.image.load(r'picture/background.png')
            if checkDead():
                pass
            else:
                createMap()
                getResult()
                time.sleep(2)
 
生成地图
 
    pygame.quit()

以上是本次实验的代码

l 问题:

这一部分一直在报错,不能正常运行。

 

python grab python grabcut birder natting_c语言_04

 

 

原因是我从网上找到并保存游戏所需图片时没有把图片的名称和路径都设置为参考代码里相同,所以运行时找不到它

 

(3) 连接云服务器 上传代码

关于这个操作,我完全把c语言的华为云实验方法应用过来了,但c语言与python的运行还是有差别,所以也查阅了很多资料

l  首先,打开云服务器,在putty上登录

 

python grab python grabcut birder natting_编写代码_05

 

 

python grab python grabcut birder natting_python_06

 

 

l 上传代码到ECS主机

 

python grab python grabcut birder natting_c语言_07


l 在putty上运行它!

 

python grab python grabcut birder natting_c语言_08

 

python grab python grabcut birder natting_python grab_09

 

 

 下面是游戏成功运行图片(视频提交给课代表)

python grab python grabcut birder natting_python grab_10

 

 

 

 

 3、主要问题

  1. 编写代码问题已经在第二部分呈现,
  2. 编写代码很难,有很多不懂的语句,报错了需要不断查资料改正
  3. 运行代码时有错,因为文件地址与视频博主不同,最后更正
  4. 用云服务器做实验,参考c语言运行方法,但是python又不同,有搜索方法
  5. pygame找不到屏幕    解决方法:安装xming


 

## 课堂总结

在大一下学期选择了python选修课,其实是一个很大的挑战,因为在此之前没有接触过编程,同时还要学习另一种语言c语言,所以压力比较大。但是我还是有在认真听课,虽然那些知识点对我来说难度很高。还记得第一次做实验报告的时候,完完全全不懂该怎么写,需要使用的网站,软件都没有接触过,因为托管代码到码云真的抱着电脑研究了整整一个周末,但最后也坚持做好了所有作业,并且也学到很多知识。王老师讲课风格也很轻松,要点清楚明了。在python课程的学习过程中,还熟悉了有关编程能力学习的其他方面,懂得了遇到问题是常态,不断搜索学习才是解决问题的关键,在日后的计算机能力学习中,一定会更加顺利。