pygame库开发较麻烦,所以先从pygame zero开始学习
1 pygame zero库下载
1.1 打开cmd
方法见我之前的文章:pygame开发(一)——pygame库下载-CSDN博客文章浏览阅读20次。pygame安装https://blog.csdn.net/m0_66766480/article/details/134083288界面如下:
1.2 输入该指令
"E:\myFile\Program Files\Python37\python.exe" -m pip install pgzero
我前面的博客里用的都是上面的安装方法,这里说一个更简单一点的方法,如下:
pip install pgzero
其实就是把前面那一串路径和"-m"去掉,但有个问题是有的电脑因为之前Python卸载是方法不正规等原因有数据残留导致找不到Python(就像我的电脑,这也是我在前面讲Python安装的博客里要说软件卸载方法的原因之一,都是踩过的坑啊),只能用方法一
1.3 安装完成
1.3.1 安装成功
1.3.2 安装失败
如果出现失败的情况,可以按以下方法尝试安装,不需要可以跳过
1.3.2.1 下载
1.3.2.1.1 打开pypi
1.3.2.1.2 搜索pgzero
1.3.2.1.3 选择合适版本(一般选第一个)
1.3.2.1.4 选择下载类型
点开"Download Files"
选择whl版本文件,单击后开始下载
1.3.2.52 安装
1.3.2.2.1 打开刚下载下来的文件所在文件夹
1.3.2.2.2 按住Shift键,同时右键文件夹空白处,点击“从此处打开命令窗口”
1.3.2.2.3 又是这个cmd窗口
1.3.2.2.4 输入以下指令
"E:\myFile\Program Files\Python37\python.exe" -m pip install pgzero-1.2.1-py3-none-any.whl
"pgzero-1.2.1-py3-none-any.whl"是刚才下载的whl文件的文件名(不能改)
1.3.2.2.4 安装成功
2 pgzero开发
2.1 导入库
这是一个坑,这里落实以下
本库全名:pygame zero
缩写: pgzero
导入所用库名:pgzrun(pygame zero run的缩写)
所以,导入库的正确方法如下
import pgzrun
2.2 窗口大小
方法很简单,就两行代码,写完就不用管了
WIDTH = 800 # 宽度
HEIGHT = 600 # 高度
2.3 运行程序
注意:放在程序最后
pgzrun.go()
这行代码和root.mainloop()很像(tkinter库中的代码),都是放最后,代表进入主循环(开始运行)
2.4 角色模块Actor()
使用方式:
actor_name = Actor('file name')
# actor_name为储存角色的变量名
# file name是文件名,但要注意的是传入的文件名会在程序所在文件夹中的'images'文件夹中查找,可以不写后缀名
2.4.1 常用属性
使用方法:
角色名.属性名 = 属性内容
2.4.1.1 image属性
作用:改变角色图片
属性内容:同Actor()方法中的'file name'
2.4.1.2 位置属性
作用:改变位置
属性名 | 属性内容 |
---|---|
pos | 中心坐标 |
x | 中心横坐标 |
y | 中心纵坐标 |
top | 顶部横坐标 |
bottom | 底部横坐标 |
left | 左边纵坐标 |
right | 右边纵坐标 |
注意:pygame(包括后面要讲的标准版)中坐标用的是平面直角坐标系,但与数学中常见的平面直角坐标系不同,pygame的坐标系是以左上角为(0, 0)点,单位长度为像素,右为x轴正方向,下为y轴正方向的平面直角坐标系
2.4.2 常用方法
使用方法:
角色名.方法名(参数名=参数内容) # “参数名=”大多数能省略
2.4.2.1 colliderect()方法
参数:另一个角色
返回值:布尔(bool)类型(True或False)
作用:检测角色与角色的碰撞,若碰撞,返回True,否则返回False
2.4.2.2 collidepoint()方法
参数:坐标(一般习惯是元组型,但列表等有序的数据类型也是可以的)
返回值:布尔类型
作用:检测角色与坐标的碰撞,若碰撞,返回True,否则返回False
2.4.2.3 draw()方法
参数:无
返回值: 无
作用:将角色绘制到窗口上
2.5 功能模块
这一块不知道叫什么,自己起了个名,仅仅用作便于介绍
这一块的实现方法(指编写第三方库的时候)不知道是怎么实现的,整体是这样的一种用法,就是按给定的函数名定义函数,程序在相应的时候调用相应函数,但用起来还是挺简单的
到这里,光说就完全说不明白了,所以开始开发一个小游戏,借开发来讲这些知识
框架代码:
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (5, 30)
# 设置窗口位置为(5, 30),使窗口左上角显示在屏幕的(5, 30)位置
import pgzrun
import random
WIDTH = 400 # 窗口宽度为400像素
HEIGHT = 300 # 窗口高度为300像素
bird = Actor('bird', (50, 150))
# 创建鸟的角色,使用bird.png图片,初始位置为(50, 150)
pillar = [
lambda: Actor('pillar1', (500, -150)), # 第一种柱子的外观和初始位置
lambda: Actor('pillar2', (500, 450)) # 第二种柱子的外观和初始位置
]
"""
Actor中的参数是在程序所在文件夹中的images子文件夹中找的,且不用输入后缀名
比如传入'bird',程序找该文件的相对路径就为"./images/bird.png"
"""
pillars = [random.choice(pillar)()] # 初始化一个柱子列表,并随机选择一种柱子添加进去
speed = 0 # 鸟的速度
begin = 0 # 游戏状态,0表示初始状态,1表示游戏进行中,2表示游戏结束
score = 0 # 得分
def fly():
global speed, begin, pillars, score
speed = 35 # 设置鸟的速度
if begin == 2: # 如果游戏结束,重置得分并清空柱子列表
score = 0
del pillars
pillars = [random.choice(pillar)()] # 随机选择一种柱子添加进去
begin = 1 # 设置游戏状态为进行中
# 后面的代码在这里补充
pgzrun.go() # 运行Pygame Zero游戏引擎,启动游戏循环
2.5.1 draw
实现功能:绘制界面
不多说废话了,直接上代码
def draw():
screen.blit('background', (0, 0)) # 绘制背景图片
bird.draw() # 绘制鸟
for pl in pillars:
pl.draw() # 绘制柱子
screen.draw.text(str(score), (0, 0), color=(0, 0, 0)) # 在左上角显示得分
这一段代码(包括后面的其他功能)要写在pgzrun.go()之前,import pgzrun之后
screen.blit这一行是绘制图片用的,参数与Actor一样,可以绘制一些固定的图片(不固定的其实也行,但不如直接用Actor方便),比如绘制背
景
2.5.2 on_mouse_down/on_mouse_up
可接收参数:
pos:坐标
button:按键
实现功能:检测鼠标按下/抬起
代码:
def on_mouse_down(): # 鼠标点击事件的处理函数
fly() # 调用前面定义的fly()函数实现飞行
global说人话就是使用函数外面的变量,这里是使上升速度为7,当然,这个功能目前还没实现。
2.5.3 on_key_down/on_key_up
实现功能:检测键盘按下/抬起
代码:
def on_key_down(): # 键盘按下事件的处理函数
fly() # 调用前面定义的fly()函数实现飞行
2.5.4 update
实现功能:重复执行
频率:每秒60帧
代码:
def update():
global speed, pillars, begin, score
if begin == 1: # 如果游戏状态为进行中
bird.y -= speed // 9 # 根据速度更新鸟的位置
if bird.top < 0: # 如果鸟到达窗口顶部,则将其位置设置为窗口顶部
bird.top = 0
if bird.bottom > 300: # 如果鸟到达窗口底部,则游戏结束
begin = 2
speed -= 1 # 速度逐渐减小
if pillars[-1].x <= 250: # 如果最后一个柱子的右边界到达窗口的一半位置
pillars.append(random.choice(pillar)()) # 随机选择一种柱子添加进去
for p in pillars:
p.x -= 5 # 更新柱子的位置,使其向左移动
if p.right <= 0: # 如果柱子的右边界超出窗口,则将其删除并增加得分
pillars.remove(p)
score += 1
if p.colliderect(bird): # 如果鸟与柱子发生碰撞,则游戏结束
begin = 2
2.5.4 完整代码
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (5, 30)
# 设置窗口位置为(5, 30),使窗口左上角显示在屏幕的(5, 30)位置
import pgzrun
import random
WIDTH = 400 # 窗口宽度为400像素
HEIGHT = 300 # 窗口高度为300像素
bird = Actor('bird', (50, 150))
# 创建鸟的角色,使用bird.png图片,初始位置为(50, 150)
pillar = [
lambda: Actor('pillar1', (500, -150)), # 第一种柱子的外观和初始位置
lambda: Actor('pillar2', (500, 450)) # 第二种柱子的外观和初始位置
]
"""
Actor中的参数是在程序所在文件夹中的images子文件夹中找的,且不用输入后缀名
比如传入'bird',程序找该文件的相对路径就为"images/bird.png"
"""
pillars = [random.choice(pillar)()] # 初始化一个柱子列表,并随机选择一种柱子添加进去
speed = 0 # 鸟的速度
begin = 0 # 游戏状态,0表示初始状态,1表示游戏进行中,2表示游戏结束
score = 0 # 得分
def fly():
global speed, begin, pillars, score
speed = 35 # 设置鸟的速度
if begin == 2: # 如果游戏结束,重置得分并清空柱子列表
score = 0
del pillars
pillars = [random.choice(pillar)()] # 随机选择一种柱子添加进去
begin = 1 # 设置游戏状态为进行中
def draw():
screen.blit('background', (0, 0)) # 绘制背景图片
bird.draw() # 绘制鸟
for pl in pillars:
pl.draw() # 绘制柱子
screen.draw.text(str(score), (0, 0), color=(0, 0, 0)) # 在左上角显示得分
def on_mouse_down(): # 鼠标点击事件的处理函数
fly() # 调用前面定义的fly()函数实现飞行
def on_key_down(): # 键盘按下事件的处理函数
fly() # 调用前面定义的fly()函数实现飞行
def update():
global speed, pillars, begin, score
if begin == 1: # 如果游戏状态为进行中
bird.y -= speed // 9 # 根据速度更新鸟的位置
if bird.top < 0: # 如果鸟到达窗口顶部,则将其位置设置为窗口顶部
bird.top = 0
if bird.bottom > 300: # 如果鸟到达窗口底部,则游戏结束
begin = 2
speed -= 1 # 速度逐渐减小
if pillars[-1].x <= 250: # 如果最后一个柱子的右边界到达窗口的一半位置
pillars.append(random.choice(pillar)()) # 随机选择一种柱子添加进去
for p in pillars:
p.x -= 5 # 更新柱子的位置,使其向左移动
if p.right <= 0: # 如果柱子的右边界超出窗口,则将其删除并增加得分
pillars.remove(p)
score += 1
if p.colliderect(bird): # 如果鸟与柱子发生碰撞,则游戏结束
begin = 2
pgzrun.go() # 运行Pygame Zero游戏引擎,启动游戏循环
那么,pygame zero学习就到这了,虽然还有更多功能,但已经能写一些基础程序了,并且这不是本专栏重点,这个只是作为一个跳板去学习更专业的pygame,更多的功能就不说了
3 AI版本
这个程序我编写了一个AI程序,感兴趣的看下面这篇文章
传送门: