Move/split card file

This commit is contained in:
Christoph Hagen
2021-12-06 11:40:53 +01:00
parent 3db9652cad
commit 158a2ea03f
3 changed files with 100 additions and 51 deletions

View File

@ -0,0 +1,75 @@
import Foundation
import Vapor
typealias CardId = String
struct Card: Codable {
enum Suit: Character, CaseIterable, Codable {
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
}
init(_ suit: Suit, _ symbol: Symbol) {
self.suit = suit
self.symbol = symbol
}
init?(id: CardId) {
guard id.count == 2 else {
return nil
}
guard let suit = Suit(rawValue: id.first!),
let symbol = Symbol(id: id.last!) else {
return nil
}
self.suit = suit
self.symbol = symbol
}
var id: CardId {
"\(suit.rawValue)\(symbol.id)"
}
var points: Int {
symbol.points
}
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)
}()
}
extension Card {
func isTrump(in game: GameType) -> Bool {
game.sortingType.isTrump(self)
}
}
extension Card: CustomStringConvertible {
var description: String {
"\(suit) \(symbol)"
}
}
extension Card: Hashable {
}

View File

@ -0,0 +1,12 @@
import Foundation
struct PlayableCard {
let card: Card
var isPlayable: Bool
var cardInfo: CardInfo {
.init(card: card.id, playable: isPlayable)
}
}

View File

@ -0,0 +1,76 @@
import Foundation
extension Card {
enum Symbol: Int, CaseIterable, Comparable, Codable {
case ass = 1
case zehn = 2
case könig = 3
case ober = 4
case unter = 5
case neun = 6
case acht = 7
case sieben = 8
init?(id: Character) {
switch id {
case "A": self = .ass
case "Z": self = .zehn
case "K": self = .könig
case "O": self = .ober
case "U": self = .unter
case "9": self = .neun
case "8": self = .acht
case "7": self = .sieben
default:
return nil
}
}
var id: Character {
switch self {
case .ass: return "A"
case .zehn: return "Z"
case .könig: return "K"
case .ober: return "O"
case .unter: return "U"
case .neun: return "9"
case .acht: return "8"
case .sieben: return "7"
}
}
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
}
}
var isTrumpOrAce: Bool {
switch self {
case .ass, .ober, .unter:
return true
default:
return false
}
}
static func < (lhs: Card.Symbol, rhs: Card.Symbol) -> Bool {
lhs.rawValue < rhs.rawValue
}
}
}