Ваш вопрос довольно широкий, но я бы посоветовал вам начать с создания соответствующих структур данных, представляющих колоду карт. Что-то вроде:
struct Deck {
enum Suite: String {
case clubs = "Clubs"
case diamonds = "Diamonds"
case hearts = "Hearts"
case spades = "Spades"
}
struct Rank {
let name: String
let faceValue: Int
let rankValue: Int
}
private var allSuites:[Suite] = [.clubs,.diamonds,.hearts,.spades]
private var allRanks = [Rank(name: "Ace", faceValue: 1,rankValue:13), Rank(name: "Two", faceValue: 2,rankValue: 1),Rank(name: "Three", faceValue: 3,rankValue: 2),Rank(name: "Four", faceValue: 4,rankValue:3 ),Rank(name: "Five", faceValue: 5,rankValue: 4),Rank(name: "Six", faceValue: 6,rankValue: 5),Rank(name: "Seven", faceValue: 7,rankValue: 6),Rank(name: "Eight", faceValue: 8,rankValue: 7),Rank(name: "Nine", faceValue: 9,rankValue: 8),Rank(name: "Ten", faceValue: 10,rankValue: 9),Rank(name: "Jack", faceValue: 10,rankValue: 10),Rank(name: "Queen", faceValue: 10,rankValue: 11),Rank(name: "King", faceValue: 10,rankValue: 12) ]
private let cards: [Card]
private var availableCards: [Card]
init() {
var cards = [Card]()
for suite in allSuites {
for rank in allRanks {
cards.append(Card(suite: suite, rank: rank))
}
}
self.cards = cards
self.availableCards = cards
}
mutating public func shuffle() {
self.availableCards = self.cards.shuffled()
}
mutating public func drawCard() -> Card? {
if let card = self.availableCards.first {
self.availableCards.removeFirst()
return card
} else {
return nil
}
}
var top: Card? {
get {
return availableCards.first
}
}
var remaining: Int {
get {
return availableCards.count
}
}
}
struct Card: Comparable, CustomDebugStringConvertible {
let suite: Deck.Suite
let rank: Deck.Rank
var image: UIImage {
get {
let imageName = "\(rank.name)\(suite.rawValue)"
return UIImage(named: imageName) ?? UIImage()
}
}
static func == (lhs: Card, rhs: Card) -> Bool {
return lhs.rank.faceValue == rhs.rank.faceValue && lhs.suite == rhs.suite
}
static func < (lhs: Card, rhs: Card) -> Bool {
return lhs.rank.rankValue < rhs.rank.rankValue
}
var debugDescription: String {
return "\(self.rank.name) of \(self.suite.rawValue)"
}
}
Тогда вы можете использовать его следующим образом:
var deck = Deck()
print(deck.top ?? "Empty")
deck.shuffle()
print(deck.top ?? "Empty")
while let card = deck.drawCard() {
print(card)
}
deck.shuffle()
if let first = deck.drawCard(), second = deck.drawCard() {
if first > second {
print("\(first) is higher than \(second)")
} else if first < second {
print("\(first) is lower than \(second)")
} else {
print("\(first) is the same value as \(second)")
}