【py小游戏系列】躲避障碍物,儿时的回忆|Python 主题月

1,687 阅读2分钟

本文正在参加「Python主题月」,详情查看 活动链接

hello大家好,今天我又发现了个有趣的小玩意。我是专写有趣小玩意的老诗。

image.png

不知道你们有没有玩过这种游戏,操作比较单一,就是通过点击屏幕,然后小鸟躲避障碍物。之前的黑白屏幕手机上也有类似的直升机小游戏。

老规矩,先上效果图

1111.gif

老诗这个界面比较简单,当然你们也可以把主角和障碍物换成其他的。这里重要的是游戏的逻辑和算法过程。

定义物品

bird = vector(0, 0)
balls = []
score = 0

我里面的界面比较简单,也就是3个:鸟,障碍物,分数。

画出主角

def draw(alive):
    "Draw screen objects."
    clear()
    goto(bird.x, bird.y)

    if alive:
        dot(10, 'green')
    else:
        dot(10, 'red')

    for ball in balls:
        goto(ball.x, ball.y)
        dot(20, 'black')

因为是重复执行的,所以每一帧都需要用clear()把屏幕清空。然后再画出鸟和所有的障碍物。

游戏逻辑和输赢判断

def move():
    "Update object positions."
    global score
    bird.y -= 5

    for ball in balls:
        ball.x -= 3

    if randrange(10) == 0:
        y = randrange(-199, 199)
        ball = vector(199, y)
        balls.append(ball)

    while len(balls) > 0 and not inside(balls[0]):
        balls.pop(0)
        score += 1
        print(f'get {score} scores')

    if not inside(bird):
        draw(False)
        return

    for ball in balls:
        if abs(ball - bird) < 15:
            draw(False)
            return

    draw(True)

    # 在鸟的位置,绘制分数
    goto(bird.x, bird.y)
    write(score, font=('Arial', 30, 'normal'))

    ontimer(move, 50)

1这里面用了个定时器ontimer重复执行游戏逻辑。

2并且bird是正常情况下每一帧都-5,也就是位置下降。

3固定好x轴在199的位置,随机y轴产生新的障碍物。

4活着就能持续增加分数

5当小鸟触碰窗体边界或者障碍物的时候,就会输掉游戏。画面也停止更新。

游戏交互

def tap(x, y):
    "Move bird up in response to screen tap."
    up = vector(0, 30)
    bird.move(up) 

onscreenclick(tap)

这游戏唯一的游戏交互就是点击屏幕,并且点击之后小鸟会向上跑。

整体而言,游戏并不是太难,也很容易就可以学会。上面的思想还是说的比较清楚的。有需要拿完整源码的话,请移步到公众号:诗一样的代码。既然进来了,原创不易。小伙伴点个赞再走呗