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马一  阅读(459)  评论(0)    收藏  举报