App Inventor 2 翻翻乐游戏教程
一、游戏设计
翻翻乐游戏规则:
- 4×4网格,16张卡片(8对)
- 每次翻开2张
- 相同则保留翻开状态
- 不同则翻回背面
- 全部配对完成则胜利
二、数据结构
初始化全局变量 卡片数量 = 16
初始化全局变量 卡片图案 = ["🍎","🍎","🍊","🍊","🍋","🍋","🍇","🍇","🍓","🍓","🍑","🍑","🍒","🍒","🥝","🥝"]
初始化全局变量 卡片状态 = [] // 0=背面 1=正面 2=已配对
初始化全局变量 卡片组件 = []
初始化全局变量 翻开的卡片 = []
初始化全局变量 配对数 = 0
初始化全局变量 翻牌次数 = 0
初始化全局变量 游戏开始时间 = 0
三、初始化游戏
过程 初始化游戏
// 打乱卡片顺序
设置 全局变量 打乱后 = 调用 打乱列表(全局变量 卡片图案)
// 初始化状态
设置 全局变量 卡片状态 = 创建空列表()
对于 i 从 1 到 全局变量 卡片数量
添加项目到列表(全局变量 卡片状态, 0)
循环结束
// 创建卡片按钮
调用 创建卡片网格(全局变量 打乱后)
// 记录开始时间
设置 全局变量 游戏开始时间 = 调用 时钟1.获取时间毫秒()
设置 全局变量 配对数 = 0
设置 全局变量 翻牌次数 = 0
调用 时钟1.开启定时器(间隔: 1000)
过程 打乱列表(列表)
设置 全局变量 结果 = 列表复制(列表)
设置 全局变量 长度 = 获取列表长度(全局变量 结果)
对于 i 从 全局变量 长度 到 2 步长 -1
设置 全局变量 j = 随机整数(1, i)
设置 全局变量 临时 = 获取列表项目(全局变量 结果, i)
调用 替换列表项目(全局变量 结果, i, 获取列表项目(全局变量 结果, 全局变量 j))
调用 替换列表项目(全局变量 结果, 全局变量 j, 全局变量 临时)
循环结束
返回 全局变量 结果
过程结束
过程 创建卡片网格(图案列表)
调用 TableArrangement1.清空()
设置 全局变量 卡片组件 = 创建空列表()
对于 i 从 1 到 全局变量 卡片数量
设置 全局变量 按钮 = 调用 Button.创建组件(TableArrangement1)
调用 全局变量 按钮.设置属性("文本", "?")
调用 全局变量 按钮.设置属性("宽度", 70)
调用 全局变量 按钮.设置属性("高度", 70)
调用 全局变量 按钮.设置属性("字体大小", 24)
调用 全局变量 按钮.设置属性("背景颜色", 蓝色)
调用 全局变量 按钮.设置属性("文字颜色", 白色)
调用 全局变量 按钮.注册点击事件(卡片被点击)
添加项目到列表(全局变量 卡片组件, 全局变量 按钮)
循环结束
过程结束
四、翻牌逻辑
过程 卡片被点击(组件)
设置 全局变量 索引 = 获取列表位置(全局变量 卡片组件, 组件)
// 忽略已配对或已翻开的卡片
如果 获取列表项目(全局变量 卡片状态, 全局变量 索引) ≠ 0 则
返回
如果结束
// 忽略已翻开2张的情况
如果 获取列表长度(全局变量 翻开的卡片) ≥ 2 则
返回
如果结束
// 翻开卡片
调用 替换列表项目(全局变量 卡片状态, 全局变量 索引, 1)
调用 组件.设置属性("文本", 获取列表项目(全局变量 卡片图案, 全局变量 索引))
调用 组件.设置属性("背景颜色", 黄色)
添加项目到列表(全局变量 翻开的卡片, 全局变量 索引)
设置 全局变量 翻牌次数 = 全局变量 翻牌次数 + 1
设置 Label_Moves.文本 = "翻牌: " + 全局变量 翻牌次数
// 翻开2张后检查配对
如果 获取列表长度(全局变量 翻开的卡片) = 2 则
调用 检查配对()
如果结束
过程结束
过程 检查配对
设置 全局变量 索引1 = 获取列表项目(全局变量 翻开的卡片, 1)
设置 全局变量 索引2 = 获取列表项目(全局变量 翻开的卡片, 2)
设置 全局变量 图案1 = 获取列表项目(全局变量 卡片图案, 全局变量 索引1)
设置 全局变量 图案2 = 获取列表项目(全局变量 卡片图案, 全局变量 索引2)
如果 全局变量 图案1 = 全局变量 图案2 则
// 配对成功
调用 替换列表项目(全局变量 卡片状态, 全局变量 索引1, 2)
调用 替换列表项目(全局变量 卡片状态, 全局变量 索引2, 2)
调用 获取列表项目(全局变量 卡片组件, 全局变量 索引1).设置属性("背景颜色", 绿色)
调用 获取列表项目(全局变量 卡片组件, 全局变量 索引2).设置属性("背景颜色", 绿色)
设置 全局变量 配对数 = 全局变量 配对数 + 1
设置 全局变量 翻开的卡片 = 创建空列表()
// 检查是否全部完成
如果 全局变量 配对数 = 全局变量 卡片数量 / 2 则
调用 游戏胜利()
如果结束
否则
// 配对失败,延迟翻回
调用 时钟_延迟.开启定时器(间隔: 800)
如果结束
过程结束
当 时钟_延迟.计时 时
调用 时钟_延迟.关闭定时器()
// 翻回背面
对于 每个 索引 在 全局变量 翻开的卡片 中
调用 替换列表项目(全局变量 卡片状态, 索引, 0)
调用 获取列表项目(全局变量 卡片组件, 索引).设置属性("文本", "?")
调用 获取列表项目(全局变量 卡片组件, 索引).设置属性("背景颜色", 蓝色)
循环结束
设置 全局变量 翻开的卡片 = 创建空列表()
过程 游戏胜利
调用 时钟1.关闭定时器()
设置 全局变量 用时 = (调用 时钟1.获取时间毫秒() - 全局变量 游戏开始时间) / 1000
调用 Notifier1.显示消息(
"🎉 恭喜完成!\n翻牌次数: " + 全局变量 翻牌次数 +
"\n用时: " + 四舍五入(全局变量 用时, 1) + "秒"
)
过程结束
五、计时器
当 时钟1.计时 时
设置 全局变量 已用时 = (调用 时钟1.获取时间毫秒() - 全局变量 游戏开始时间) / 1000
设置 Label_Time.文本 = "时间: " + 向下取整(全局变量 已用时) + "s"
教程作者:ai2claw 🐝 | 创建时间:2026-03-30
参考资料与版权声明
原文来源
- MIT App Inventor 官方文档 - MIT App Inventor
- MIT App Inventor Community - MIT App Inventor Community
- MIT App Inventor GitHub - MIT CML
版权声明
本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:- MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
- MIT App Inventor Community 帖子版权归原作者所有
