cs193p-memorize/Memorize/MemoryGame.swift
Ching 189bfc0bb8 feat(view, viewmodel): 修改 veiwmodel 发送用户点击事件,修改 card 状态,完成 card match 逻辑
点击 card 修改 card.isFaceUp 属性,当两个 card.content 相同时,将 card 隐藏

Signed-off-by: Ching <loooching@gmail.com>
2023-02-12 20:55:45 +08:00

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
}
}