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>
53 lines
1.1 KiB
Swift
53 lines
1.1 KiB
Swift
import Foundation
|
|
|
|
struct Card: Identifiable, Equatable, Hashable, Codable, Sendable {
|
|
let id: UUID
|
|
let suit: Suit
|
|
let rank: Rank
|
|
var isFaceUp: Bool
|
|
|
|
init(suit: Suit, rank: Rank, isFaceUp: Bool = false) {
|
|
self.id = UUID()
|
|
self.suit = suit
|
|
self.rank = rank
|
|
self.isFaceUp = isFaceUp
|
|
}
|
|
|
|
var color: Suit.Color { suit.color }
|
|
|
|
var accessibilityDescription: String {
|
|
if isFaceUp {
|
|
"\(rank.displayName) of \(suit.displayName)"
|
|
} else {
|
|
"Card, face down"
|
|
}
|
|
}
|
|
|
|
func frontImageName(style: CardFaceStyle) -> String {
|
|
"\(style.rawValue)_\(suit.rawValue)_\(rank.fileName)"
|
|
}
|
|
}
|
|
|
|
enum CardFaceStyle: String, CaseIterable, Codable, Sendable {
|
|
case classic, modern, extracted
|
|
}
|
|
|
|
enum CardBackDesign: Int, CaseIterable, Codable, Sendable {
|
|
case abstractClouds = 1
|
|
case abstractScene
|
|
case abstract
|
|
case astronaut
|
|
case blue
|
|
case blue2
|
|
case cars
|
|
case castle
|
|
case fish
|
|
case frog
|
|
case red
|
|
case red2
|
|
|
|
var imageName: String {
|
|
"back_\(String(format: "%02d", rawValue))"
|
|
}
|
|
}
|