# XinYiFindDiff **Repository Path**: eersoft/xin-yi-find-diff ## Basic Information - **Project Name**: XinYiFindDiff - **Description**: 心仪找不同 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: https://www.eersoft.top - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-09 - **Last Updated**: 2026-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 心仪找不同 · 桌面版 基于 **.NET 8 + WPF(C#)** 的找不同游戏与创作工具,零第三方运行时依赖(仅 System.Drawing.Common 用于图像编解码)。 ## 功能总览 | 模块 | 说明 | |---|---| | 🎮 找不同游戏 | 经典左右对照玩法;**每次开局的差异位置都随机组合、绝不雷同**(随机算法见下) | | 🖌 图片编辑器 | 裁剪 → 双栏编辑(图章/画笔/橡皮/模糊)→ 标记差异区域 → 保存到图库 | | 📦 包系统 | "包"是分享的基本单位:一个包含任意张图片,带名称/简介/作者/难度;一键导出 `.fdp` 分享文件,一键导入他人包 | | 🗂 图片库 | 内置示例包开箱即玩;包卡片管理(游玩/详情/导出/删除) | | ⚙ 难度三档 | 简单/中等/困难:时限(120/90/60s)、点击容差(20/14/9px)、错点惩罚(0/-5/-10s)、提示次数(3/2/1)、得分系数不同 | | 📊 成绩 | 单张图最佳得分与游玩统计持久化到本地 | ## 快速开始 ```bash # 构建(需要 .NET 8 SDK) dotnet build FindDiff.sln -c Release # 运行 dotnet run --project FindDiff.App -c Release # 或直接运行编译产物 ./FindDiff.App/bin/Release/net8.0-windows/FindDiff.App.exe # 发布为单机程序 dotnet publish FindDiff.App -c Release -o publish ``` 首次启动自动生成内置示例包「示例包·夕山灯夜」(程序绘制的两幅场景图,含真实差异),无需自建即可直接游玩。 ## 玩法 1. **图库页** → 点击包的「▶ 游玩」(或进入详情页选图) 2. **设置页**:选难度、勾选图片、设定每张差异数与张数 3. **游玩页**:左右并排显示"原图"与"本局合成图",点击差异处即可。滚轮缩放、中键拖动平移 4. 结算页可「再来一局」——同一设置会重新随机组合差异位置 ## 编辑器用法(创作自己的找不同) 1. **裁剪**:选一张图片 → 拖拽裁剪框(可锁定 1:1 / 4:3 / 16:9 等比例)→ 设定输出尺寸 2. **制造差异**(右栏"处理图"): - **图章**(PS 仿制图章):**Ctrl+点击 或 右键点击** 设定取样点(右键按住可拖动调整),再到右图按住左键拖动涂抹——**源点随笔刷同步移动,整块克隆图案**;笔刷光标显示源图内容预览(半透明) - **画笔**:选色涂抹(Ctrl+点击左图可原图取色;点击色块打开取色器) - **橡皮**:恢复原图像素(擦掉不满意的修改) - **模糊**:局部模糊制造"看不清"的差异 - 笔刷**粗细/硬度/强度**可调(`[` `]` 快捷键调粗细),撤销/重做(`Ctrl+Z` / `Ctrl+Y`),左右两栏缩放平移同步;涂抹时拖出图像范围会自动滚动跟随 3. **标记差异区域**:开启「⛳ 标记模式」在右栏框选每个差异;或编辑完成后直接点「🧿 自动检测区域」一键生成 4. **保存到图库**:选择已有包或新建包,填写图片名与难度。保存时系统会自动把区域扩张到差异的实际覆盖范围,并校验区域重叠/越界 > 小技巧:图章是制造"高级差异"的核心工具——把画面某处盖掉、移动元素、消除细节,都能做出很难找的不同。取样点与落笔点靠近(30~80px)效果最佳。 ## 随机组合算法("每次玩都不雷同"的秘密) 编辑器保存的是 **原图 + 每个差异区域的"处理后补丁"**,而不是一张烧录好的成品图。每局开始时: 1. 从该图的 R 个标记区域中**随机抽取 N 个**(组合数 C(R,N)) 2. **避开最近 8 局出现过的组合**(组合历史去重),保证连续多局不重复 3. 优先选择**空间上分散**的组合(区域质心间平均距离最大,避免差异挤成一团) 4. 引擎把选中区域的补丁**实时合成**到原图上生成当局画面 未选中的区域两图完全一致,玩家找不到也不存在。因此同一张图、同一设置,每局玩到的差异位置都不同。 ## 分享包格式(.fdp) `.fdp` 文件即 zip 压缩包: ``` manifest.json # 元数据(FormatVersion 预留向前兼容) images/{imageId}/source.png # 原图 images/{imageId}/thumbnail.png images/{imageId}/patches/{regionId}.png # 每个差异区域的处理后补丁 ``` - **导出**:图库/详情页 →「导出包」 - **导入**:图库页 →「导入 .fdp 包」;导入时校验格式版本、资源完整性、区域边界,并防路径穿越 - **未来在线分享**:格式已预留 `FormatVersion`、作者等字段,后续只需增加上传/下载接口即可接入在线图库 ## 本地数据 ``` %AppData%/FindDiff/ ├── library/packs/{packId}/… # 图库包(manifest.json + 图片资源) ├── settings.json # 用户设置(难度/差异数偏好等) └── scores.json # 成绩统计(最佳得分/游玩次数) ``` ## 技术架构 ``` FindDiff.sln ├── FindDiff.Core # 纯逻辑(无 UI,可独立测试) │ ├── Imaging/ # PixelBuffer(BGRA32) / 编解码 / 编辑工具像素算子 │ ├── Engine/ # RegionRandomizer 随机组合 / CompositeRenderer 合成 / RegionAutoDetect 差异检测 │ ├── Editor/ # EditorSession(撤销重做/自动扩张/保存校验) │ ├── Persistence/ # PackStore 图库 / PackFile .fdp 打包导入 / SettingsStore │ ├── Models/ # Difficulty / DiffRegion / DiffImage / DiffPack / GameSetup │ └── Samples/ # 内置示例包生成器(程序化绘制场景 + 变体制造差异) ├── FindDiff.App # WPF 界面(深色主题) │ ├── Controls/ # ImageCanvas(缩放平移同步/覆盖层/工具事件/边缘自动滚动) │ ├── Views/ # 图库 / 包详情 / 设置 / 游戏 / 裁剪 / 编辑器 │ └── Dialogs/ # 关于 / 包信息 / 保存到图库 / 取色器 ├── FindDiff.App.Smoke # UI 冒烟测试(视图构造 / 真实状态机拖动 / 边缘滚动 / 显示层校验) └── FindDiff.Core.Tests # 轻量自测(dotnet run --project FindDiff.Core.Tests) ``` 测试覆盖:像素算子、随机组合(去重/确定性/分散偏好)、合成渲染、自动检测、裁剪缩放、包导出导入往返(含损坏/越界包拒绝)、示例包生成、编辑器保存流程、图章轨迹感知羽化(边缘等距线/无累积混合)、真实状态机拖动与边缘滚动。 ## 已知限制 / 路线图 - 编辑器当前以"矩形区域"为主(补丁与命中均按矩形;椭圆形状已支持命中判定,界面暂只生成矩形) - 在线分享功能未实现(格式已预留,可后续接入) - 游戏音效使用系统提示音,未内置音效资源 ## 音频素材与许可 内置音频均为免费许可素材,随应用分发(,含 CREDITS.txt): | 用途 | 来源 | 许可 | |---|---|---| | 背景音乐 ×5 | OpenGameArt(TownTheme / awesomeness / Woodland Fantasy / Soliloquy / Mystical Theme) | CC0 / CC-BY 3.0(署名:Alexandr Zhelanov 等,详见 CREDITS.txt) | | 游戏音效 ×4(正确/错误/警告/提示) | Juhani Junkala「512 Sound Effects (8-bit style)」 | CC0 | 应用启动时自动从打包目录加载音频;若素材缺失,则回退到程序化生成的备选音频。 ## 许可证 - 作者:eersoft - 远程仓库:https://gitee.com/eersoft/xin-yi-find-diff.git