第三题改为数独挑战,开发材料集中管理并改为当面考察

This commit is contained in:
2026-09-21 17:44:13 +08:00
parent c9d5564946
commit a73151707d
6 changed files with 136 additions and 97 deletions
+8 -18
View File
@@ -1,25 +1,15 @@
# 第三题开发目录
选做第三题时,先 Fork 本仓库,再在个人 Fork 的这个目录中放置项目。完整要求见[第三题题面](../tasks/03-development.md)。本目录目前只有说明,没有 App 成品或解题代码。
先阅读[第三题简要题面](../tasks/03-development.md),再 Fork 仓库,在个人 Fork 的本目录中开发。无需向原仓库提交材料或 PR;最好在面谈前提前告知负责人仓库链接和项目位置,方便预先看代码。
建议按下面的方式组织;可以按自己的项目需要调整:
## 开发材料
```text
development/
├── README.md 改写为自己的作品说明与运行方法
├── requirements.md 简短需求、路线选择与完成情况
├── App/ Swift 项目和必要资源
└── demo/ 实际运行录屏,或录屏访问说明
```
- [开发需求](requirements.md):两条路线共用标准、路线 A 说明、路线 B 数独的基础需求与验收示例。
- [数独题库](sudoku-puzzles.json):3 道固定的标准 9×9 数独;每题具有唯一解,不含答案与求解代码。
- [作品说明模板](project-notes.md):在个人 Fork 中填写,帮助负责人打开项目、了解完成情况。
在个人 Fork 中,请将这份 README 改为自己的作品入口,至少说明:
题库采用 JSON:`id` 为题目标识,`name` 为显示名称,`grid` 为按行排列的 9×9 整数数组,`0` 表示空格,`1`–`9` 为不能修改的初始数字。数组下标从 0 开始。可以读取该文件,也可以将数据转成适合自己项目的结构;不限定存储或界面实现方式。
1. 作品名称、选择路线 A 还是 B、核心用途。
2. 怎样打开与运行项目,以及实际使用的工具版本和运行设备或模拟器。
3. 已完成、未完成和已知问题;路线 B 可对照 R1–R5 逐项说明。
4. 需求说明和真实演示的位置,演示应覆盖核心操作、边界情形与重启恢复。
5. AI 使用方式、本人怎样检查结果,以及一次真实问题的处理或验证、调整。
建议保留本目录材料,将 Swift 项目及所需资源放在 `App/` 下,并填写 `project-notes.md`。不要把构建产物或账号凭据放进仓库。设备与运行环境安排之后再统一说明。
提交时,将个人 Fork 地址和验收用的提交版本通过原仓库后续公布的入口提交。无需将完整 App 合并回原题仓库。保留题面和模板文件,避免把构建产物、个人账号凭据或设备专属文件提交到仓库。
设备环境、录屏提交方式及大小限制会在正式发布时补充。
不要求提交录屏、制作汇报 PPT 或上架应用。面谈以真实运行、代码和交流为准;工具或 AI 生成的结果需要自己检查。
+12
View File
@@ -0,0 +1,12 @@
# 作品说明
在个人 Fork 中简要填写,供负责人提前看代码和当面交流使用。无需提交到原仓库。
- **作品名称与路线**:[路线 A / 路线 B]
- **项目位置与运行方法**:[打开哪个文件,怎样运行;实际使用的工具版本与设备或模拟器]
- **需求与完成情况**:[路线 A 简述核心流程、保存的数据、两种边界情况及设计调整;路线 B 对照 R1–R6 写明已完成和未完成项]
- **已知问题**:[如实写明;尚未验证的功能请注明]
- **运行与检查经历**:[简述自己实际验证了什么,以及遇到的问题或一次调整]
- **AI 使用情况**:[用了哪些工具,具体帮助完成了什么,自己完成了什么;未使用则写“未使用”。仅用于了解工作过程,不单独评分]
面谈前最好提前告知负责人仓库链接和项目位置,并确认能够访问;不要求另外准备录屏或汇报材料。
+53
View File
@@ -0,0 +1,53 @@
# 第三题开发需求
## 两条路线共用标准
1. 用 Swift 做出可交互的 App,界面优先采用 SwiftUI;能从开始到结束完成一条核心流程。
2. 用户输入或选择会改变应用内容,并获得明确反馈。
3. 核心用户数据保存在本地,彻底退出并重新启动后仍可恢复。
4. 处理与本场景相关的异常或边界情况,不能只展示静态页面。
5. 在[作品说明](project-notes.md)写清运行方法、实际完成情况与已知问题,能当面演示并讲解。
不要求登录、服务器、云同步、复杂架构或应用商店上架。额外功能不能代替核心流程。
## 路线 A:开发第二题方案
选择第二题中一个可完成的小版本。简要说明用户、核心操作、要保存的数据、至少两种边界情况的预期行为,以及与第二题设计不同的地方;可以引用第二题 PDF,不必重写长文。实现上述共同标准,功能应自然服务于自己的用途。
## 路线 B:数独游戏
### 游戏规则与范围
棋盘由 9 行、9 列组成,分为 9 个 3×3 宫。将空格填入 1–9,使每行、每列、每宫中的数字均不重复。初始数字不可修改。只有全部填满且满足规则才算完成;填满但有冲突不能判胜。
使用提供的[固定题库](sudoku-puzzles.json)即可,不要求随机生成数独或编写求解器。题库中的 0 表示空格,不能作为玩家填写的数字。
### 必须实现的功能
| 编号 | 需求 | 可以检查的结果 |
| --- | --- | --- |
| R1 | 选择题目并开始游戏 | 能选择题库中的不同题目,正确显示 9×9 棋盘和 3×3 宫边界,能区分初始数字与玩家填写的数字 |
| R2 | 选格、填数、修改与擦除 | 仅空白起始格可编辑;可输入 1–9、替换已填数字或擦除;初始数字始终不可修改 |
| R3 | 冲突检查 | 对玩家数字与同行、同列或同宫数字重复的情况给出明确反馈;可实时检查或通过“检查”按钮触发;修改或擦除后能更新结果 |
| R4 | 判断完成 | 全部填满且无冲突时明确提示完成;有空格或存在冲突时不能判胜 |
| R5 | 重新开始与换题 | 重新开始当前题、换题都需确认;确认后清除当前玩家填写,载入对应初始棋盘;取消则保留当前题与进度 |
| R6 | 保存当前进度 | 保存当前题目及玩家填写;彻底退出、重新启动后恢复。修改、擦除、重新开始和换题的结果也要保存 |
只需保留当前一局,不要求保存每道题的独立进度。重新打开 App 不应自动清空棋盘;完成后重新打开仍应显示已完成的棋盘或完成状态。
### 边界行为
- 没有选中格子或选中初始数字时,输入与擦除不改变棋盘。
- 只允许填写 1–9;采用数字键盘或屏幕按钮均可,其他输入不得造成非法数据或崩溃。
- 检查重复时忽略空格,并排除格子自身;不能把“不重复但尚未证明正确”直接当成完成。
- 首次启动无保存记录时能正常选题或进入默认题;重新开始、换题与继续当前局应有清楚区分。
### 当面演示参考
选一题 → 尝试修改初始数字(应无效)→ 填入一个会重复的数字并检查 → 修改或擦除,反馈随之更新 → 退出并重新启动,题目及填写恢复 → 重新开始但取消,进度保留 → 确认重新开始,只保留初始数字 → 换题并重启,恢复新题。
另外准备展示一次合法完成,并验证“填满但有冲突”不会误判完成。可以提前准备接近完成的真实游戏进度;不要用固定成功页面代替判断逻辑。
### 可选扩展
计时、笔记候选数、撤销、提示、难度分级、随机出题、动画等均不要求。先完成基础需求,再按兴趣扩展。
+47
View File
@@ -0,0 +1,47 @@
[
{
"id": "sudoku-01",
"name": "练习 1",
"grid": [
[0, 4, 0, 0, 0, 7, 0, 0, 0],
[9, 0, 7, 5, 0, 2, 0, 0, 0],
[5, 6, 0, 0, 0, 3, 0, 1, 7],
[1, 0, 5, 0, 2, 8, 0, 0, 9],
[6, 2, 0, 0, 3, 9, 0, 7, 5],
[4, 0, 0, 1, 0, 5, 6, 0, 0],
[0, 0, 6, 2, 0, 4, 0, 9, 1],
[3, 0, 1, 7, 0, 0, 2, 0, 0],
[0, 0, 0, 0, 9, 1, 0, 5, 0]
]
},
{
"id": "sudoku-02",
"name": "练习 2",
"grid": [
[0, 0, 0, 5, 4, 0, 7, 1, 8],
[0, 0, 0, 7, 0, 0, 0, 9, 6],
[0, 0, 8, 0, 0, 0, 0, 0, 3],
[0, 6, 5, 4, 0, 7, 1, 0, 0],
[0, 0, 2, 9, 0, 0, 0, 3, 7],
[0, 0, 7, 1, 8, 2, 0, 0, 5],
[3, 7, 0, 0, 2, 9, 0, 0, 0],
[6, 5, 4, 0, 7, 1, 0, 0, 0],
[8, 0, 9, 6, 0, 4, 0, 0, 1]
]
},
{
"id": "sudoku-03",
"name": "练习 3",
"grid": [
[3, 6, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 9, 3, 0, 4, 7, 2, 5],
[0, 0, 0, 8, 1, 9, 3, 6, 4],
[0, 0, 2, 5, 0, 0, 0, 0, 6],
[5, 8, 1, 0, 3, 0, 0, 7, 0],
[0, 0, 0, 4, 7, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 7, 2, 0, 0],
[0, 5, 0, 1, 0, 3, 0, 4, 7],
[6, 0, 7, 0, 0, 0, 1, 9, 0]
]
}
]