永続化(SwiftData)

HighScoreRecord

@Model final class HighScoreRecord {
    var score: Int = 0
    var achievedAt: Date = Date()
}

StatRecord(プレイ履歴)

@Model final class StatRecord {
    var score: Int = 0
    var playedAt: Date = Date()
}

状態管理(@Observable @MainActor)

クラス責務
GameEngineグリッド・配置・ライン消去・スコア・アンドゥ・演出
AdManager広告表示制御
StoreManager課金(広告除去)
SoundManagerサウンド再生
HapticManagerハプティクス
StreakManager連続プレイ日数

Value Types

struct Block: Identifiable, Sendable {
    let id: UUID
    let shape: BlockShape  // 19種類
    let color: BlockColor  // 12色
}

struct BlockShape: Sendable {
    let offsets: [(row: Int, col: Int)]
    func rotated() -> BlockShape  // 4回転対応
    func cells(at anchor: GridPosition) -> [GridPosition]
}

struct GridPosition: Hashable, Sendable {
    let row: Int   // 0-7
    let col: Int   // 0-7
}

enum CellState {
    case empty
    case filled(BlockColor)
}

enum GameState {
    case playing
    case gameOver
    case rescued  // リワード広告で救済中
}

BlockShape 19種類

dot / domino2H/V / line3H/V / lShape3A〜3D / line4H/V / square2x2 / tShapeDown/Up / sShape / zShape / bigLShapeA/B / plusShape

BlockColor 12種類

red, blue, green, yellow, orange, purple, cyan, pink, mint, indigo, teal, brown

ColorTheme 5種類

classic / ocean / sakura / neon / monochrome

UndoSnapshot

struct UndoSnapshot {
    let grid: [[CellState]]
    let blocks: [Block?]
    let score: Int
    let comboCount: Int
}

UserDefaults キー

キー用途
currentTheme選択中ColorTheme
soundEnabled効果音有効
hapticEnabledハプティクス有効
lastPlayedDateストリーク管理
streakCount連続プレイ日数

変更履歴

バージョン日付変更内容
1.02026-05-09初版作成