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. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
45 lines
1.1 KiB
Swift
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)
|
|
}
|
|
}
|