美文网首页爱编程爱编程、爱生活
【编程】零基础Pygame小游戏开发-04

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

作者: zhyuzh3d | 来源:发表于2019-11-14 23:04 被阅读0次

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


    记录分数

    上一篇文章【编程】零基础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

    相关文章

      网友评论

        本文标题:【编程】零基础Pygame小游戏开发-04

        本文链接:https://www.haomeiwen.com/subject/tmedictx.html