ПисањС ΠΈΠ³Ρ€Π΅ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΡΠΊΠΈΡ… ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° Ρƒ Π‘Π²ΠΈΡ„Ρ‚-Ρƒ

ПисањС ΠΈΠ³Ρ€Π΅ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΡΠΊΠΈΡ… ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° Ρƒ Π‘Π²ΠΈΡ„Ρ‚-Ρƒ

Овај Ρ‡Π»Π°Π½Π°ΠΊ ΠΎΠΏΠΈΡΡƒΡ˜Π΅ процСс ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ° Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Π΅ ΠΈΠ³Ρ€Π΅ Π·Π° ΠΎΠ±ΡƒΠΊΡƒ ΠΏΠ°ΠΌΡ›Π΅ΡšΠ° која ΠΌΠΈ сС заиста свиђа. Осим ΡˆΡ‚ΠΎ јС Π΄ΠΎΠ±Π°Ρ€ сам ΠΏΠΎ сСби, Π½Π°ΡƒΡ‡ΠΈΡ›Π΅Ρ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ вишС ΠΎ Π‘Π²ΠΈΡ„Ρ‚ класама ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΠΌΠ° Π΄ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ»Π°Π·ΠΈΠ»ΠΈ. Али ΠΏΡ€Π΅ Π½Π΅Π³ΠΎ ΡˆΡ‚ΠΎ ΠΏΠΎΡ‡Π½Π΅ΠΌΠΎ, Ρ…Π°Ρ˜Π΄Π΅ Π΄Π° Ρ€Π°Π·ΡƒΠΌΠ΅ΠΌΠΎ саму ΠΈΠ³Ρ€Ρƒ.

ΠŸΠΎΠ΄ΡΠ΅Ρ›Π°ΠΌΠΎ: Π·Π° свС Ρ‡ΠΈΡ‚Π°ΠΎΡ†Π΅ β€žΠ₯Π°Π±Ρ€Π°β€œ – попуст ΠΎΠ΄ 10 Ρ€ΡƒΠ±Π°Ρ™Π° ΠΏΡ€ΠΈ упису Π½Π° Π±ΠΈΠ»ΠΎ који курс Π‘ΠΊΠΈΠ»Π»Π±ΠΎΠΊ користСћи ΠΏΡ€ΠΎΠΌΠΎΡ‚ΠΈΠ²Π½ΠΈ ΠΊΠΎΠ΄ β€žΠ₯Π°Π±Ρ€β€œ.

Π‘ΠΊΠΈΠ»Π»Π±ΠΎΠΊ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΡƒΡ˜Π΅: ΠžΠ±Ρ€Π°Π·ΠΎΠ²Π½ΠΈ онлајн курс β€žΠŸΡ€ΠΎΡ„Π΅ΡΠΈΡ˜Π° Јава ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€β€œ.

Како ΠΈΠ³Ρ€Π°Ρ‚ΠΈ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΡΠΊΡƒ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ

Π˜Π³Ρ€Π° ΠΏΠΎΡ‡ΠΈΡšΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜ΠΎΠΌ сСта ΠΊΠ°Ρ€Π°Ρ‚Π°. Π›Π΅ΠΆΠ΅ Π»ΠΈΡ†Π΅ΠΌ Π½Π°Π΄ΠΎΠ»Π΅ (односно, слика Π½Π°Π΄ΠΎΠ»Π΅). Када ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° Π±ΠΈΠ»ΠΎ ΠΊΠΎΡ˜Ρƒ, слика сС ΠΎΡ‚Π²Π°Ρ€Π° Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ сСкунди.

Π—Π°Π΄Π°Ρ‚Π°ΠΊ ΠΈΠ³Ρ€Π°Ρ‡Π° јС Π΄Π° ΠΏΡ€ΠΎΠ½Π°Ρ’Π΅ свС ΠΊΠ°Ρ€Ρ‚Π΅ са истим сликама. Ако Π½Π°ΠΊΠΎΠ½ ΠΎΡ‚Π²Π°Ρ€Π°ΡšΠ° ΠΏΡ€Π²Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ ΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³Ρƒ ΠΈ сликС сС ΠΏΠΎΠΊΠ»ΠΎΠΏΠ΅, ΠΎΠ±Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ ΠΎΡΡ‚Π°Ρ˜Ρƒ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½Π΅. Ако сС Π½Π΅ ΠΏΠΎΠΊΠ»Π°ΠΏΠ°Ρ˜Ρƒ, ΠΊΠ°Ρ€Ρ‚Π΅ сС ΠΏΠΎΠ½ΠΎΠ²ΠΎ Π·Π°Ρ‚Π²Π°Ρ€Π°Ρ˜Ρƒ. Π¦ΠΈΡ™ јС Π΄Π° сС свС ΠΎΡ‚Π²ΠΎΡ€ΠΈ.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚Π°

Π”Π° бистС Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ ΠΎΠ²Π΅ ΠΈΠ³Ρ€Π΅, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π΅ су Π²Π°ΠΌ слСдСћС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅:

  • ЈСдан ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€: Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€.свифт.
  • ЈСдан ΠΏΠΎΠ³Π»Π΅Π΄: Π¦Π°Ρ€Π΄Π¦Π΅Π»Π».свифт.
  • Π”Π²Π° ΠΌΠΎΠ΄Π΅Π»Π°: ΠœΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅.свифт ΠΈ Π¦Π°Ρ€Π΄.свифт.
  • Маин.сторибоард ΠΊΠ°ΠΊΠΎ Π±ΠΈ сС осигурало Π΄Π° јС Ρ†Π΅ΠΎ скуп ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ доступан.

ΠŸΠΎΡ‡ΠΈΡšΠ΅ΠΌΠΎ са Π½Π°Ρ˜Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΈΡ˜ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ ΠΈΠ³Ρ€Π΅, ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠ°.

Π¦Π°Ρ€Π΄.свифт

МодСл ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ Ρ›Π΅ ΠΈΠΌΠ°Ρ‚ΠΈ Ρ‚Ρ€ΠΈ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π°: ΠΈΠ΄ Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ свакС ΠΎΠ΄ ΡšΠΈΡ…, ΠΏΡ€ΠΈΠΊΠ°Π·Π°Π½Ρƒ Π»ΠΎΠ³ΠΈΡ‡ΠΊΡƒ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Ρƒ која ΠΎΠ΄Ρ€Π΅Ρ’ΡƒΡ˜Π΅ статус ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ (скривСна ΠΈΠ»ΠΈ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½Π°) ΠΈ Π£Π Π› Π·Π° сликС Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π°ΠΌΠ°.

class Card {        
    var id: String    
    var shown: Bool = false    
    var artworkURL: UIImage!
}

Π’Π°ΠΊΠΎΡ’Π΅ Ρ›Π΅ Π²Π°ΠΌ Ρ‚Ρ€Π΅Π±Π°Ρ‚ΠΈ ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π΅ корисника са ΠΌΠ°ΠΏΠ°ΠΌΠ°:

ΠœΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° ΠΏΡ€ΠΈΠΊΠ°Π·ΠΈΠ²Π°ΡšΠ΅ сликС Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†ΠΈ. ОвдС смо рСсСтовали сва ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° Π½Π° ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½Π°. Π—Π° ΠΈΠ΄, Π³Π΅Π½Π΅Ρ€ΠΈΡˆΠ΅ΠΌΠΎ насумични Π˜Π” позивањСм НБУУИБ().ΡƒΡƒΠΈΠ΄Π‘Ρ‚Ρ€ΠΈΠ½Π³.

init(image: UIImage) {        
    self.id = NSUUID().uuidString        
    self.shown = false        
    self.artworkURL = image    
}

ΠœΠ΅Ρ‚ΠΎΠ΄ Π·Π° ΠΏΠΎΡ€Π΅Ρ’Π΅ΡšΠ΅ Π»ΠΈΡ‡Π½ΠΈΡ… ΠΊΠ°Ρ€Π°Ρ‚Π°.

func equals(_ card: Card) -> Bool {
    return (card.id == id)    
}

ΠœΠ΅Ρ‚ΠΎΠ΄ Π·Π° ΠΏΡ€Π°Π²Ρ™Π΅ΡšΠ΅ копијС свакС ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ – Π΄Π° Π±ΠΈ сС Π΄ΠΎΠ±ΠΈΠΎ Π²Π΅Ρ›ΠΈ Π±Ρ€ΠΎΡ˜ истовСтних. Овај ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ›Π΅ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ са сличним врСдностима.

func copy() -> Card {        
    return Card(card: self)    
}
 
init(card: Card) {        
    self.id = card.id        
    self.shown = card.shown        
    self.artworkURL = card.artworkURL    
}

И још јСдан ΠΌΠ΅Ρ‚ΠΎΠ΄ јС ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Π½ Π·Π° мСшањС ΠΊΠ°Ρ€Π°Ρ‚Π° Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΊΡƒ. НаправићСмо Π³Π° ΠΏΡ€ΠΎΡˆΠΈΡ€Π΅ΡšΠ΅ΠΌ класС Арраи.

extension Array {    
    mutating func shuffle() {        
        for _ in 0...self.count {            
            sort { (_,_) in arc4random() < arc4random() }        
        }   
    }
}

А Π΅Π²ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ ΠΊΠΎΠ΄Π° Π·Π° ΠΌΠΎΠ΄Π΅Π» ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ са свим ΡΠ²ΠΎΡ˜ΡΡ‚Π²ΠΈΠΌΠ° ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠ°.

class Card {
    
    var id: String
    var shown: Bool = false
    var artworkURL: UIImage!
    
    static var allCards = [Card]()
 
    init(card: Card) {
        self.id = card.id
        self.shown = card.shown
        self.artworkURL = card.artworkURL
    }
    
    init(image: UIImage) {
        self.id = NSUUID().uuidString
        self.shown = false
        self.artworkURL = image
    }
    
    func equals(_ card: Card) -> Bool {
        return (card.id == id)
    }
    
    func copy() -> Card {
        return Card(card: self)
    }
}
 
extension Array {
    mutating func shuffle() {
        for _ in 0...self.count {
            sort { (_,_) in arc4random() < arc4random() }
        }
    }
}

Π₯ајдС.

Π”Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄Π΅Π» јС ΠœΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅, ΠΎΠ²Π΄Π΅ постављамо ΠΌΡ€Π΅ΠΆΡƒ 4*4. МодСл Ρ›Π΅ ΠΈΠΌΠ°Ρ‚ΠΈ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ су ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ (Π½ΠΈΠ· ΠΊΠ°Ρ€Π°Ρ‚Π° Π½Π° ΠΌΡ€Π΅ΠΆΠΈ), Π½ΠΈΠ· цардсБховн са Π²Π΅Ρ› ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π°ΠΌΠ° ΠΈ Π»ΠΎΠ³ΠΈΡ‡ΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π° исПлаиинг Π·Π° ΠΏΡ€Π°Ρ›Π΅ΡšΠ΅ статуса ΠΈΠ³Ρ€Π΅.

class MemoryGame {        
    var cards:[Card] = [Card]()    
    var cardsShown:[Card] = [Card]()    
    var isPlaying: Bool = false
}

Π’Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° Ρ€Π°Π·Π²ΠΈΡ˜Π΅ΠΌΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π΅ корисника са ΠΌΡ€Π΅ΠΆΠΎΠΌ.

ΠœΠ΅Ρ‚ΠΎΠ΄Π° која мСша ΠΊΠ°Ρ€Ρ‚Π΅ Ρƒ ΠΌΡ€Π΅ΠΆΠΈ.

func shuffleCards(cards:[Card]) -> [Card] {       
    var randomCards = cards        
    randomCards.shuffle()                
 
    return randomCards    
}

ΠœΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π½ΠΎΠ²Π΅ ΠΈΠ³Ρ€Π΅. ОвдС ΠΏΠΎΠ·ΠΈΠ²Π°ΠΌΠΎ ΠΏΡ€Π²ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈ распорСд ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΡƒΡ˜Π΅ΠΌΠΎ исПлаиинг ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Ρƒ Π½Π° Ρ‚Ρ€ΡƒΠ΅.

func newGame(cardsArray:[Card]) -> [Card] {       
    cards = shuffleCards(cards: cardsArray)        
    isPlaying = true            
 
    return cards    
}

Ако ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ ΠΈΠ³Ρ€Ρƒ, Π·Π°Ρ‚ΠΈΠΌ постављамо ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Ρƒ исПлаиинг Π½Π° фалсС ΠΈ ΡƒΠΊΠ»Π°ΡšΠ°ΠΌΠΎ ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π°.

func restartGame() {        
    isPlaying = false                
    cards.removeAll()        
    cardsShown.removeAll()    
}

ΠœΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΠΈΡ… ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π°. Π’ΠΈΡˆΠ΅ ΠΎ ΡšΠ΅ΠΌΡƒ каснијС.

func cardAtIndex(_ index: Int) -> Card? {        
    if cards.count > index {            
        return cards[index]        
    } else {            
        return nil        
    }    
}

ΠœΠ΅Ρ‚ΠΎΠ΄Π° која Π²Ρ€Π°Ρ›Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Ρƒ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅.

func indexForCard(_ card: Card) -> Int? {        
    for index in 0...cards.count-1 {            
        if card === cards[index] {                
            return index            
        }      
    }
        
    return nil    
}

ΠŸΡ€ΠΎΠ²Π΅Ρ€Π° ΡƒΡΠ°Π³Π»Π°ΡˆΠ΅Π½ΠΎΡΡ‚ΠΈ ΠΈΠ·Π°Π±Ρ€Π°Π½Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ са стандардом.

func unmatchedCardShown() -> Bool {
    return cardsShown.count % 2 != 0
}

Овај ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‡ΠΈΡ‚Π° послСдњи Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Ρƒ Π½ΠΈΠ·Ρƒ **цардсБховн** ΠΈ Π²Ρ€Π°Ρ›Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ која сС Π½Π΅ ΠΏΠΎΠ΄ΡƒΠ΄Π°Ρ€Π°.

func didSelectCard(_ card: Card?) {        
    guard let card = card else { return }                
    
    if unmatchedCardShown() {            
        let unmatched = unmatchedCard()!                        
        
        if card.equals(unmatched) {          
            cardsShown.append(card)            
        } else {                
            let secondCard = cardsShown.removeLast()      
        }                    
    } else {            
        cardsShown.append(card)        
    }                
    
    if cardsShown.count == cards.count {            
        endGame()        
    }    
}

Маин.сторибоард ΠΈ Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€.свифт

Маин.сторибоард ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΎΡ‚ΠΏΡ€ΠΈΠ»ΠΈΠΊΠ΅ ΠΎΠ²Π°ΠΊΠΎ:

ПисањС ΠΈΠ³Ρ€Π΅ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΡΠΊΠΈΡ… ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° Ρƒ Π‘Π²ΠΈΡ„Ρ‚-Ρƒ

Π£ ΠΏΠΎΡ‡Π΅Ρ‚ΠΊΡƒ, ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° подСситС Π½ΠΎΠ²Ρƒ ΠΈΠ³Ρ€Ρƒ ΠΊΠ°ΠΎ Π²ΠΈΠ΅Π²Π”ΠΈΠ΄Π›ΠΎΠ°Π΄ Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Ρƒ, ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜ΡƒΡ›ΠΈ сликС Π·Π° ΠΌΡ€Π΅ΠΆΡƒ. Π£ ΠΈΠ³Ρ€ΠΈ, свС ΠΎΠ²ΠΎ Ρ›Π΅ Π±ΠΈΡ‚ΠΈ прСдстављСно 4*4 Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π². Ако још нистС ΡƒΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ са Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π²-ΠΎΠΌ, Π΅Π²ΠΎ Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ којС су Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π΅.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡΠ°Ρ›Π΅ΠΌΠΎ Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΊΠ°ΠΎ Ρ€ΠΎΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅. Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Ρ›Π΅ ΠΈΠΌΠ°Ρ‚ΠΈ Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π² који Ρ›Π΅ΠΌΠΎ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€Π°Ρ‚ΠΈ ΠΊΠ°ΠΎ Π˜Π‘ΠžΡƒΡ‚Π»Π΅Ρ‚. Π”Ρ€ΡƒΠ³Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†Π° јС Π½Π° Π΄ΡƒΠ³ΠΌΠ΅ Π˜Π‘ΠΡ†Ρ‚ΠΈΠΎΠ½ ΠΎΠ½Π‘Ρ‚Π°Ρ€Ρ‚Π“Π°ΠΌΠ΅(), ΠΎΠ²ΠΎ јС Π£Π˜Π‘ΡƒΡ‚Ρ‚ΠΎΠ½, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π° Π²ΠΈΠ΄Π΅Ρ‚ΠΈ Ρƒ сториборду ΠΏΠΎΠ΄ Π½Π°Π·ΠΈΠ²ΠΎΠΌ ΠŸΠ›ΠΠ˜.

Мало ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π°:

  • ΠŸΡ€Π²ΠΎ, ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΡƒΡ˜Π΅ΠΌΠΎ Π΄Π²Π° Π³Π»Π°Π²Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚Π° - ΠΌΡ€Π΅ΠΆΡƒ: ΠΈΠ³Ρ€Π° = ΠœΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅() ΠΈ скуп ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π°: ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ = [ΠšΠ°Ρ€Ρ‚ΠΈΡ†Π°]().
  • ΠŸΠΎΡ‡Π΅Ρ‚Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅ постављамо ΠΊΠ°ΠΎ Π²ΠΈΠ΅Π²Π”ΠΈΠ΄Π›ΠΎΠ°Π΄, ΠΎΠ²ΠΎ јС ΠΏΡ€Π²ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ који сС ΠΏΠΎΠ·ΠΈΠ²Π° Π΄ΠΎΠΊ ΠΈΠ³Ρ€Π° Ρ€Π°Π΄ΠΈ.
  • Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π² јС подСшСн Π½Π° скривСн Ρ˜Π΅Ρ€ су свС ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ скривСнС Π΄ΠΎΠΊ корисник Π½Π΅ притиснС ΠŸΠ›ΠΠ˜.
  • Π§ΠΈΠΌ притиснСмо ΠŸΠ›ΠΠ˜, ΠΏΠΎΡ‡ΠΈΡšΠ΅ ΠΎΠ½Π‘Ρ‚Π°Ρ€Ρ‚Π“Π°ΠΌΠ΅ Π˜Π‘ΠΡ†Ρ‚ΠΈΠΎΠ½ ΠΎΠ΄Π΅Ρ™Π°ΠΊ, Π° ΡΠ²ΠΎΡ˜ΡΡ‚Π²ΠΎ Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π² исΠ₯ΠΈΠ΄Π΄Π΅Π½ постављамо Π½Π° фалсС Ρ‚Π°ΠΊΠΎ Π΄Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ ΠΌΠΎΠ³Ρƒ Π΄Π° постану Π²ΠΈΠ΄Ρ™ΠΈΠ²Π΅.
  • Π‘Π²Π°ΠΊΠΈ ΠΏΡƒΡ‚ ΠΊΠ°Π΄Π° корисник ΠΈΠ·Π°Π±Π΅Ρ€Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ, ΠΏΠΎΠ·ΠΈΠ²Π° сС ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΈΠ΄Π‘Π΅Π»Π΅Ρ†Ρ‚Π˜Ρ‚Π΅ΠΌΠΡ‚. Π£ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΊΠΎΡ˜Ρƒ Π·ΠΎΠ²Π΅ΠΌΠΎ Π΄ΠΈΠ΄Π‘Π΅Π»Π΅Ρ†Ρ‚Π¦Π°Ρ€Π΄ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠΎ Π³Π»Π°Π²Π½Ρƒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ³Ρ€Π΅.

Π•Π²ΠΎ ΠΊΠΎΠ½Π°Ρ‡Π½Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€-Π°:

class GameController: UIViewController {
 
    @IBOutlet weak var collectionView: UICollectionView!
    
    let game = MemoryGame()
    var cards = [Card]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        game.delegate = self
        
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.isHidden = true
        
        APIClient.shared.getCardImages { (cardsArray, error) in
            if let _ = error {
                // show alert
            }
            
            self.cards = cardsArray!
            self.setupNewGame()
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        if game.isPlaying {
            resetGame()
        }
    }
    
    func setupNewGame() {
        cards = game.newGame(cardsArray: self.cards)
        collectionView.reloadData()
    }
    
    func resetGame() {
        game.restartGame()
        setupNewGame()
    }
    
    @IBAction func onStartGame(_ sender: Any) {
        collectionView.isHidden = false
    }
}
 
// MARK: - CollectionView Delegate Methods
extension GameController: UICollectionViewDelegate, UICollectionViewDataSource {
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cards.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! CardCell
        cell.showCard(false, animted: false)
        
        guard let card = game.cardAtIndex(indexPath.item) else { return cell }
        cell.card = card
        
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as! CardCell
        
        if cell.shown { return }
        game.didSelectCard(cell.card)
        
        collectionView.deselectItem(at: indexPath, animated:true)
    }
}

Π₯ајдС сада Π΄Π° ΠΏΡ€ΠΈΡ‡Π°ΠΌΠΎ ΠΌΠ°Π»ΠΎ ΠΎ Π²Π°ΠΆΠ½ΠΈΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΠΌΠ°.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ

Π Π°Π΄ са ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΠΌΠ° јС срТ Π‘Π²ΠΈΡ„Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ°. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ ΠΏΡ€ΡƒΠΆΠ°Ρ˜Ρƒ могућност Π΄Π΅Ρ„ΠΈΠ½ΠΈΡΠ°ΡšΠ° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° класу, структуру ΠΈΠ»ΠΈ Π½Π°Π±Ρ€Π°Ρ˜Π°ΡšΠ΅. Овај ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π°Ρ€Π½ΠΈ ΠΈ ΠΏΡ€ΠΎΡˆΠΈΡ€ΠΈΠ²ΠΈ ΠΊΠΎΠ΄. Π£ ствари, ΠΎΠ²ΠΎ јС ΠΎΠ±Ρ€Π°Π·Π°Ρ† који Π²Π΅Ρ› ΠΏΡ€ΠΈΠΌΠ΅ΡšΡƒΡ˜Π΅ΠΌΠΎ Π·Π° Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π² Ρƒ Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€-Ρƒ. Π₯ајдС сада Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ сопствСну Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ. Бинтакса Ρ›Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π°Ρ‚ΠΈ ΠΎΠ²Π°ΠΊΠΎ:

protocol MemoryGameProtocol {
    //protocol definition goes here
}

Π—Π½Π°ΠΌΠΎ Π΄Π° Π½Π°ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΠ΅ΠΌΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ»ΠΈ упутства Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ класС, ΠΏΠ° Ρ…Π°Ρ˜Π΄Π΅ Π΄Π° размислимо ΡˆΡ‚Π° Π±ΠΈ Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π΄Π° Π±ΡƒΠ΄Ρƒ. Π£ΠΊΡƒΠΏΠ½ΠΎ Π²Π°ΠΌ Ρ‚Ρ€Π΅Π±Π° Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ.

  • ΠŸΠΎΡ‡Π΅Ρ‚Π°ΠΊ ΠΈΠ³Ρ€Π΅: ΠΌΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅Π”ΠΈΠ΄Π‘Ρ‚Π°Ρ€Ρ‚.
  • ΠœΠΎΡ€Π°Ρ‚Π΅ Π΄Π° ΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ Π»ΠΈΡ†Π΅ΠΌ Π½Π°Π΄ΠΎΠ»Π΅: мСмориГамСБховЦардс.
  • ΠœΠΎΡ€Π°Ρ‚Π΅ Π΄Π° ΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ Π»ΠΈΡ†Π΅ΠΌ Π½Π°Π΄ΠΎΠ»Π΅: ΠΌΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅Π₯идСЦардс.
  • ΠšΡ€Π°Ρ˜ ΠΈΠ³Ρ€Π΅: ΠΌΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅Π”ΠΈΠ΄Π•Π½Π΄.

Π‘Π²Π΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ сС ΠΌΠΎΠ³Ρƒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚ΠΈ Π·Π° Π³Π»Π°Π²Π½Ρƒ класу, Π° Ρ‚ΠΎ јС Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€.

ΠΌΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅Π”ΠΈΠ΄Π‘Ρ‚Π°Ρ€Ρ‚

Када сС овај ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠΊΡ€Π΅Π½Π΅, ΠΈΠ³Ρ€Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΠΎΡ‡Π½Π΅ (корисник притиснС ΠŸΠ›ΠΠ˜). ОвдС Ρ›Π΅ΠΌΠΎ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΡƒΡ‡ΠΈΡ‚Π°Ρ‚ΠΈ ΡΠ°Π΄Ρ€ΠΆΠ°Ρ˜ позивањСм Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½Π’ΠΈΠ΅Π².Ρ€Π΅Π»ΠΎΠ°Π΄Π”Π°Ρ‚Π°(), који Ρ›Π΅ ΠΈΠ·ΠΌΠ΅ΡˆΠ°Ρ‚ΠΈ ΠΊΠ°Ρ€Ρ‚Π΅.

func memoryGameDidStart(_ game: MemoryGame) {
    collectionView.reloadData()
}

мСмориГамСБховЦардс

Овај ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ·ΠΈΠ²Π°ΠΌΠΎ ΠΈΠ· ΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΡ˜Π΅Π‘Π”Π’ΠΈΠ΅Π²Π‘Π΅Π»Π΅Ρ†Ρ‚Π˜Ρ‚Π΅ΠΌΠΡ‚. ΠŸΡ€Π²ΠΎ ΠΏΡ€ΠΈΠΊΠ°Π·ΡƒΡ˜Π΅ ΠΈΠ·Π°Π±Ρ€Π°Π½Ρƒ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Ρƒ. Π—Π°Ρ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π°Π²Π° Π΄Π° Π»ΠΈ ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ Π½Π΅ΡƒΠΏΠ°Ρ€Π΅Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° Ρƒ Π½ΠΈΠ·Ρƒ цардсБховн (Π°ΠΊΠΎ јС Π±Ρ€ΠΎΡ˜ цардсБховн Π½Π΅ΠΏΠ°Ρ€Π°Π½). Ако ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ, ΠΈΠ·Π°Π±Ρ€Π°Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° сС ΠΏΠΎΡ€Π΅Π΄ΠΈ са њом. Ако су сликС истС, ΠΎΠ±Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ сС Π΄ΠΎΠ΄Π°Ρ˜Ρƒ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ ΠΏΡ€ΠΈΠΊΠ°Π·Π°Π½Π΅ ΠΈ ΠΎΡΡ‚Π°Ρ˜Ρƒ ΠΎΠΊΡ€Π΅Π½ΡƒΡ‚Π΅ Π½Π°Π³ΠΎΡ€Π΅. Ако јС Π΄Ρ€ΡƒΠ³Π°Ρ‡ΠΈΡ˜Π΅, ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° оставља ΠΏΡ€ΠΈΠΊΠ°Π·Π°Π½Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ ΠΈ ΠΎΠ±Π΅ су ΠΎΠΊΡ€Π΅Π½ΡƒΡ‚Π΅ Π»ΠΈΡ†Π΅ΠΌ Π½Π°Π΄ΠΎΠ»Π΅.

ΠΌΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅Π₯идСЦардс

Ако сС ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π΅ Π½Π΅ ΠΏΠΎΠΊΠ»Π°ΠΏΠ°Ρ˜Ρƒ, ΠΏΠΎΠ·ΠΈΠ²Π° сС овај ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ сликС ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° су скривСнС.

ΠΏΡ€ΠΈΠΊΠ°Π·Π°Π½ΠΎ = Π½Π΅Ρ‚Π°Ρ‡Π½ΠΎ.

ΠΌΠ΅ΠΌΠΎΡ€ΠΈΠ“Π°ΠΌΠ΅Π”ΠΈΠ΄Π•Π½Π΄

Када сС ΠΏΠΎΠ·ΠΎΠ²Π΅ овај ΠΌΠ΅Ρ‚ΠΎΠ΄, Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π° су свС ΠΊΠ°Ρ€Ρ‚Π΅ Π²Π΅Ρ› ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π΅Π½Π΅ ΠΈ Π΄Π° сС Π½Π°Π»Π°Π·Π΅ Π½Π° листи цардсБховн: цардсБховн.Ρ†ΠΎΡƒΠ½Ρ‚ = цардс.Ρ†ΠΎΡƒΠ½Ρ‚, Ρ‚Π°ΠΊΠΎ Π΄Π° јС ΠΈΠ³Ρ€Π° Π·Π°Π²Ρ€ΡˆΠ΅Π½Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ сС посСбно ΠΏΠΎΠ·ΠΈΠ²Π° Π½Π°ΠΊΠΎΠ½ ΡˆΡ‚ΠΎ смо ΠΏΠΎΠ·Π²Π°Π»ΠΈ Π΅Π½Π΄Π“Π°ΠΌΠ΅() Π΄Π° поставимо исПлаиинг Π²Π°Ρ€ Π½Π° фалсС, Π½Π°ΠΊΠΎΠ½ Ρ‡Π΅Π³Π° сС ΠΏΡ€ΠΈΠΊΠ°Π·ΡƒΡ˜Π΅ ΠΏΠΎΡ€ΡƒΠΊΠ° ΠΎ Π·Π°Π²Ρ€ΡˆΠ΅Ρ‚ΠΊΡƒ ΠΈΠ³Ρ€Π΅. Π’Π°ΠΊΠΎΡ’Π΅ Π°Π»Π΅Ρ€Ρ‚Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ сС користи ΠΊΠ°ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€. виСвДидДисаппСар сС ΠΏΠΎΠ·ΠΈΠ²Π° ΠΈ ΠΈΠ³Ρ€Π° сС Ρ€Π΅ΡΠ΅Ρ‚ΡƒΡ˜Π΅.

Π•Π²ΠΎ ΠΊΠ°ΠΊΠΎ свС Ρ‚ΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° Ρƒ Π“Π°ΠΌΠ΅Π¦ΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€-Ρƒ:

extension GameController: MemoryGameProtocol {
    func memoryGameDidStart(_ game: MemoryGame) {
        collectionView.reloadData()
    }
 
 
    func memoryGame(_ game: MemoryGame, showCards cards: [Card]) {
        for card in cards {
            guard let index = game.indexForCard(card)
                else { continue
            }        
            
            let cell = collectionView.cellForItem(
                at: IndexPath(item: index, section:0)
            ) as! CardCell
 
            cell.showCard(true, animted: true)
        }
    }
 
    func memoryGame(_ game: MemoryGame, hideCards cards: [Card]) {
        for card in cards {
            guard let index = game.indexForCard(card)
                else { continue
            }
            
            let cell = collectionView.cellForItem(
                at: IndexPath(item: index, section:0)
            ) as! CardCell
    
            cell.showCard(false, animted: true)
        }
    }
 
    func memoryGameDidEnd(_ game: MemoryGame) {
        let alertController = UIAlertController(
            title: defaultAlertTitle,
            message: defaultAlertMessage,
            preferredStyle: .alert
        )
 
        let cancelAction = UIAlertAction(
            title: "Nah", style: .cancel) {
            [weak self] (action) in
            self?.collectionView.isHidden = true
        }
 
        let playAgainAction = UIAlertAction(
            title: "Dale!", style: .default) {
            [weak self] (action) in
            self?.collectionView.isHidden = true
 
            self?.resetGame()
        }
 
        alertController.addAction(cancelAction)
        alertController.addAction(playAgainAction)
        
        self.present(alertController, animated: true) { }
    
        resetGame()
    }
}

ПисањС ΠΈΠ³Ρ€Π΅ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΡΠΊΠΈΡ… ΠΊΠ°Ρ€Ρ‚ΠΈΡ†Π° Ρƒ Π‘Π²ΠΈΡ„Ρ‚-Ρƒ
Π£ ствари, Ρ‚ΠΎ јС свС. ΠœΠΎΠΆΠ΅Ρ‚Π΅ користити овај ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ сопствСну Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ ΠΈΠ³Ρ€Π΅.

Π‘Ρ€Π΅Ρ›Π½ΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅!

Π‘ΠΊΠΈΠ»Π»Π±ΠΎΠΊ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΡƒΡ˜Π΅:

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€