检测手势

加速度计带来的真正有趣的副作用是手势检测。如果你以某种方式移动BBC micro:bit(作为某种手势),那么MicroPython能够检测到这一点。

MicroPython能够识别以下手势: 向上, 向下, 向左, 向右, 正面朝上, 正面朝下, 自由落体, 3g, 6g, 8g, 摇动。手势通常表示为字符串。这些名称大多数意思都很明显,当设备遇到这些级别的重力后,就会显示 3g, 6g8g ,就像一个宇航员进入太空一样。

获取当前手势需要用到 accelerometer.current_gesture 方法。其结果为以上名称其一。比如,只有正面朝上时设备才会露出“高兴”的表情:

from microbit import *

while True:
    gesture = accelerometer.current_gesture()
    if gesture == "face up":
        display.show(Image.HAPPY)
    else:
        display.show(Image.ANGRY)

同样,由于需要设备对周围环境的变化做出反应,我们用了 while 循环。在循环“作用域”内获取当前手势并读入 gestureif 条件检查 gesture 是否是 "正面朝上" (Python用 == 来检查是否相等, = 用来赋值,就如同我们把获取到的手势作为 gesture 的对象一样),如果手势与 "正面朝上" 相等,则该设备露出高兴的表情,否则,露出生气的表情。

魔术-8

魔术8球是首次发明于20世纪50年代的玩具,用来询问是或否(肯定或否定)的问题,摇动后便等待它揭晓答案。这个用程序很容易实现:

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))

该程序中的多数内容都是一个名为 answers 的列表,而实际的游戏是最后的 while 循环。

这个游戏的默认状态是显示字符 "8"。而这个程序是用来检测设备是否被摇动。 was_gesture 方法用它的参数(由于我们这里需要检测摇动,所以参数指的是字符 "shake" 。)来返回一个 True (真)或 False (假)的值。摇动该设备后, if 条件的代码块会被清除屏幕引用,等待一秒后(看起来像是设备在思考你的问题),屏幕会显示一个随机答案。

你为何不问问这是否是曾写过的最棒的程序呢?你可以通过什么方式来 “作弊” ,让答案总是显示“正”或者“负”(positive or negative)呢?(提示:使用按钮)