一二三木头人
先了解你将做出什么
游戏介绍
「一二三木头人」大家都玩过:一个人喊口令,其他人在音乐停下的瞬间必须定住不动,谁动了谁出局。
麻烦的是——得有个人当裁判,而且裁判还老看不过来。
这一篇我们让手机来当裁判:把手机拿在手里或塞进口袋,音乐停了它会喊”一二三木头人”, 然后偷偷用加速度传感器1盯着你。你只要动一下,它立刻抓包。

这是一个离开椅子才能玩的App。屏幕上的游戏做多了,试试做一个让人跑起来的。
连接你的应用
通过 WiFi 连接设备
使用 AI 伴侣连接后,可以在手机或平板上实时查看和测试应用。

视频演示:
安装 AI 伴侣
使用手机系统扫码器或浏览器扫描二维码,下载并安装 AI 伴侣。只需安装一次,以后可以直接使用。

打开应用的连接二维码
在 App Inventor 2 中依次点击「连接」和「AI 伴侣」。

连接手机
连接二维码会显示在电脑屏幕上。

在手机 AI 伴侣中点击蓝色的「scan QR code」按钮扫描二维码;也可以输入代码,再点击橙色的「connect with code」按钮。

使用模拟器连接
模拟器由 aiStarter 自动启动,不需要手机,但速度较慢、环境配置较复杂且 Android 版本较旧,一般不推荐作为首选方式。
使用 USB 连接
aiStarter 可以通过 USB 调试连接手机,并自动启动手机上的 AI 伴侣。它的使用效果和扫描二维码连接基本相同。
查看完整连接教程
下面的视频完整演示 AI 伴侣、模拟器和 USB 三种连接方式。不同方式的详细比较可以查看连接方式说明。
仍然无法连接?
可以前往中文社区查找解决方案或发帖提问。
一二三木头人教程(难度系数:★)
找素材并上传
只需要一段音乐,用来在”可以动”的阶段播放。
挑一段节奏欢快的,30 秒以上就够(会循环播放)。格式用 mp3,别用 wav—— wav 动不动就好几兆,装到手机上又慢又占地方。
上传之后,在设计器里选中 音频播放器_音乐,把 源文件 设成你上传的这个文件,
并且勾上 循环播放,这样音乐才不会放一遍就停。
游戏基本逻辑设计
先想清楚再写代码。这个游戏其实只有三种状态:
- 走 —— 音乐响着,随便动。持续一段随机的时间(2~6 秒),让人猜不到什么时候停。
- 停 —— 音乐停了,手机喊”一二三木头人”,接下来 3 秒是检测期,动了就出局。
- 出局 —— 游戏结束,等着重新开始。
“走”和”停”来回切换,靠一个计时器就够了。而”你动没动”,交给加速度传感器1。
如果每次都是固定 5 秒,玩几轮之后大家就会数秒了——到第 5 秒提前站住,游戏立刻没意思。
随机是很多游戏”好玩”的来源。凡是玩家能背出规律的地方,都值得想想要不要加点随机。
认识加速度传感器1
加速度传感器1是手机里的一个小零件,它能感觉到手机在怎么动。
它给我们两样东西,这个游戏只用第二样:
| 用法 | 说明 |
|---|---|
X分量 Y分量 Z分量 |
三个方向上的加速度数值,做体感控制(比如倾斜转向)时用 |
被晃动 事件 |
手机被明显晃动时自动触发,这正是我们要的 |
还有一个关键属性叫 敏感度,可以设成 1(迟钝)、2(中等)、3(灵敏)。
先用默认的 2,等玩过几轮再按实际情况调。
先写两个过程:开始走、开始停
这两件事在游戏里要反复做,所以先抽成过程,后面调用起来又短又清楚。
global 状态 = "准备"
procedure 开始走() {
状态 = "走"
标签_状态.Text = "可以动!"
音频播放器_音乐.Start()
加速度传感器1.Enabled = false
计时器_节奏.TimerInterval = random(2000, 6000)
}
procedure 开始停() {
状态 = "停"
标签_状态.Text = "木头人!别动!"
音频播放器_音乐.Stop()
文本朗读器1.Speak("一二三,木头人")
加速度传感器1.Enabled = true
计时器_节奏.TimerInterval = 3000
}
这里有两个很值得学的写法:
第一,传感器要用的时候才打开。「走」的阶段 加速度传感器1.启用 = 假,
到「停」才设成真。不然你正跑着它就把你判出局了。用完就关也省电。
第二,计时器的间隔是可以随时改的。「走」阶段设成 random(2000, 6000)
(2~6 秒的随机毫秒数),「停」阶段固定 3 秒。同一个计时器,靠改间隔就实现了两种节奏,
比放两个计时器干净得多。
开始游戏
when 按钮_开始.Click() {
标签_提示.Text = "音乐停了就不许动"
计时器_节奏.TimerEnabled = true
开始走()
}
状态 这个变量是整个游戏的大脑,其它代码全靠问它”现在是哪个阶段”来决定做什么。
让”走”和”停”轮流来
计时器每次响,就切换到另一个阶段:
when 计时器_节奏.Timer() {
if 状态 = "走" {
开始停()
} else {
开始走()
}
}
就这么六行。因为麻烦事都塞进那两个过程里了——这就是先写过程的好处。
抓住动了的人
when 加速度传感器1.Shaking() {
if 状态 = "停" {
状态 = "出局"
计时器_节奏.TimerEnabled = false
加速度传感器1.Enabled = false
音频播放器_音乐.Stop()
标签_状态.Text = "你动了!"
标签_提示.Text = "点「开始游戏」再来一局"
文本朗读器1.Speak("你动了,出局")
}
}
注意最外面那个 if 状态 = "停"——这一层判断不能省。
虽然我们在「走」阶段关掉了传感器,但传感器关闭前可能还有一次事件在路上, 多这一层判断,游戏就不会莫名其妙地判你出局。
因为不关的话,计时器还在滴答,过几秒就会把状态切回”走”,音乐又响起来了—— 明明已经出局了,游戏却自己接着玩下去。
游戏结束时,把所有还在跑的东西都停掉(计时器、音乐、传感器), 这是做游戏时特别容易漏、又特别容易被玩家发现的一类bug。
开始测试
连上 AI伴侣,把手机拿在手里,找个空地真玩几局:
- 点开始,音乐响了没有?
- 音乐停的时候,手机是不是喊了”一二三木头人”?
- 停的阶段轻轻晃一下手机,是不是立刻判你出局?
- 走的阶段使劲晃,会不会被误判?(不该被判,因为传感器是关的)
- 出局之后,音乐和计时器是不是全都停下来了?
把 加速度传感器1 的 敏感度 改一改:
- 一动就出局、站着都会被判 → 改成 1(迟钝)
- 蹦跶半天都抓不到 → 改成 3(灵敏)
如果想更细致,可以不用 被晃动 事件,改用 加速度变化 事件自己算:
三个方向的加速度合起来超过某个值就算动了。这样阈值完全由你定。
剩余工作
基础版已经能玩了,往下还能做很多:
- 多人计分。加个列表存所有人的名字,谁出局记一笔,看谁坚持得最久。
- 难度递增。每过一轮,把”停”的检测期从 3 秒慢慢加长,越到后面越难熬。
- 手机喊得更花哨。现在固定喊一句,可以准备一个列表随机喊: “一二三木头人”、”不许动”、”谁动谁输”……
- 加个倒计时。停的阶段在屏幕上显示还剩几秒,紧张感立刻上来。
- 震动提醒。出局时用
音频播放器.振动震一下,装在口袋里也知道自己输了。
找几个小伙伴一起玩,比自己一个人测有意思多了ヾ(◍°∇°◍)ノ゙
卡在哪一步?直接查操作
不用退出当前教程。速查会在新页面打开,查完回来继续刚才的进度。



