本系列第 8/8 课,建议 45–60 分钟(估算)。先完成上一课。
这课解决什么
毕业项目从输入词表取内容,算法不关心题材。六个非空词足够两种难度,词表不足时提示并沿用原词表。用自己的测试卡证明玩法、延时、重开、难度与保存共同工作。
先预测,再运行
换成六个英语单词,需要复制六套点击事件吗?
先记下自己的答案,运行起始工程与完成工程比较;答案见文末。
开始实战
以上一课完成工程为起点,先导入并运行,再另存为本课作业。
完成工程可以查看答案;独立作业请保留自己的修改。
新增或调整的组件
| 实例名 | 组件 | 本课配置 |
|---|---|---|
标签_标题 |
标签 | Width=Fill parent;FontSize=24;TextColor=#183153;Text=记忆翻牌 · 第 8课 |
微数据库1 |
微数据库 | Namespace=MemoryC08 |
文本输入框_题材 |
文本输入框 | Hint=至少六个词,用英文逗号分隔;Width=Fill parent;FontSize=16;Text=历史,数学,编程,科学,艺术,运动 |
标签_提示 |
标签 | Width=Fill parent;FontSize=16;TextColor=#183153;Text=修改词表后点新局;词可换,匹配算法不变 |
逐步搭建
- 加入题材输入,使用英文逗号 split,检查至少六项且没有空词。
- 合法词表用于下一局;非法时明确提示并沿用原词表,避免越界。
- 分别用四对、六对运行自己的题材,检查每词两张和完整匹配。
- 独立检查边界、连点、第三张、新局、胜利、最佳;导出源码并让另一位学习者导入。

图来自本课最终工程执行积木后的状态,为 HTML 近似预览;不是手机截图。
核心积木与数据流
下面是本课完成工程中的核心代码,包含所需全局变量和过程。可在块图中追踪数值,再回到工程对照完整事件;合并到已有工程时,同名事件合并处理。
global 牌 = []
global 翻面 = []
global 第一 = 0
global 第二 = 0
global 锁定 = false
global 已配对 = 0
global 步数 = 0
global 开始时刻 = 0
global 秒数 = 0
global 对数 = 4
global 宽 = 70
global 高 = 100
global 题材提示 = ""
global 词 = list("历史","数学","编程","科学","艺术","运动")
procedure 绘制() {
宽 = 画布1.Width / 4
高 = 画布1.Height / ceil(length(牌) / 4)
画布1.Clear()
for i = 1 to length(牌) {
var 列 = (i - 1) % 4
var 行 = floor((i - 1) / 4)
画布1.PaintColor = choose(翻面[i] = 2, -14575216, choose(翻面[i] = 1,-24576,-14268949))
画布1.DrawShape(list(list(列 * 宽 + 2,行 * 高 + 2),list((列 + 1) * 宽 - 2,行 * 高 + 2),list((列 + 1) * 宽 - 2,(行 + 1) * 高 - 2),list(列 * 宽 + 2,(行 + 1) * 高 - 2)),true)
画布1.PaintColor = -1
画布1.DrawText(choose(翻面[i] = 0,"?",牌[i]),(列 + 0.5) * 宽,(行 + 0.5) * 高)
}
}
procedure 新局() {
题材提示 = ""
计时器_翻回.TimerEnabled = false
对数 = choose(下拉框_难度.Selection = "6 对",6,4)
var 候选 = split(文本输入框_题材.Text,",")
var 合法 = length(候选) >= 6
foreach 项 in 候选 { if trim(项) = "" { 合法 = false } }
if 合法 { 词 = 候选 }
else { 题材提示 = "至少六个非空词,使用英文逗号;本局沿用原词表" }
牌 = []
翻面 = []
第一 = 0
第二 = 0
已配对 = 0
锁定 = false
步数 = 0
秒数 = 0
for i = 1 to 对数 { listadd(牌,词[i]) listadd(牌,词[i]) listadd(翻面,0) listadd(翻面,0) }
for i = length(牌) to 2 step -1 {
var j = random(1,i)
var 临时 = 牌[i]
牌[i] = 牌[j]
牌[j] = 临时
}
开始时刻 = 计时器_计时.SystemTime()
计时器_计时.TimerEnabled = true
标签_成绩.Text = "0 步 / 0 秒"
标签_最佳.Text = 微数据库1.GetValue(join("最佳",对数),"尚无最佳成绩")
标签_状态.Text = choose(题材提示 = "","新局:点击卡片",题材提示)
绘制()
}
中途检查与排错
本课以下控制与数据流已执行最终归档中的真实积木检查。请在伴侣或安装的 APK 中按相同场景操作,记录实际结果;自动检查通过不代表手机已实测。
- 开局8张卡片。
- 边界不越界。
- 洗牌/初始化保留每种两张。
- 重复点同牌不计分。
- 不匹配延时锁、禁止第三张。
- 新局停止旧延时。
- 完整配对、一次胜利。
- 六对难度与真实耗时。
- 四对最佳成绩重启恢复。
- 题材可替换,算法保持。
- 题材不足保留原词表并提示。
排查时先确定出错的是输入、状态、数据读取还是显示;用标签暂时显示关键值,每次只改变一个条件。
界面图是积木执行后的画布近似预览;计时器、绘制与系统控件在设备上的实际表现仍需运行检查。
两个理解题与独立改造
- 换成六个英语单词,需要复制六套点击事件吗?
- 人物与成就显示文字不同,怎样判断是一对?
独立改造: 改为“人物—成就”配对:两张显示不同文本但属于同一组。
先完成自己的工程,再对照答案。检查成功路径,也检查空数据、重复操作和取消;写出你改动的规则。
查看预测与练习参考答案
预测: 不需要。循环和索引按词表处理,只有内容改变。
追踪: 引入稳定 groupId,匹配比较组 ID,绘制使用 displayText。
改造思路: 牌要包含 groupId 和 displayText,匹配比较 groupId,绘制显示 displayText。不能仍用显示文字直接相等,否则人物和成就永远不匹配。
完成与下一步
保存自己的工程并导出 .aia;给文件命名以区分本课作业和参考源码。请用自己的话解释本课知识,并展示一次失败输入的处理。
扫码添加客服咨询