跳到教程内容
教程首页
App Inventor 2 教程 一二三木头人
准备开始
动手创造 · PROJECT LAB

一二三木头人

准备探索你的新作品
0%
项目难度每一步,都离作品更近

先了解你将做出什么

游戏介绍

「一二三木头人」大家都玩过:一个人喊口令,其他人在音乐停下的瞬间必须定住不动,谁动了谁出局。

麻烦的是——得有个人当裁判,而且裁判还老看不过来。

这一篇我们让手机来当裁判:把手机拿在手里或塞进口袋,音乐停了它会喊”一二三木头人”, 然后偷偷用加速度传感器1盯着你。你只要动一下,它立刻抓包。

教程主图

界面示意图

这是一个离开椅子才能玩的App。屏幕上的游戏做多了,试试做一个让人跑起来的。

连接你的应用

通过 WiFi 连接设备

使用 AI 伴侣连接后,可以在手机或平板上实时查看和测试应用。

AI 伴侣连接示意图

视频演示:

App Inventor 2 连接 AI 伴侣

安装 AI 伴侣

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

AI 伴侣下载二维码

打开应用的连接二维码

在 App Inventor 2 中依次点击「连接」和「AI 伴侣」。

打开 AI 伴侣连接

连接手机

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

应用连接二维码

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

AI 伴侣连接界面

使用模拟器连接

模拟器由 aiStarter 自动启动,不需要手机,但速度较慢、环境配置较复杂且 Android 版本较旧,一般不推荐作为首选方式。

App Inventor 2 连接模拟器

使用 USB 连接

aiStarter 可以通过 USB 调试连接手机,并自动启动手机上的 AI 伴侣。它的使用效果和扫描二维码连接基本相同。

App Inventor 2 使用 USB 连接

查看完整连接教程

下面的视频完整演示 AI 伴侣、模拟器和 USB 三种连接方式。不同方式的详细比较可以查看连接方式说明

App Inventor 2 完整连接教程

仍然无法连接?

可以前往中文社区查找解决方案或发帖提问。

一二三木头人教程(难度系数:★)

找素材并上传

只需要一段音乐,用来在”可以动”的阶段播放。

挑一段节奏欢快的,30 秒以上就够(会循环播放)。格式用 mp3,别用 wav—— wav 动不动就好几兆,装到手机上又慢又占地方。

上传之后,在设计器里选中 音频播放器_音乐,把 源文件 设成你上传的这个文件, 并且勾上 循环播放,这样音乐才不会放一遍就停。

游戏基本逻辑设计

先想清楚再写代码。这个游戏其实只有三种状态:

  1. —— 音乐响着,随便动。持续一段随机的时间(2~6 秒),让人猜不到什么时候停。
  2. —— 音乐停了,手机喊”一二三木头人”,接下来 3 秒是检测期,动了就出局。
  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. 点开始,音乐响了没有?
  2. 音乐停的时候,手机是不是喊了”一二三木头人”?
  3. 停的阶段轻轻晃一下手机,是不是立刻判你出局?
  4. 走的阶段使劲晃,会不会被误判?(不该被判,因为传感器是关的)
  5. 出局之后,音乐和计时器是不是全都停下来了?

加速度传感器1敏感度 改一改:

  • 一动就出局、站着都会被判 → 改成 1(迟钝)
  • 蹦跶半天都抓不到 → 改成 3(灵敏)

如果想更细致,可以不用 被晃动 事件,改用 加速度变化 事件自己算: 三个方向的加速度合起来超过某个值就算动了。这样阈值完全由你定。

剩余工作

基础版已经能玩了,往下还能做很多:

  • 多人计分。加个列表存所有人的名字,谁出局记一笔,看谁坚持得最久。
  • 难度递增。每过一轮,把”停”的检测期从 3 秒慢慢加长,越到后面越难熬。
  • 手机喊得更花哨。现在固定喊一句,可以准备一个列表随机喊: “一二三木头人”、”不许动”、”谁动谁输”……
  • 加个倒计时。停的阶段在屏幕上显示还剩几秒,紧张感立刻上来。
  • 震动提醒。出局时用 音频播放器.振动 震一下,装在口袋里也知道自己输了。

找几个小伙伴一起玩,比自己一个人测有意思多了ヾ(◍°∇°◍)ノ゙