20192429马一

导航

 

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

posted on 2020-06-13 23:40  20192429马一  阅读(405)  评论(0编辑  收藏  举报