20212222《Python程序设计》实验四 Python综合实践实验报告

课程:《Python程序设计》

班级:2122

姓名: 黄凯琳

学号:20212222

实验教师:王志强

实验日期:2022522

必修/选修: 公选课

1.实验内容

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

2. 实验过程及结果

  1. 前期准备

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

  1. 实验过程

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

(1) 下载pygame

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

 

 

 

 

    

第二步 pycharm中再次下载

在这里导入pygame模块

 

 

 

在这里我已经下载pygame

 

 

 

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

        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.1           # 重力递增,下降越来越快

            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))  # 填入到背景

 

    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))

        Bird.birdUpdate()  # 更新小鸟状态

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

 

        pygame.font.init()  # 初始化字体类

        font = pygame.font.SysFont(None, 50)

 

        size = width, height = 400, 650

        screen = pygame.display.set_mode(size)  # 设置窗口

        clock = pygame.time.Clock()  # 设置时钟

        color = (255, 255, 255)

 

        Bird = Bird()  # 实例小鸟类

        Pipeline = Pipeline()

        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 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)

 

            createMap()  # 生成地图

 

    pygame.quit()

以上是本次实验的代码

问题:

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

 

 

 

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

 

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

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

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

 

 

 

 

 

上传代码到ECS主机

 

 

 

 

putty上运行它!

参考了这篇文章

 

 

 

 

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

 

 

 

 

 3、主要问题

  1. 编写代码问题已经在第二部分呈现,
  2. 编写代码很难,有很多不懂的语句,报错了需要不断查资料改正
  3. 运行代码时有错,因为文件地址与视频博主不同,最后更正

  4. 用云服务器做实验,参考c语言运行方法,但是python又不同,有搜索方法
  5. pygame找不到屏幕    解决方法:安装xming

 

## 课堂总结

    

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

最后,王志强老师真的是个很好的老师,会在课上花费主要时间来讲课,而不是什么都不讲直接写代码。

我的一点小建议是,老师可以放慢一点讲课速度,多讲一些常用的语句,过难且少用的知识可以略讲,因为学校没有开设python必修课,大家对python的了解都是比较浅薄的,尤其是大一无基础的孩子们,真的会觉得难度大,不太跟得上,希望志强老师可以把python课上得越来越好!!

 

 

   

 

posted @ 2022-05-29 08:31  霸道总柴~  阅读(534)  评论(0编辑  收藏  举报