zoukankan      html  css  js  c++  java
  • 20192429 2019-2020-2 《Python程序设计》实验四报告

    20192429 2019-2020-2 《Python程序设计》实验四报告

    课程:《Python程序设计》
    班级: 1924
    姓名: 马一
    学号:20192429
    实验教师:王志强
    实验日期:2020年6月1日
    必修/选修: 公选课

    1.实验内容

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

    2. 实验过程及结果

    pygame安装

    41

    飞翔的小鸟的实验代码

    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.2  # 重力递增,下降越来越快
            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))  # 填入到背景
    
    # 显示管道
    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()  # 鸟移动
    
    # 显示分数
    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() - 10,
                         Pipeline.pineUp.get_height())
    
    # 下方管子的矩形位置
    downRect = pygame.Rect(Pipeline.wallx, 500,
                           Pipeline.pineDown.get_width() - 10,
                           Pipeline.pineDown.get_height())
    # 检测小鸟与上下方管子是否碰撞
    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
    
    
    def getResutl():
    final_text1 = "Game Over"
    final_text2 = "Your final score is:  " + 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))  # 设置第二行文字颜色
    screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100])  # 设置第一行文字显示位置
    screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200])  # 设置第二行文字显示位置
    pygame.display.flip()  # 更新整个待显示的Surface对象到屏幕上
    
    
    if __name__ == '__main__':
    """主程序"""
    pygame.init()  # 初始化pygame
    pygame.font.init()  # 初始化字体
    font = pygame.font.SysFont("Arial", 50)  # 设置字体和大小
    size = width, height = 400, 650  # 设置窗口
    screen = pygame.display.set_mode(size)  # 显示窗口
    clock = pygame.time.Clock()  # 设置时钟
    Pipeline = Pipeline()  # 实例化管道类
    Bird = Bird()  # 实例化鸟类
    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 event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True  # 跳跃
                Bird.gravity = 5  # 重力
                Bird.jumpSpeed = 10  # 跳跃速度
    
        background = pygame.image.load("assets/background.png")  # 加载背景图片
        if checkDead():  # 检测小鸟生命状态
            getResutl()  # 如果小鸟死亡,显示游戏总分数
        else:
            createMap()  # 创建地图
    pygame.quit()
    

    小鸟飞行游戏

    42

    游戏结束

    43

    3. 实验过程中遇到的问题和解决过程

    • 问题1:pygame 安装失败
    • 问题1解决方案:由于 pip version版本过低导致,所以只需要在cmd中升级pip即可
    • 问题2:pagame 安装问题
    • 问题2解决方案:下载的.whl文件必须在dos界面下安装,注意手动添加环境变量

    4.程序改进建议

    (1)对于用按键重开游戏问题没有设置按键,这点值得改进,游戏结束往往就直接关闭了界面

    (2)往往程序结束游戏会出现卡死现象,如何脱离卡死任然是问题

    5.关于pygame的感悟

    Pygame更致力于2D游戏的开发,也就是说,你可以用Pygame写一个植物大战僵尸,但是写一个魔兽世界则相当困难……请不要做出鄙夷的目光,底层的东西永远是相通的,而且对于新手而言,从简单的2D入手才是正途。

    理解事件:事件是什么,其实从名称来看我们久能想到些什么,而且你所想到的基本就是事件的真正意思了。我们上一个程序,会一直运行下去,知道你关闭窗口而产生一个QUIT事件,Pygame会接受用户的各种操作(比如按键盘,移动鼠标等)产生事件。事件随时可能发生,而且量也可能会很大,Pygame的做法是把一系列的事件存放一个队列里,逐个的处理。

    事件检索:如果我们使用pygame.event.wait(),Pygame就会等到发生一个事件才继续下去,就好像有哨兵把守的门一样,来一个进一个…一般游戏中不太实用,因为游戏往往是需要动态运作的;而另一个方法pygame.event.poll()就好一些,一旦调用,它会根据现在的情形返回一个真实的事件,或者一个“什么都没有”。

    关于python程序设计这门课的感想

    非常感想王老师带领我进入了python的大门,让我看到,这个python不仅仅是一款爬虫软件,它更是可以将游戏、网络安全攻防纳入其中的综合软件

    Python 又被称作“胶水语言”,胶水这词非常贴切,想象一下,它能非常方便的把 C++ 和 JAVA 粘在一起。虽然 JAVA 能直接调用 C++,但需要通过标准接口,并改变双方的主体程序。而 Python 这种脚本语言,可以在不改变任何程序的情况下,通过外围的数据处理,让 JAVA 和 C++ 实现联动。在学习python的过程中我发现,我可以将电脑当做是一个人来与它沟通,而不是像学习c语言一样,我要把电脑当做是一个“白痴”。

    参考资料

    百度、CSDN论坛、《零基础学python》

    码云链接

    https://gitee.com/ma_yi/pyexperiment1/commit/2628f1df948f8956479e85760c9633b219d883d6

  • 相关阅读:
    POJ2155 Matrix
    POJ3469 Dual Core CPU
    洛谷P1469找筷子
    CodeForces 97D. Robot in Basement
    UVa11542 Square
    清澄 A1485. Catch The Penguins 抓企鹅
    Bzoj2595: [Wc2008]游览计划
    HDU4085 Peach Blossom Spring
    CodeForces 333E. Summer Earnings
    洛谷P3389 【模板】高斯消元法
  • 原文地址:https://www.cnblogs.com/meeyee/p/13122338.html
Copyright © 2011-2022 走看看