制作坊Python教程之躲避障碍物游戏 专区

Python教程之躲避障碍物游戏

binglingdang2018-12-12 4075人围观
简介利用micro:bit的加速度计功能,实现左右倾斜移动物体躲避上方掉下来的障碍物。

我们正在创建一个躲避障碍物游戏,并在BBC micro:bit上运行。

游戏中落下的障碍物将基于以下五种形状:

image.png

游戏规则如下:


  • 将micro:bit板向左倾斜:将当前点移动到左侧

  • 将micro:bit板向右倾斜:将当前点移动到右侧

  • 保持目前micro:bit状态不动:保持当前点的位置

  • 如果点撞到了障碍物,则游戏结束

小提示,坚持到后期,障碍物落下的速度会越来越快哦~!

视频演示



image.png

        此次编程用到了random随机数,通过在在一横的5个点中随机生成一个孔,让移动的点通过这个孔来达到躲避障碍物的目的。当孔的排(Y)和点的排(Y)相同时,如果孔的(X)列不等于点的列(X),则表示点未从孔中通过,而是撞到了障碍物,游戏结束。


python代码

import microbit as m
import random
p = m.display.show
min_x = -1024
max_x = 1024
range_x = max_x - min_x
wall_min_speed = 400
player_min_speed = 200
wall_max_speed = 100
player_max_speed = 50
speed_max = 12
while True:

    i = m.Image(00000:*5)
    s = i.set_pixel

    player_x = 2

    wall_y = -1
    hole = 0

    score = 0
    handled_this_wall = False

    wall_speed = wall_min_speed
    player_speed = player_min_speed

    wall_next = 0
    player_next = 0

    while True:
        t = m.running_time()
        player_update = t >= player_next
        wall_update = t >= wall_next
        if not (player_update or wall_update):
            next_event = min(wall_next, player_next)
            delta = next_event - t
            m.sleep(delta)
            continue

        if wall_update:
            # calculate new speeds
            speed = min(score, speed_max)
            wall_speed = wall_min_speed + int((wall_max_speed - wall_min_speed) * speed / speed_max)
            player_speed = player_min_speed + int((player_max_speed - player_min_speed) * speed / speed_max)

            wall_next = t + wall_speed
            if wall_y < 5:
                # erase old wall
                use_wall_y = max(wall_y, 0)
                for wall_x in range(5):
                    if wall_x != hole:
                        s(wall_x, use_wall_y, 0)

        wall_reached_player = (wall_y == 4)
        if player_update:
            player_next = t + player_speed
            # find new x coord
            x = m.accelerometer.get_x()
            x = min(max(min_x, x), max_x)
            # print("x accel", x)
            s(player_x, 4, 0) # turn off old pixel
            x = ((x - min_x) / range_x) * 5
            x = min(max(0, x), 4)
            x = int(x + 0.5)
            # print("have", position, "want", x)

            if not handled_this_wall:
                if player_x < x:
                    player_x += 1
                elif player_x > x:
                    player_x -= 1
            # print("new", position)
            # print()

        if wall_update:
            # update wall position
            wall_y += 1
            if wall_y == 7:
                wall_y = -1
                hole = random.randrange(5)
                handled_this_wall = False

            if wall_y < 5:
                # draw new wall
                use_wall_y = max(wall_y, 0)
                for wall_x in range(5):
                    if wall_x != hole:
                        s(wall_x, use_wall_y, 6)

        if wall_reached_player and not handled_this_wall:
            handled_this_wall = True
            if (player_x != hole):
                # collision! game over!
                break
            score += 1

        if player_update:
            s(player_x, 4, 9) # turn on new pixel

        p(i)

    p(i.SAD)
    m.sleep(1000)
    m.display.scroll("Score:" + str(score))

    while True:
        if (m.button_a.is_pressed() and m.button_a.is_pressed()):
            break
        m.sleep(100)

我最多能得13分,你呢?

image.png

7 +1

评论

尝试了无数遍得到的13分

#1 2018-12-14 09:39 0 回复

好了,已解决,14行那儿缺了俩引号

2019-08-21 14:420

我下载.hex程序后,屏幕只显示 line 14 syntax error invalid syntax之后就啥都没了,再按a或b都没反应

2019-08-21 10:080

是我缺了吗...

2019-08-24 16:360

14行的引号放哪儿呀

2020-04-10 16:530

这个需要在哪个环境下编辑上传啊大佬( ̄▽ ̄)

#2 2019-08-20 17:55 0 回复

在mu下面,我给你跳转网址

2019-08-20 20:171

在线编辑:https://python.microbit.org/v/1.1

2019-08-20 20:180

复制到里面编译和下载就可以了

2019-08-20 20:190

怎么下载?

2020-05-03 10:460