鸿蒙文搜图·图境奇旅:剧情藏线索,搜对图片才能翻页的旅行手账

这是一个把「文搜图」做成叙事解谜的 HarmonyOS 应用。你得自己读懂一段旅行故事,从字里行间提炼出关键词,才能搜出剧情所指的那张图。搜对了才能翻页,搜错了……那就再读一遍。六章旅程走完,回头解锁整册旅行照片。全程端侧、零网络、零权限。
在这里插入图片描述


一、效果展示:一段完整的解谜流程

1. DevEco Studio 中的运行全景

开发环境

项目 story-quest 在 DevEco Studio 中一键运行到 Mate 90 Pro 模拟器。左侧项目结构、中间 README、右侧运行窗口,底部日志显示 com.example.storyquest successfully launched。全程端侧、无网络、无权限。

2. 开始页:旅行手账封面

开始页

开始页走旅行手账风:奶油纸底,一张白卡片上用橘红胶带贴条斜贴着「TRAVEL LOG · 六章旅程」标签,下面是手写感的「图境奇旅」大标题。副题写着「剧情里藏着线索,搜对图片才能翻页。像翻旅行手账一样,走完六段故事。」

下面三个彩色小标签排成列:读剧情(蓝)、搜图库(红)、搜分数(绿),各配一行说明。底部一枚天蓝色「启程翻页」按钮,整个页面像一本刚翻开的旅行手账。

3. 第一章「启程的清晨」:读故事找线索

第一章

进入第一章,顶部是行程节点线——6 个圆点排成一行,当前第 1 站用红色高亮,其余灰白,右端标注「第 1 站 / 共 6 站 · 行囊积分 0」。

剧情卡用红色「本章剧情」胶带贴条标记,内容是:

天刚蒙蒙亮,行囊已经收拾好。双手捧起一只粗瓷碗,姜片和柠檬在水里打着转,热气一直烫到心口。喝完这一碗,就该出门了。

——搜索这碗暖手的东西。

线索就藏在故事里:粗瓷碗、姜片、柠檬、热气、暖手。玩家需要自己提炼关键词,不能靠系统给。

下方是自由输入框(占位提示「提炼关键词,如:毛茸茸 宠物」),旁边一枚蓝色「翻图」按钮。右下角还有个小字链接「求个提示 · -20 分」——卡关时可以花 20 分看三个提示词。

4. 输入关键词:手机键盘弹出

键盘输入

玩家输入了「宠物」——这是被占位提示「毛茸茸 宠物」带偏了。键盘弹出,输入框聚焦,还没点「翻图」。

这一张截图展示了自由输入检索的交互形态:虽然是自由文本搜索,但语境完全不同——你不是在找图,是在解谜。

5. 第一次搜索:错搜出「草地与狗」

搜出草地与狗

用「宠物」搜出唯一结果:「草地与狗」——一个女孩蹲在草地上逗狗。得分角标 3,底部标签「宠物」。

但这不是剧情所指的图!剧情说的是「姜片和柠檬在水里打着转」,指向的是「柠檬姜茶」。搜索框下方弹出一条珊瑚红错误提示:「『草地与狗』不是这一站的风景,再读一遍剧情」。

这个设计的核心在于:检索结果是对的(标签确实命中「宠物」),但剧情理解是错的。系统不会告诉你该搜什么词,只会告诉你搜错了。

6. 第二次搜索:搜「茶」仍错选「晨光茶歇」

错选晨光茶歇

玩家调整关键词为「茶」,搜出「晨光茶歇」——一杯茶配一本书,晨光洒在桌面上。得分 3,标签「茶杯」。

点选后依然错误:「『晨光茶歇』不是这一站的风景,再读一遍剧情」。原因是「晨光茶歇」的标签是「下午茶、书本、阅读」,和剧情里的「姜片、柠檬、暖手」并不匹配。

真正的目标是「柠檬姜茶」——标签含「姜茶、柠檬、热饮」,和剧情完美对应。玩家需要再读一遍故事,抓住「姜片和柠檬」这个关键细节,搜「姜茶」才能命中。


二、产品立意:把「读故事」变成「搜图」

「图境奇旅」的核心设计只有一句话:搜索框里不放关键词,放你对剧情的理解。

传统的文搜图应用,查询词要么自由输入、要么系统给定、要么从词池挑选。而这个应用更进一步——查询词需要玩家自己从一段旅行故事里提炼出来。你不是在操作一个搜索框,而是在读一段旅行故事。故事里的每一个细节(粗瓷碗、姜片、柠檬、热气)都是线索,你需要把它们翻译成图库的标签语言。

这个设计让「搜索」变成了阅读理解的自然延伸:读懂了就能搜到,搜不到就说明没读到位。


三、六章旅程:一段从清晨到归途的完整叙事

六章构成一段环形旅程——清晨出发,穿过城市、黄昏、星夜、雪山,最终回到出发的地方:

章节标题目标图核心线索
1启程的清晨柠檬姜茶粗瓷碗、姜片、柠檬、暖手
2城市的告别欧式穹顶穹顶、塔楼、天际线
3黄昏的云云天云、傍晚、月亮
4荒野的星夜星空下的谷仓星空、夜晚、寂静
5雪山的召唤雪山雪山、峰顶、积雪
6归途的伙伴草地与狗狗、草地、陪伴

每章末尾的破折号给出搜索指令(「——搜索这碗暖手的东西」),但不给具体词——关键词需要玩家自己从故事里提炼。


四、核心机制:提炼关键词与错误纠偏

1. 自由输入 + 标签计分检索

search(query: string): void {
  const keywords = query.split(/\s+/).filter(k => k.length > 0);
  for (const card of CARDS) {
    let score = 0;
    for (const kw of keywords) {
      if (card.tags.indexOf(kw) >= 0) score += 3;
      else if (card.title.indexOf(kw) >= 0) score += 2;
      else { /* 部分匹配 */ }
    }
    if (score > 0) hits.push(...);
  }
  hits.sort((a, b) => b.score - a.score);
}

检索引擎是纯端侧的标签计分匹配(标签精确 +3、标题包含 +2、部分匹配 +1),关键词不是随手敲的,而是从剧情里读出来的。搜索结果的排序本身就是对剧情理解的反馈——目标图排得越靠前,说明你提炼的关键词越精准。

2. 错误提示:不剧透答案,只给方向

wrongFeedback = `『${hit.title}』不是这一站的风景,再读一遍剧情`;

点错图后不会弹出「正确答案是 XX」,只会温和地提示「再读一遍剧情」。这个设计保护了叙事解谜的核心乐趣——玩家需要自己回头重读故事,发现被忽略的细节。

3. 提示系统:花钱看词,每章一次

useHint(): void {
  if (this.hintShown || this.hintsUsed >= 1) return;
  this.hintWords = this.chapter.hintWords;  // 如 ['姜茶', '柠檬', '碗']
  this.hintShown = true;
}

卡关时可以花 20 分看三个提示词(如第一章的「姜茶、柠檬、碗」)。但每章只能用一次,且总分扣 20——提示是有代价的。

4. 计分:一次搜对 100 分,多搜多错皆扣

得分 = max(20, 100 - 搜索次数×10 - 提示×20)

第一次就搜对拿满分 100;每多搜一次 -10,用提示 -20,下限 20 分保底。6 章满分 600,终局按总分解锁回顾画廊。


五、UI 实现:旅行手账的视觉体系

配色:奶油纸底 + 三色标签

色值用途
#F5F0E1奶油纸底
#2D2926墨色文字
#E85D3D橘红(胶带/剧情标签/当前站)
#4A90D9天蓝(读剧情/按钮)
#5CA85C草绿(搜分数/成功反馈)
#D94A4A珊瑚红(错误提示/搜图库标签)

关键视觉元素

  • 胶带贴条:TRAVEL LOG、本章剧情 等标签用微倾斜的色块模拟手账胶带
  • 行程节点线:6 个圆点连成一线,当前站红色高亮,已过站灰色,未来站灰白
  • 拍立得照片:搜索结果和解锁图卡用白边圆角卡片,微微倾斜,模拟拍立得照片钉在手账上的效果
  • 便签提示条:错误提示用珊瑚红便签条,成功提示用草绿便签条

六、验证:截图与代码逻辑核对

截图关键数据代码验证
03-chapter1第 1 站 / 共 6 站,行囊积分 0CHAPTERS.length = 6,初始 totalScore = 0 ✓
05-hit-dog「宠物」搜出草地与狗,得分 3草地与狗标签含「宠物」→ +3 分 ✓
06-wrong-tea「茶」搜出晨光茶歇,错选提示晨光茶歇标签含「茶杯」→ 命中但非目标图 ✓
06-wrong-tea错误提示「再读一遍剧情」wrongFeedback 文案匹配 ✓

三次搜索的词组变化(宠物 → 茶 → 姜茶)清晰展示了逐步逼近正确理解的过程。


七、已知边界

  1. 六章剧情为固定内容,无分支或多结局
  2. 内置图卡共 12 张,部分章节的「目标画面」与剧情的对应带有解读色彩
  3. 未实现进度持久化,退出应用后从头开始
  4. 提示词为预置,未做动态生成——如果玩家搜的词和提示词完全不同,提示可能不够有针对性

八、小结

「图境奇旅」把「读懂一段故事」变成「搜出一张图」,把「搜索」变成「理解」的自然延伸。旅行手账的视觉体系 + 六章环形叙事 + 自由提炼关键词的检索机制,让文搜图这个技术动作第一次有了故事感。全程端侧、零网络零权限,模拟器即可完整游玩。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐