Schafkopf-Server/Sources/App/Model/Card.swift

115 lines
2.2 KiB
Swift
Raw Normal View History

2021-11-30 11:55:13 +01:00
import Foundation
2021-12-01 22:47:19 +01:00
import Vapor
2021-11-30 11:55:13 +01:00
typealias CardId = String
2021-12-01 22:47:19 +01:00
struct Card: Codable {
2021-11-30 11:55:13 +01:00
2021-12-01 22:47:19 +01:00
enum Symbol: Character, CaseIterable, Codable {
2021-11-30 11:55:13 +01:00
case ass = "A"
case zehn = "Z"
case könig = "K"
case ober = "O"
case unter = "U"
case neun = "9"
case acht = "8"
case sieben = "7"
2021-12-01 22:47:19 +01:00
var points: Int {
switch self {
case .ass:
return 11
case .zehn:
return 10
case .könig:
return 4
case .ober:
return 3
case .unter:
return 2
default:
return 0
}
}
2021-11-30 11:55:13 +01:00
}
2021-12-01 22:47:19 +01:00
enum Suit: Character, CaseIterable, Codable {
2021-11-30 11:55:13 +01:00
case eichel = "E"
case blatt = "B"
case herz = "H"
case schelln = "S"
}
let symbol: Symbol
let suit: Suit
init(suit: Suit, symbol: Symbol) {
self.suit = suit
self.symbol = symbol
}
2021-12-01 22:47:19 +01:00
init(_ suit: Suit, _ symbol: Symbol) {
self.suit = suit
self.symbol = symbol
}
2021-11-30 11:55:13 +01:00
init?(rawValue: String) {
guard rawValue.count == 2 else {
return nil
}
guard let suit = Suit(rawValue: rawValue.first!),
let symbol = Symbol(rawValue: rawValue.last!) else {
return nil
}
self.suit = suit
self.symbol = symbol
}
var id: CardId {
2021-12-01 22:47:19 +01:00
"\(suit.rawValue)\(symbol.rawValue)"
}
var points: Int {
symbol.points
2021-11-30 11:55:13 +01:00
}
2021-12-03 18:03:29 +01:00
static let allCards: Set<Card> = {
let all = Card.Suit.allCases.map { suit in
Card.Symbol.allCases.map { symbol in
Card(suit: suit, symbol: symbol)
}
}.joined()
return Set(all)
}()
2021-11-30 11:55:13 +01:00
}
extension Card: CustomStringConvertible {
var description: String {
2021-12-01 22:47:19 +01:00
"\(suit) \(symbol)"
2021-11-30 11:55:13 +01:00
}
}
2021-12-01 22:47:19 +01:00
extension Card: Hashable {
}
2021-12-03 18:03:29 +01:00
struct PlayableCard {
let card: Card
let isPlayable: Bool
var cardInfo: CardInfo {
.init(card: card.id, playable: isPlayable)
}
}
struct CardInfo: Codable, Equatable {
let card: CardId
let playable: Bool
}