目的・役割
13のジャンル(歴史・科学・地理 等)から興味のあるものを 100コイン で解放し、ジャンル別クイズで集中学習する画面。
UI 構成
| 要素 | 種類 | 説明 |
| コインバッジ | HStack | 現在のコイン残高 |
| ジャンルカード | LazyVGrid | 13ジャンル × (icon, name, cost or プレイボタン) |
| 進捗ボタン | NavigationLink | GenreProgressView |
| 履歴ボタン | NavigationLink | GenreQuizHistoryView |
状態
| 状態 | 表示内容 |
| 未アンロック | 「100コインで解放」ボタン |
| 残高不足 | 「コインが足りません」アラート |
| アンロック済 | 「プレイ」ボタン → モード選択 |
遷移
| 操作 | 遷移先 |
| 「100コインで解放」 | 確認アラート → コイン消費 → アンロック |
| 「プレイ」 | モード選択(ランダム/順番/続きから) → GenreQuizPlayView |
| 進捗 | GenreProgressView |
| 履歴 | GenreQuizHistoryView |
使用するデータモデル
GenreDefinition {
let id: String
let name: String
let icon: String // SF Symbol
let cost: Int // 100
}
GenreQuizService {
func unlockGenre(id: String) -> Bool
func isUnlocked(id: String) -> Bool
}
実装メモ
- 13ジャンルの定義は GenreDefinition の static 定数
- unlockGenre() で CoinService.spendCoins(100) → 成功で AppGroup に保存
- プレイ開始時に Interstitial広告を挟む
関連
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |