// // MemoryGame.swift // Memorize // // Created by ching on 2023/2/12. // import Foundation // model struct MemoryGame 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 } }