欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
记录分数
上一篇文章【编程】零基础Pygame小游戏开发-03中我们开发的打地鼠游戏还没有实现计分机制,我们来继续。
计算数字增加很容易,设定一个score=0
,然后击中地鼠的时候增加1就可以了。但是,如何把它显示到屏幕上呢?
可以百度搜索【pygame 显示文字】然后就可以找到大致方法,我们先进行一些测试:
import pygame
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 设定窗口
# 显示文字
pygame.font.init() # !!初始化文字
font = pygame.font.SysFont('微软雅黑', 30) # !!设定字体和字号
sur = font.render("Hello World!!{}".format(999), False, (255, 0, 0)) # !!生成w文字表面
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
window.blit(sur, (200, 10)) # !!增加分数表面
pygame.display.flip()
这段代码中可以看到pygame绘制文字分三步:
-
pygame.font.init()
先要初始化 -
pygame.font.SysFont('微软雅黑', 30)
设定字体和字号大小 -
font.render("Hello World!!{}".format(999), False, (255, 0, 0))
生成一个Surface表面
当然,最后别忘了把表面放到窗口里window.blit(sur, (200, 10))
运行上面的代码得到一个窗口如下:
我们根据这个经验改进上一篇的代码:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠标事件类型
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 设定窗口
sur = pygame.Surface([600, 400]) # 绘制背景容器
clr = (0, 0, 255)
pos6 = [[200, 200], [300, 200], [400, 200], [
200, 300], [300, 300], [400, 300]] # 六个位置
rad = 50
tick = 0 # 计数器
pos = pos6[0] # 外面记录圆的位置
# 分数
score = 0 # !!分数计数
pygame.font.init() # !!初始化文字
score_font = pygame.font.SysFont('微软雅黑', 30) # !!设定字体和字号
score_sur = score_font.render(str(score), False, (255, 0, 0)) # !!生成计数表面
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠标按下事件
mpos = pygame.mouse.get_pos() # 获取鼠标位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 计算坐标差
len = pygame.math.Vector2.length(dis) # 计算距离
if len < rad:
tick = 1000 # 立即变换位置
score = score+1 # 计分增加
# 每帧循环执行的代码
if tick > 50: # 每50次刷新变换一次
score_sur = score_font.render(
str(score), False, (255, 0, 0)) # !!重新生成分数文字表面
sur.fill((0, 0, 0)) # 用黑色覆盖前一帧的画面,实现刷新
a = random.randint(0, 5) # 随机0到5
pos = pos6[a] # 更新外部记录的圆的位置
pygame.draw.circle(sur, clr, pos, 50) # 使用随机位置
tick = 0 # 重置计数器
else: # 不刷新变换的时候
tick = tick+1 # 增加计数器
# 刷新画面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # !!增加分数表面
pygame.display.flip()
运行上面的代码,可以用鼠标点击跳动的蓝色圆,每次击中就能获得1分,实时显示在顶部。
关于文字的更多内容可以参考官方文档说明。
鼠标指针变锤子
现在窗口中显示的仍然是鼠标,而不是锤子,下面我们来看如何把鼠标变为一个特定的图形。
pygame关于鼠标控制的模块是pygame.mouse
,官方说明文档看这里。
我们可以用pygame.mouse.set_visible(False)
来隐藏鼠标,但这样一来我们就看不到鼠标无法操作了。
不过不要紧,我们之前还记得当鼠标点击的时候有一个mpos = pygame.mouse.get_pos()
可以获取当前鼠标的位置,同样我们可以在鼠标移动的时候获取鼠标的位置,然后在这个位置上画一个红色圆圈代表鼠标。
测试下面的代码:
import pygame
from pygame.locals import *
pygame.init()
window = pygame.display.set_mode([600, 400])
pygame.mouse.set_visible(False) # 隐藏鼠标
sur = pygame.Surface([600, 400])
mpos = [300, 200] # 记录鼠标位置
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEMOTION: # 当鼠标移动的时候
mpos = pygame.mouse.get_pos() # 更新鼠标位置
sur.fill((0, 0, 0)) # 填充黑色
pygame.draw.circle(sur, (255, 0, 0), mpos, 10) # 在鼠标位置画红色圆
window.blit(sur, (0, 0))
pygame.display.flip()
运行这个代码将,当鼠标划到窗口上面的时候就会有一个红点跟着鼠标移动,红点代替了原来的指针。
我们把这个红点鼠标代码放入到游戏中,得到下面的代码:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠标事件类型
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 设定窗口
sur = pygame.Surface([600, 400]) # 绘制背景容器
clr = (0, 0, 255)
pos6 = [[200, 200], [300, 200], [400, 200], [
200, 300], [300, 300], [400, 300]] # 六个位置
rad = 50
tick = 0 # 计数器
pos = pos6[0] # 外面记录圆的位置
# 分数
score = 0 # 分数计数
pygame.font.init() # 初始化文字
score_font = pygame.font.SysFont('微软雅黑', 30) # !!设定字体和字号
score_sur = score_font.render(str(score), False, (255, 0, 0)) # !!生成计数表面
# 鼠标
pygame.mouse.set_visible(False) # !!隐藏鼠标
mpos = [300, 200] # !!记录鼠标位置
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠标按下事件
mpos = pygame.mouse.get_pos() # 获取鼠标位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 计算坐标差
len = pygame.math.Vector2.length(dis) # 计算距离
if len < rad:
tick = 1000 # 立即变换位置
score = score+1 # 计分增加
elif event.type == MOUSEMOTION: # !!当鼠标移动的时候
mpos = pygame.mouse.get_pos() # !!更新鼠标位置
# 每帧循环执行的代码
if tick > 50: # 每50次刷新变换一次
score_sur = score_font.render(
str(score), False, (255, 0, 0)) # 重新生成分数文字表面
a = random.randint(0, 5) # 随机0到5
pos = pos6[a] # 更新外部记录的圆的位置
tick = 0 # 重置计数器
else: # 不刷新变换的时候
tick = tick+1 # 增加计数器
# 绘制鼠标
sur.fill((0, 0, 0)) # !用黑色覆盖前一帧的画面,实现刷新
pygame.draw.circle(sur, clr, pos, 50) # !使用随机位置画地鼠
pygame.draw.circle(sur, (255, 0, 0), mpos, 10) # !!在鼠标位置画红色圆
# 刷新画面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # 增加分数表面
pygame.display.flip()
主义者了把sur.fill
和原来画地鼠蓝圆的代码移到了下面,和画鼠标红点的代码放在了一起,这样把绘图内容放在一起更加合理。
限定每局时间
我们有很多办法限定每局的长度,比如计时限定1分钟,或者限定地鼠跳出总计100次。我们这里使用第二种限制,跳出100次就结束并统计分数。
添加一个计数器times=0
,然后每次随机位置都给它增加1,当times>100
的时候,我们就结束游戏并显示结束画面统计战果。
具体的代码没有新的内容,不多解释,直接上结果:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠标事件类型
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 设定窗口
sur = pygame.Surface([600, 400]) # 绘制背景容器
clr = (0, 0, 255)
pos6 = [[200, 200], [300, 200], [400, 200], [
200, 300], [300, 300], [400, 300]] # 六个位置
rad = 50
tick = 0 # 计数器
pos = pos6[0] # 外面记录圆的位置
# 分数
score = 0 # 分数计数
pygame.font.init() # 初始化文字
score_font = pygame.font.SysFont('微软雅黑', 30) # !!设定字体和字号
score_sur = score_font.render(str(score), False, (255, 0, 0)) # !!生成计数表面
# 鼠标
pygame.mouse.set_visible(False) # !!隐藏鼠标
mpos = [300, 200] # !!记录鼠标位置
times = 0 # 地鼠跳出的次数
times_max=10 #最多次数
tick_max=15 #地鼠每次跳多少帧
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠标按下事件
mpos = pygame.mouse.get_pos() # 获取鼠标位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 计算坐标差
len = pygame.math.Vector2.length(dis) # 计算距离
if len < rad:
tick = 1000 # 立即变换位置
score = score+1 # 计分增加
elif event.type == MOUSEMOTION: # !!当鼠标移动的时候
mpos = pygame.mouse.get_pos() # !!更新鼠标位置
if times > times_max:
# 显示结束画面
sur.fill((0, 0, 0))
pygame.mouse.set_visible(True)
sur.fill((0, 0, 0))
end_font = pygame.font.SysFont('微软雅黑', 80) # !!设定字体和字号
end_sur = score_font.render("Your Score is:{}/{}!".format(score,times_max), False, (255, 0, 0)) # !!生成计数表面
window.blit(sur, (0, 0))
window.blit(end_sur, (100, 100)) # 增加分数表面
pygame.display.flip()
else:
# 每帧循环执行的代码
if tick > tick_max: # 每50次刷新变换一次
times=times+1 #增加计次
score_sur = score_font.render(
str(score), False, (255, 0, 0)) # 重新生成分数文字表面
a = random.randint(0, 5) # 随机0到5
pos = pos6[a] # 更新外部记录的圆的位置
tick = 0 # 重置计数器
else: # 不刷新变换的时候
tick = tick+1 # 增加计数器
# 绘制鼠标
sur.fill((0, 0, 0)) # !用黑色覆盖前一帧的画面,实现刷新
pygame.draw.circle(sur, clr, pos, 50) # !使用随机位置画地鼠
pygame.draw.circle(sur, (255, 0, 0), mpos, 10) # !!在鼠标位置画红色圆
# 刷新画面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # 增加分数表面
pygame.display.flip()
运行这个代码,用鼠标点击蓝圆,蓝圆跳动10次之后结束,然后显示击中的次数。你可以通过调整tick_max
的数字让圆跳动的更快或更慢,调整times_max=100
来让地鼠跳动100次后再结束。
现在我们的地鼠游戏已经有些模样了,但还都是蓝色红色的圆圈和圆点,下一篇我们来改变成为图片。
<未完待续>
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
每个人的智能新时代
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~
END