编程零基础Pygame小游戏开发-03:实现最简单的打地鼠游戏逻辑

Posted 特别篇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程零基础Pygame小游戏开发-03:实现最简单的打地鼠游戏逻辑相关的知识,希望对你有一定的参考价值。

打地鼠游戏

我们可以把经典的打地鼠游戏简化概括为:


  • 地图和道具:随机位置出现地鼠图形

  • 交互角色:控制锤子图形,点击地鼠图形使其消失

  • 积分输赢:限定时间内击中地鼠图形的次数


核心玩法简化成一句话就是:点击随机出现图形。


绘制地鼠

我们用一个蓝色的圆形代表地鼠。那怎么在窗口中绘制一个圆形呢?


可以百度【pygame 画圆圈】类似的关键字,可以查到要使用pygame.draw.circle语句,它的具体语法可以从官方说明文档中找到,英文版详细说明点。


我们查到它的语法是:


pygame.draw.circle()

circle(surface, color, center, radius) -> Rect


这表示draw.circle()需要四个参数,分别是surface表面,color颜色,center中心点,radius半径。


我们继续看surface参数的说明:


surface (Surface) -- surface to draw on


听上去像是画布,——先要有个画布才能在上面画圆。

点击Surface链接,找到更进一步说明:


Surface((width, height), flags=0, depth=0, masks=None) -> Surface


结尾的->Surface表示Surface((width....)这句话可以生成一个Surface表面,我们可以用下面的语句捕捉到这个生成的表面:


sur=pygame.Surface((600, 400)


这样,sur就是我们生成的表面了。


颜色和位置

再返回来看color参数:


color (Color or int or tuple(int, int, int, [int])) 

-- color to draw with, 

the alpha value is optional if using a tuple (RGB[A])


很明显它是表示画什么颜色的圆。tuple(int, int, int, [int])表示这里需要三个整数int一起表示颜色,RGB是指red红,green绿,blue蓝,alpha透明度:


clr=(0,0,255) #蓝色

对于center中心位置我们也可以用同样的方法得到,这里的Vector2表示二元向量,及横向x和竖向y的位置:


pos=pygame.vector2(300,200) #窗口中央


绘制圆形

参数都具备了,那么就可以开始画圆了。运行下面的代码:


import pygame

import sys


pygame.init()  # 初始化

window = pygame.display.set_mode([600, 400])  # 设定窗口


sur = pygame.Surface([600, 400])  # 绘制背景容器

clr = (0, 0, 255)

pos = (300,200)

rad = 100


while 1:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            sys.exit()


    # 每帧循环执行的代码

    pygame.draw.circle(sur, clr, pos, 100)  # 绘制圆


    # 刷新画面

    window.blit(sur, (0, 0))

    pygame.display.flip()

注意这里最底部刷新画面的两行,其中window.blit(sur, (0, 0))表示把我们绘制好的表面sur刷新到window窗口中;pygame.display.flip()表示进行窗口刷新。


随机出现

随机出现就是随机位置,我们必须确保每一次花圆的pos位置都不同,而且应该是固定的几个地鼠洞位置。——别忘了我们要做打地鼠游戏。


假设有6个地鼠位置pos分别是[200,200],[300,200],[400,200],[200,300],[300,300],[400,300],那么如何随机取到6个中一个呢?也就是如何随机取到1~6其中的一个数字即可。


我们可以百度【python 随机数】查到需要使用random模块,这是python自带的模块,不需要再重新pip install

如果搜索【python random document】可以查找到官方的语法说明,如下:


random.randint(a, b)

Return a random integer N such that a <= N <= b. 

Alias for randrange(a, b+1).


这是说可以随机生成ab之间的一个数字。也可以从中文的菜鸟教程网

学习到这个知识。


新建一个test.py文件,我们进行测试:


import random

a = random.randint(0, 5)

print(a)


每次运行都能生成不同的数字。


继续测试:


import random

a = random.randint(0, 6)

pos6=[[200,200],[300,200],[400,200],[200,300],[300,300],[400,300]]

print(pos6[a])


这里的pos6[a]表示pos6的六个位置中的第a个。运行这个代码就会每次生成不同的位置。


测试成功之后我们把它拷贝到刚才的画圆代码中,得到:


import pygame

import sys

import random


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 = 100


while 1:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            sys.exit()


    # 每帧循环执行的代码

    sur.fill((0, 0, 0))  # !!用黑色覆盖前一帧的画面,实现刷新

    a = random.randint(0, 5)  # !!随机0到5

    pygame.draw.circle(sur, clr, pos6[a], 100)  # !!使用随机位置


    # 刷新画面

    window.blit(sur, (0, 0))

    pygame.display.flip()


注意新增了sur.fill...一行,这是用黑色(0,0,0)来清理掉上一帧的内容,避免出现多个圆。


隔n帧刷新

上面的代码运行之后会看到蓝色的圆四处乱跳,太快了,我们希望改变位置之后能停一下,等我们锤它。


我们需要画面的圆每隔n帧再随机变换一次,而不是现在的每帧都随机变。思路是这样的:我们设定一个计数器,开始是0,每帧都给它增加1,就是0,1,2,3,4...直到它增到到超过50,这时候我们就改变圆的位置并同时把计数器重置为0。


代码如下:


import pygame

import sys

import random


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 = 100

tick=0 #!!计数器


while 1:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            sys.exit()


    # 每帧循环执行的代码

    if tick>50: #每50次刷新变换一次

        sur.fill((0, 0, 0))  # 用黑色覆盖前一帧的画面,实现刷新

        a = random.randint(0, 5)  # 随机0到5

        pygame.draw.circle(sur, clr, pos6[a], 100)  # 使用随机位置

        tick=0

    else: #!!不刷新变换的时候

        tick=tick+1 #!!增加计数器


    # 刷新画面

    window.blit(sur, (0, 0))

    pygame.display.flip()


增加交互点击

当用户点击画面的时候,我们要知道它点击了哪里,是否点击到了我们画的圆上面。


百度搜索【pygame 点击】可以找到相关资源,也可以直接在官方说明文档中找到。


思路是我们添加对event.type事件类型的实时监测,一旦发现点击事件就获取位置坐标。代码如下:


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 = 100

tick = 0  # !!计数器

pos = pos6[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()  # !!获取鼠标位置

            print(mpos)


    # 每帧循环执行的代码

    if tick > 50:  # 每50次刷新变换一次

        sur.fill((0, 0, 0))  # 用黑色覆盖前一帧的画面,实现刷新

        a = random.randint(0, 5)  # 随机0到5

        pos = pos6[a]  # !!更新外部记录的圆的位置

        pygame.draw.circle(sur, clr, pos, 100)  # !!使用随机位置

        tick = 0  # 重置计数器

    else:  # !!不刷新变换的时候

        tick = tick+1  # !!增加计数器


    # 刷新画面

    window.blit(sur, (0, 0))

    pygame.display.flip()


运行这个代码,任意点击屏幕上的时候就会打印出档期鼠标点击的位置。


距离测量

知道当前圆的位置pos,也知道当前点击的位置mpos,这样我们就可以计算出两点之间的距离,距离大于圆半径的就是没有点到地鼠,距离小于半径的就是点到地鼠了。


百度搜索【pygame 两点距离】可以搜到一些计算距离的方法,我们这里使用pygame官方提供的方法,测试下面代码:


import pygame

a=pygame.math.Vector2.length(pygame.math.Vector2(3,4))

print(a)


它会输出5(勾三股四玄五)。这里的(3,4)posmpos相减得到的差。

把这个思路带入原来的代码,得到:


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]  # 外面记录圆的位置


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 = 51  # !!立即变换位置


    # 每帧循环执行的代码

    if tick > 50:  # 每50次刷新变换一次

        sur.fill((0, 0, 0))  # 用黑色覆盖前一帧的画面,实现刷新

        a = random.randint(0, 5)  # 随机0到5

        pos = pos6[a]  # 更新外部记录的圆的位置

        pygame.draw.circle(sur, clr, pos, 100)  # 使用随机位置

        tick = 0  # 重置计数器

    else:  # 不刷新变换的时候

        tick = tick+1  # 增加计数器


    # 刷新画面

    window.blit(sur, (0, 0))

    pygame.display.flip()


在这里我们设定如果距离长度len小于圆半径rad,那么就立即设置tick=51使它大于50,立即进行随机位置变换。


截止到这里运行上面的代码,可以实现随机出现地鼠(圆)并能够点击使它消失,这也实现了游戏的最基本逻辑功能。后续我们将进一步编写更多内容,让它更完善一些。


“未完待续”

以上是关于编程零基础Pygame小游戏开发-03:实现最简单的打地鼠游戏逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏

Android游戏编程之从零开始pdf

Android游戏编程之从零开始pdf

游戏开发怎么样学能入门零基础学游戏编程

10个python入门小游戏,零基础打通关,就能掌握编程基础

使用pygame实现一个简单的五子棋游戏