XCode-Claude-Workflow/SoliCards/Persistence/StatsRecord.swift
idev2025 0f989f5c86 feat: SoliCards v1.2.0 — native SwiftUI solitaire for iOS, iPadOS, macOS
Complete native rewrite of the web-based SoliCards game as a SwiftUI
multiplatform app targeting iOS 17+, iPadOS 17+, and macOS 14+.

Three solitaire variants (Klondike, Spider, FreeCell) with full game
rules, drag & drop, smart zoom layout, 6 themes, 4 difficulty levels,
SwiftData persistence, VoiceOver accessibility, and 57 unit tests.

Key features:
- MVVM + Protocol-Oriented Strategy architecture
- DragGesture with coordinate-space hit-testing (long press + drag)
- Smart zoom: cards auto-size to fit screen based on deepest column
- Landscape: 30% bigger cards with scrollable overflow (iOS)
- macOS: 120pt card cap, 92% height buffer for window resizing
- Auto-save, game resume, statistics tracking via SwiftData
- Privacy manifest, app icon, String Catalog, zero dependencies

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 07:33:52 -04:00

45 lines
1.1 KiB
Swift

import Foundation
import SwiftData
@Model
final class StatsRecord {
var variant: String
var difficulty: String
var gamesPlayed: Int
var gamesWon: Int
var bestScore: Int
var bestTime: Int
var currentStreak: Int
var bestStreak: Int
init(variant: GameVariant, difficulty: Difficulty) {
self.variant = variant.rawValue
self.difficulty = difficulty.rawValue
self.gamesPlayed = 0
self.gamesWon = 0
self.bestScore = 0
self.bestTime = Int.max
self.currentStreak = 0
self.bestStreak = 0
}
func recordWin(score: Int, time: Int) {
gamesPlayed += 1
gamesWon += 1
if score > bestScore { bestScore = score }
if time < bestTime { bestTime = time }
currentStreak += 1
if currentStreak > bestStreak { bestStreak = currentStreak }
}
func recordLoss() {
gamesPlayed += 1
currentStreak = 0
}
var winRate: Double {
guard gamesPlayed > 0 else { return 0 }
return Double(gamesWon) / Double(gamesPlayed)
}
}