Accelerometer(加速计)

Accelerometer可以访问板子上的加速度模块。加速度模块提供了方便的函数检测动作。内置的动作包含:up,down,left,right,face_up,face_down,freefall,3g,6g,8g,shake

函数

microbit.accelerometer.get_x()

测量加速度X轴的值,根据不同的方向,得到的值为正或负的整数。

microbit.accelerometer.get_y()

测量加速度Y轴的值,根据不同的方向,得到的值为正或负的整数。

microbit.accelerometer.get_z()

测量加速度Z轴的值,根据不同的方向,得到的值为正或负的整数。

microbit.accelerometer.get_values()

测量加速度的值,返回一个包含X,Y,Z三轴值的元组。

microbit.accelerometer.current_gesture()

返回当前检测到的动作。

microbit.accelerometer.is_gesture(name)

如果指定的gesture是当前运行的,返回True,否则返回False

microbit.accelerometer.was_gesture(name)

如果指定的gesture是曾经运行,返回True,否则返回False

microbit.accelerometer.get_gesture(name)

返回历史状态,最新的列在最后

例子

抽签游戏,问一个问题返回一个答案。

from microbit import *
import random

answers=["It is certain",
  "It is decidedly so",
  "Without a doubt",
  "Yes, definitely",
  "You may rely on it",
  "As I see it, yes",
  "Most likely",
  "Outlook good",
  "Yes",
  "Signs point to yes",
  "Reply hazy try again",
  "Ask again later",
  "Better not tell you now",
  "Cannot predict now",
  "Concentrate and ask again",
  "Don't count on it",
  "My reply is no",
  "My sources say no",
  "Outlook not so good",
  "Very doubtful",
]

while True:
  display.show('8')
  if accelerometer.was_gesture('shake'):
    display.clear()
    sleep(1000)
    display.scroll(random.choice(answers))
  sleep(10)

简单回旋。移动开发板避过障碍物。

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)