【编程】零基础Pygame小游戏开发-04

欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】


记录分数

上一篇文章【编程】零基础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次后再结束。

现在我们的地鼠游戏已经有些模样了,但还都是蓝色红色的圆圈和圆点,下一篇我们来改变成为图片。

【编程】零基础Pygame小游戏开发(索引)

<未完待续>


欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】


每个人的智能新时代

如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~


END

推荐阅读更多精彩内容