点击 card 修改 card.isFaceUp 属性,当两个 card.content 相同时,将 card 隐藏 Signed-off-by: Ching <loooching@gmail.com>
61 lines
1.9 KiB
Swift
61 lines
1.9 KiB
Swift
//
|
|
// MemoryGame.swift
|
|
// Memorize
|
|
//
|
|
// Created by ching on 2023/2/12.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// model
|
|
struct MemoryGame<CardContent> where CardContent: Equatable {
|
|
private(set) var cards: [Card]
|
|
private var indexOfTheOneAndOnlyFaceUpCard: Int?
|
|
|
|
mutating func choose(_ card: Card) {
|
|
if let chosenIndex = cards.firstIndex(where: { $0.id == card.id }), !cards[chosenIndex].isFaceUp, !cards[chosenIndex].isMatched {
|
|
if let potentialMatchIndex = indexOfTheOneAndOnlyFaceUpCard {
|
|
if cards[chosenIndex].content == cards[potentialMatchIndex].content {
|
|
cards[chosenIndex].isMatched = true
|
|
cards[potentialMatchIndex].isMatched = true
|
|
}
|
|
indexOfTheOneAndOnlyFaceUpCard = nil
|
|
} else {
|
|
for index in cards.indices {
|
|
if cards[index].isFaceUp {
|
|
cards[index].isFaceUp.toggle()
|
|
}
|
|
}
|
|
indexOfTheOneAndOnlyFaceUpCard = chosenIndex
|
|
}
|
|
cards[chosenIndex].isFaceUp.toggle()
|
|
}
|
|
}
|
|
|
|
func index(of card: Card) -> Int? {
|
|
for index in 0 ..< cards.count {
|
|
if cards[index].id == card.id {
|
|
return index
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
init(numberOfPairsOfCards: Int, createCardContent: (Int) -> CardContent) {
|
|
cards = [Card]()
|
|
//
|
|
for pairIndex in 0 ..< numberOfPairsOfCards {
|
|
let content: CardContent = createCardContent(pairIndex)
|
|
cards.append(Card(content: content, id: pairIndex * 2))
|
|
cards.append(Card(content: content, id: pairIndex * 2 + 1))
|
|
}
|
|
}
|
|
|
|
struct Card: Identifiable {
|
|
var isFaceUp: Bool = false
|
|
var isMatched: Bool = false
|
|
var content: CardContent
|
|
var id: Int
|
|
}
|
|
}
|