Python制作《精灵进化》

通过项目《精灵进化》的制作,熟悉游戏过程中角色的移动和变化及游戏结束效□□□□□□□□果□□□。

on_key_down()运行机制

目标

按一次键,控制角色一直移□□□动
精灵进化

总结

◆ 按一次按键,on_key_down()函数执行一次□□□□。它的下级代码全部执行完□□□□□□,才调用draw()函数,所以bobo不能连续移动□□□□□。
◆ 游戏开始,update()一直重复执行□□□□。每次执行完都会调□□□□用draw() 函数绘制,所以 bobo可以连续移动□□□。

按键控制角色移□□□动

目标

on_key_down() 和 update() 配合使用,实现按一次方向键□□□,波波朝对应方向一直移动的效果□□□。

步骤

1. 使用全局变量□□□□□□□□,在函数间传递方向信□□□□□□□□息
2. 使用on_key_down(),判断按键方□□□□□向
3. 使用update(),让角色根据按键方向连续移□□□□□动

py

direction = ' '
def on_key_down(key):
    global direction
    if key == keys.RIGHT:
        direction = '右'
        ......
def update():
    global direction
    if direction == '右'
        bobo.x += 4
        ......

角色移动的边界限□□□□制

目标

角色移动时,不超出窗口边□□□缘

py

def update():
    global direction
    if direction == '上' and bobo.top > 0:
        bobo.y -= 4
    if direction == '下' and bobo.bottom > HEIGHT:
        bobo.y += 4
    if direction == '左' and bobo.left > 0:
        bobo.x -= 4
    if direction == '右' and bobo.right > WIDTH:
        bobo.x += 4

能量球随机出□□□□□□□□现

目标

让能量球出现在随机位置□□□□□□□□上

思路

1. 先确定能量球坐□□□□□标(角色中心点)的取值范围
2. 再使用random.randint()生成随机坐□□□□□□□标

创建角色时,能量球随机出□□□□□□□□现

py

ball = Actor('能量球')
ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)

角色碰撞时,能量球更新在新的随机位置□□□□□□□□上

py

def update():
    ......
    if bobo.colliderect(ball):
        ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
        ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)

波波的进化

统计得分:
如果波波碰到能量□□□□□□□□球ball,就让分数增□□□□□□加1,并让 分数显示在窗口左上角□□□□□□。

统计分数

py

if bobo.colliderect(ball):
    ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
    ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)
    score += 1

显示分数

py

def draw():
    global score
    screen.blit('奇妙岛', (0,0))
    bobo.draw()
    ball.draw()
    screen.draw.text(str(score), (10,10))

波波的造型

根据分数score,让波波切换成不同的造□□□□□型:

py

def draw():
    global score
    screen.blit('奇妙岛', (0,0))
    bobo.draw()
    ball.draw()
    screen.draw.text(str(score), (10,10))

def update():
    global direction, score
    ...
    if score >= 5:
        bobo.image = '波波2'
    if score >= 10:
        bobo.image = '波波3'

只有当update()函数全部执行完以□□□□□后, 程序才会调用一□□□□次draw()函数。虽然这里切换了两次造型□□□□□□□□,但是窗口中只会显□□□□□□□□示update()全部执行完的结果□□□□□□□□,而不会体现出中间切换的过程□□□□。

定时更新能量□□□□□球

每隔一段时间□□□,能量球自动改变一次位置□□□□□□□。

定时调用函□□□□□□□□数

py

clock.schedule_interval(函数, 时间间隔)

定时更新能量□□□□□球

py

#定义能量球更新位置的函□□□□□□□数
def change():
    ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
    ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)

#每隔4秒调用一次改变位置的函□□□□□□□数
clock.schedule_interval(change, 4)

随机出现两种能量□□□□□□球

增加爆炸能量球□□□□□□,每次更新能量球时□□□□,在两种球中随机选择□□□□□□。
利用随机数选择造□□□□□□□型

py

def change():
    if random.randint(1, 2) == 1:
        ball.image = '爆炸能量球'
    else:
        ball.image = '能量球'

让爆炸能量球出现的可能性小一□□□□□□□些

py

def change():
    if random.randint(1, 10) == 1:
        ball.image = '爆炸能量球'
    else:
        ball.image = '能量球'

游戏结束效□□□□□□□□果

判断过程

1. 判断游戏是否结□□□□□□□束
2. 根据游戏状态□□□,绘制不同内□□□□□□□容

py

def draw():
    global score, state
    if state == 1:
        screen.blit('奇妙岛', (0,0))
        bobo.draw()
        ball.draw()
        screen.draw.test(str(score), (10,10))
    else:
        screen.blit('游戏失败', (0,0))
        screen.draw.test(str(score), (WIDTH//2,10))

score = 0
state = 1 #代表游戏运行状□□□□□□态 1:运行 0:停止
def update():
    global direction, score, state
    if bobo.colliderect(ball):
        if ball.image == '能量球':
            score += 1
            change()
        else:
            clock.unschedule(change)
            state = 0

总结

◆ 全局变量可以在函数之间传递信息□□□□□。
◆ 在函数外面定义一个变量□□□□□□□□,要想在函数中修改这个变量□□□,需要先用global语句,声明它是全局变量□□□□□□。

那年 • 这天
写于2023-07-18日
没有伞的孩子□□□□□□,必须学会努力奔跑□□□。

赞助 点赞 0 unread messages

暂无评论,抢沙发?

发表回复

您的电子邮箱地址不会被公开□□□。 必填项已用*标注