ΠΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° Π³ΠΎ ΠΎΠΏΠΈΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° ΠΈΠ³ΡΠ° Π·Π° ΠΎΠ±ΡΠΊΠ° Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° ΠΊΠΎΡΠ° Π½Π°Π²ΠΈΡΡΠΈΠ½Π° ΠΌΠΈ ΡΠ΅ Π΄ΠΎΠΏΠ°ΡΠ°. ΠΡΠ²Π΅Π½ ΡΡΠΎ Π΅ Π΄ΠΎΠ±ΡΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅, ΡΠ΅ Π½Π°ΡΡΠΈΡΠ΅ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠ°ΡΠΎΠ²ΠΈΡΠ΅ ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠ΅ Π½Π° Swift Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΎΠ΄ΠΈΡΠ΅. ΠΠΎ, ΠΏΡΠ΅Π΄ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌΠ΅, Π΄Π° ΡΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΠ΅ ΡΠ°ΠΌΠ°ΡΠ° ΠΈΠ³ΡΠ°.
ΠΠΎΡΡΠ΅ΡΡΠ²Π°ΠΌΠ΅: Π·Π° ΡΠΈΡΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° βΠ₯Π°Π±Ρβ - ΠΏΠΎΠΏΡΡΡ ΠΎΠ΄ 10 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΠΊΡΡΡ Skillbox ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΏΡΠΎΠΌΠΎΡΠΈΠ²Π½ΠΈΠΎΡ ΠΊΠΎΠ΄ βΠ₯Π°Π±Ρβ.
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΡΠ²Π°: ΠΠ΄ΡΠΊΠ°ΡΠΈΠ²Π΅Π½ ΠΎΠ½Π»Π°ΡΠ½ ΠΊΡΡΡ
βΠΡΠΎΡΠ΅ΡΠΈΡΠ° Java ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Ρβ .
ΠΠ°ΠΊΠΎ Π΄Π° ΠΈΠ³ΡΠ°ΡΠ΅ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠΊΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°
ΠΠ³ΡΠ°ΡΠ° Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π° ΡΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡΠ° Π½Π° ΡΠ΅Ρ Π½Π° ΠΊΠ°ΡΡΠΈ. Π’ΠΈΠ΅ Π»Π΅ΠΆΠ°Ρ ΡΠΎ Π»ΠΈΡΠ΅ΡΠΎ Π½Π°Π΄ΠΎΠ»Ρ (ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ, ΡΠ»ΠΈΠΊΠ°ΡΠ° Π½Π°Π΄ΠΎΠ»Ρ). ΠΠΎΠ³Π° ΡΠ΅ ΠΊΠ»ΠΈΠΊΠ½Π΅ΡΠ΅ Π½Π° ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ, ΡΠ»ΠΈΠΊΠ°ΡΠ° ΡΠ΅ ΠΎΡΠ²ΠΎΡΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π½Π° ΠΈΠ³ΡΠ°ΡΠΎΡ Π΅ Π΄Π° Π³ΠΈ ΠΏΡΠΎΠ½Π°ΡΠ΄Π΅ ΡΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈ ΡΠΎ ΠΈΡΡΠΈ ΡΠ»ΠΈΠΊΠΈ. ΠΠΊΠΎ, ΠΏΠΎ ΠΎΡΠ²ΠΎΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠ²Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°, ΡΠ° ΠΏΡΠ΅Π²ΡΡΠΈΡΠ΅ Π²ΡΠΎΡΠ°ΡΠ° ΠΈ ΡΠ»ΠΈΠΊΠΈΡΠ΅ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°Π°Ρ, Π΄Π²Π΅ΡΠ΅ ΠΊΠ°ΡΡΠΈ ΠΎΡΡΠ°Π½ΡΠ²Π°Π°Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈ. ΠΠΎΠΊΠΎΠ»ΠΊΡ Π½Π΅ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°Π°Ρ, ΠΊΠ°ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅ Π·Π°ΡΠ²ΠΎΡΠ°Π°Ρ. Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈ ΡΠ΅.
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ
ΠΠ° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΎΠ²Π°Π° ΠΈΠ³ΡΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π²ΠΈ ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΠ²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ:
- ΠΠ΄Π΅Π½ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ: GameController.swift.
- ΠΠ΄Π΅Π½ ΠΏΠΎΠ³Π»Π΅Π΄: CardCell.swift.
- ΠΠ²Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ: MemoryGame.swift ΠΈ Card.swift.
- Main.storyboard Π·Π° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠ° Π΄Π΅ΠΊΠ° ΡΠ΅Π»ΠΈΠΎΡ ΡΠ΅Ρ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½.
ΠΠ°ΠΏΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΡΠΎ Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π°ΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½Π° ΠΈΠ³ΡΠ°ΡΠ°, ΠΊΠ°ΡΡΠΈΡΠ΅.
ΠΠ°ΡΡΠΈΡΠΊΠ°.ΡΠ²ΠΈΡΡ
ΠΠΎΠ΄Π΅Π»ΠΎΡ Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° ΡΠ΅ ΠΈΠΌΠ° ΡΡΠΈ ΡΠ²ΠΎΡΡΡΠ²Π°: id Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΎΠ΄ Π½ΠΈΠ², Π±ΡΠ»ΠΎΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½Π° Π·Π° ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ°ΡΡΡΠΎΡ Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° (ΡΠΊΡΠΈΠ΅Π½Π° ΠΈΠ»ΠΈ ΠΎΡΠ²ΠΎΡΠ΅Π½Π°) ΠΈ artworkURL Π·Π° ΡΠ»ΠΈΠΊΠΈΡΠ΅ Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠΈΡΠ΅.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
ΠΠ΅ Π²ΠΈ ΡΡΠ΅Π±Π°Π°Ρ ΠΈ ΠΎΠ²ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π΄Π° ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ ΡΠΎ ΠΌΠ°ΠΏΠΈΡΠ΅:
ΠΠ°ΡΠΈΠ½ Π·Π° ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠ° Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠ°. ΠΠ²Π΄Π΅ Π³ΠΈ ΡΠ΅ΡΠ΅ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΠ΅ ΡΠ²ΠΎΡΡΡΠ²Π° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ. ΠΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ°, Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ»ΡΡΠ°Π΅Π½ id ΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° NSUUIS().uuidString.
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
}
Π ΡΡΡΠ΅ Π΅Π΄Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π΅ ΠΏΠΎΡΡΠ΅Π±Π΅Π½ Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ°Π°Ρ ΠΊΠ°ΡΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ. ΠΠ΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΠ°ΡΠ° Array.
extension Array {
mutating func shuffle() {
for _ in 0...self.count {
sort { (_,_) in arc4random() < arc4random() }
}
}
}
Π ΡΡΠΊΠ° Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π·Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Card ΡΠΎ ΡΠΈΡΠ΅ ΡΠ²ΠΎΡΡΡΠ²Π° ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.
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() }
}
}
}
ΠΠ΄ΠΈ Π½Π°ΠΏΡΠ΅Π΄.
ΠΡΠΎΡΠΈΠΎΡ ΠΌΠΎΠ΄Π΅Π» Π΅ MemoryGame, ΡΡΠΊΠ° ΠΏΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ° 4*4. ΠΠΎΠ΄Π΅Π»ΠΎΡ ΡΠ΅ ΠΈΠΌΠ° ΡΠ²ΠΎΡΡΡΠ²Π° ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ (Π½ΠΈΠ·Π° ΠΎΠ΄ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ Π½Π° ΠΌΡΠ΅ΠΆΠ°), Π½ΠΈΠ·Π° ΠΎΠ΄ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ ΡΠΎ Π²Π΅ΡΠ΅ ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΠΈ Π±ΡΠ»ΠΎΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° isPlaying Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π½Π° ΡΡΠ°ΡΡΡΠΎΡ Π½Π° ΠΈΠ³ΡΠ°ΡΠ°.
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
}
ΠΠ°ΡΠΈΠ½ Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ²Π° ΠΈΠ³ΡΠ°. ΠΠ²Π΄Π΅ Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ²ΠΈΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠ½ΠΈΠΎΡ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ ΠΈ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° isPlaying Π²ΠΎ ΡΠΎΡΠ½ΠΎ.
func newGame(cardsArray:[Card]) -> [Card] {
cards = shuffleCards(cards: cardsArray)
isPlaying = true
return cards
}
ΠΠΊΠΎ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈΠ³ΡΠ°ΡΠ°, ΠΏΠΎΡΠΎΠ° ΡΠ° ΠΏΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° isPlaying Π½Π° false ΠΈ Π³ΠΎ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΡΠ΅ΡΠ½ΠΈΠΎΡ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠΈΡΠ΅.
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
}
ΠΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π³ΠΎ ΡΠΈΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π²ΠΎ Π½ΠΈΠ·Π°ΡΠ° **cardsShown** ΠΈ ΡΠ° Π²ΡΠ°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° ΡΡΠΎ Π½Π΅ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°.
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()
}
}
Main.storyboard ΠΈ GameController.swift
Main.storyboard ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
ΠΡΠ²ΠΈΡΠ½ΠΎ, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π½ΠΎΠ²Π°ΡΠ° ΠΈΠ³ΡΠ° ΠΊΠ°ΠΊΠΎ viewDidLoad Π²ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠΎΡ, Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ Π³ΠΈ ΠΈ ΡΠ»ΠΈΠΊΠΈΡΠ΅ Π·Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°. ΠΠΎ ΠΈΠ³ΡΠ°ΡΠ°, ΡΠ΅ΡΠΎ ΠΎΠ²Π° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½ΠΎ ΡΠΎ 4*4 collectionView. ΠΠΊΠΎ ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Π½ΠΈ ΡΠΎ collectionView, Π΅Π²Π΅ Π³ΠΎ
ΠΠ΅ Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ GameController ΠΊΠ°ΠΊΠΎ root ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°. GameController ΡΠ΅ ΠΈΠΌΠ° collectionView ΠΊΠΎΡ ΡΠ΅ Π³ΠΎ ΡΠ΅ΡΠ΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ IBOoutlet. ΠΡΡΠ³Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ° Π΅ Π½Π° ΠΊΠΎΠΏΡΠ΅ΡΠΎ IBAction onStartGame(), ΠΎΠ²Π° Π΅ UIButton, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅ Π²ΠΎ ΠΏΡΠΈΠΊΠ°Π·Π½Π°ΡΠ° Π½Π°ΡΠ΅ΡΠ΅Π½Π° PLAY.
ΠΠ°Π»ΠΊΡ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΎΡΠΈΡΠ΅:
- ΠΡΠ²ΠΎ, Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄Π²Π° Π³Π»Π°Π²Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΈ - ΠΌΡΠ΅ΠΆΠ°ΡΠ°: ΠΈΠ³ΡΠ° = MemoryGame(), ΠΈ Π·Π±ΠΈΡ Π½Π° ΠΊΠ°ΡΡΠΈ: ΠΊΠ°ΡΡΠΈ = [Card]().
- ΠΠΎΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π³ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ viewDidLoad, ΠΎΠ²Π° Π΅ ΠΏΡΠ²ΠΈΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠΎ ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ°Π±ΠΎΡΠΈ ΠΈΠ³ΡΠ°ΡΠ°.
- collectionView Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ Π½Π° ΡΠΊΡΠΈΠ΅Π½ Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΡΠ΅ ΡΠΊΡΠΈΠ΅Π½ΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π½Π΅ ΠΏΡΠΈΡΠΈΡΠ½Π΅ PLAY.
- ΠΠ΅Π΄Π½Π°Ρ ΡΡΠΎΠΌ ΡΠ΅ ΠΏΡΠΈΡΠΈΡΠ½Π΅ΠΌΠ΅ PLAY, Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π° Π΄Π΅Π»ΠΎΡ onStartGame IBAction ΠΈ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΡΠ²ΠΎΡΡΡΠ²ΠΎΡΠΎ collectionView isHidden Π½Π° false Π·Π° Π΄Π° ΠΌΠΎΠΆΠ°Ρ ΠΊΠ°ΡΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π° ΡΡΠ°Π½Π°Ρ Π²ΠΈΠ΄Π»ΠΈΠ²ΠΈ.
- Π‘Π΅ΠΊΠΎΡ ΠΏΠ°Ρ ΠΊΠΎΠ³Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΈΠ·Π±ΠΈΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°, ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ didSelectItemAt. ΠΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ ΡΡΠΎ Π³ΠΎ Π½Π°ΡΠ΅ΠΊΡΠ²Π°ΠΌΠ΅ didSelectCard Π·Π° Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° Π³Π»Π°Π²Π½Π°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° ΠΈΠ³ΡΠ°ΡΠ°.
ΠΠ²Π΅ ΡΠ° ΠΊΠΎΠ½Π΅ΡΠ½Π°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° GameController:
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)
}
}
Π‘Π΅Π³Π° Π΄Π° ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠ°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΡ Π·Π° Π²Π°ΠΆΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ.
ΠΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ
Π Π°Π±ΠΎΡΠ°ΡΠ° ΡΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π΅ ΡΠ°Π΄ΡΠΎΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Swift. ΠΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΊΠ»Π°ΡΠ°, ΡΡΡΡΠΊΡΡΡΠ° ΠΈΠ»ΠΈ Π½Π°Π±ΡΠΎΡΡΠ²Π°ΡΠ΅. ΠΠ²ΠΎΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Π°ΡΠ΅Π½ ΠΈ ΠΏΡΠΎΡΠΈΡΠ»ΠΈΠ² ΠΊΠΎΠ΄. ΠΡΡΡΠ½ΠΎΡΡ, ΠΎΠ²Π° Π΅ ΡΠ΅ΠΌΠ° ΡΡΠΎ Π²Π΅ΡΠ΅ ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ Π·Π° collectionView Π²ΠΎ GameController. Π‘Π΅Π³Π° Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠ²ΠΎΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ°. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
protocol MemoryGameProtocol {
//protocol definition goes here
}
ΠΠ½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈΠ»ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΊΠ»Π°ΡΠ°, ΠΏΠ° Π°ΡΠ΄Π΅ Π΄Π° ΡΠ°Π·ΠΌΠΈΡΠ»ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ. ΠΠΈ ΡΡΠ΅Π±Π°Π°Ρ Π²ΠΊΡΠΏΠ½ΠΎ ΡΠ΅ΡΠΈΡΠΈ.
- ΠΠΎΡΠ΅ΡΠΎΠΊ Π½Π° ΠΈΠ³ΡΠ°ΡΠ°: memoryGameDidStart.
- Π’ΡΠ΅Π±Π° Π΄Π° ΡΠ° ΡΠ²ΡΡΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° ΡΠΎ Π»ΠΈΡΠ΅ΡΠΎ Π½Π°Π΄ΠΎΠ»Ρ: memoryGameShowCards.
- Π’ΡΠ΅Π±Π° Π΄Π° ΡΠ° ΡΠ²ΡΡΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° ΡΠΎ Π»ΠΈΡΠ΅ΡΠΎ Π½Π°Π΄ΠΎΠ»Ρ: memoryGameHideCards.
- ΠΡΠ°Ρ Π½Π° ΠΈΠ³ΡΠ°ΡΠ°: memoryGameDidEnd.
Π‘ΠΈΡΠ΅ ΡΠ΅ΡΠΈΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π°Ρ Π·Π° Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ»Π°ΡΠ°, ΠΊΠΎΡΠ° Π΅ GameController.
memoryGameDidStart
ΠΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ ΠΎΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΠΈΠ³ΡΠ°ΡΠ° ΡΡΠ΅Π±Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ (ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΏΡΠΈΡΠΈΡΠΊΠ° PLAY). ΠΠ²Π΄Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ ΡΠ° Π²ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° ΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° collectionView.reloadData(), ΡΡΠΎ ΡΠ΅ Π³ΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠΈΡΠ΅.
func memoryGameDidStart(_ game: MemoryGame) {
collectionView.reloadData()
}
MemoryGameShowCards
ΠΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π³ΠΎ Π½Π°ΡΠ΅ΠΊΡΠ²Π°ΠΌΠ΅ ΠΎΠ΄ collectionSDViewSelectItemAt. ΠΡΠ²ΠΎ ΡΠ° ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΠΈΠ·Π±ΡΠ°Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°. ΠΠΎΡΠΎΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π΄Π°Π»ΠΈ ΠΈΠΌΠ° Π½Π΅ΡΠΏΠΎΡΠ΅Π΄Π»ΠΈΠ²Π° ΠΊΠ°ΡΡΠΈΡΠΊΠ° Π²ΠΎ Π½ΠΈΠ·Π°ΡΠ° cardsShown (Π°ΠΊΠΎ Π±ΡΠΎΡΠΎΡ Π½Π° cardsShown Π΅ Π½Π΅ΠΏΠ°ΡΠ΅Π½). ΠΠΎΠΊΠΎΠ»ΠΊΡ ΠΏΠΎΡΡΠΎΠΈ, ΠΈΠ·Π±ΡΠ°Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ° ΡΠ΅ ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π° ΡΠΎ Π½Π΅Π°. ΠΠΊΠΎ ΡΠ»ΠΈΠΊΠΈΡΠ΅ ΡΠ΅ ΠΈΡΡΠΈ, Π΄Π²Π΅ΡΠ΅ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΠΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ ΠΈ ΠΎΡΡΠ°Π½ΡΠ²Π°Π°Ρ ΡΠ²ΡΡΠ΅Π½ΠΈ Π½Π°Π³ΠΎΡΠ΅. ΠΠΊΠΎ Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ, ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° ΠΎΡΡΠ°Π²Π° ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΠΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΠ΅ ΡΠ²ΡΡΠ΅Π½ΠΈ ΡΠΎ Π»ΠΈΡΠ΅ΡΠΎ Π½Π°Π΄ΠΎΠ»Ρ.
MemoryGameHideCards
ΠΠΊΠΎ ΠΊΠ°ΡΡΠΈΡΠΊΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°Π°Ρ, ΠΎΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° ΠΈ ΡΠ»ΠΈΠΊΠΈΡΠ΅ Π½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠ°ΡΠ° ΡΠ΅ ΡΠΎΠΊΡΠΈΠ΅Π½ΠΈ.
ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ = Π½Π΅ΡΠΎΡΠ½ΠΎ.
memoryGameDidEnd
ΠΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ° ΠΎΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΠΎΠ° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈ ΡΠ΅ Π²Π΅ΡΠ΅ ΠΎΡΠΊΡΠΈΠ΅Π½ΠΈ ΠΈ ΡΠ΅ Π½Π°ΠΎΡΠ°Π°Ρ Π²ΠΎ ΡΠΏΠΈΡΠΎΠΊΠΎΡ cardsShown: cardsShown.count = cards.count, ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΈΠ³ΡΠ°ΡΠ° Π΅ Π·Π°Π²ΡΡΠ΅Π½Π°. ΠΠ΅ΡΠΎΠ΄ΠΎΡ ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΎΡΠΊΠ°ΠΊΠΎ ΡΠ° ΠΏΠΎΠ²ΠΈΠΊΠ°Π²ΠΌΠ΅ endGame() Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ isPlaying var Π½Π° false, ΠΏΠΎ ΡΡΠΎ ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ° Π·Π° ΠΊΡΠ°Ρ Π½Π° ΠΈΠ³ΡΠ°ΡΠ°. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, alertController ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠ°ΠΊΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΎΡΠΎΡ. Π‘Π΅ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° viewDidDisappear ΠΈ ΠΈΠ³ΡΠ°ΡΠ° ΡΠ΅ ΡΠ΅ΡΠ΅ΡΠΈΡΠ°.
ΠΠ²Π΅ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΠ΅ΡΠΎ ΡΠΎΠ° Π²ΠΎ GameController:
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()
}
}
ΠΡΡΡΠ½ΠΎΡΡ, ΡΠΎΠ° Π΅ ΡΓ¨. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠ²ΠΎΡΠ° ΡΠΎΠΏΡΡΠ²Π΅Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΈΠ³ΡΠ°ΡΠ°.
Π‘ΡΠ΅ΡΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅!
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΡΠ²Π°:
- ΠΡΠ°ΠΊΡΠΈΡΠ΅Π½ ΠΊΡΡΡ
βΠΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈβ .- ΠΡΠΈΠΌΠ΅Π½Π΅Ρ ΠΎΠ½Π»Π°ΡΠ½ ΠΊΡΡΡ
βΠΠ°ΡΡΠΎΠ½ Π°Π½Π°Π»ΠΈΡΠΈΡΠ°Ρ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈβ .- ΠΠ²Π΅Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅Π½ ΠΊΡΡΡ
βΠΠ°Ρ ΡΡΠΌ PRO Π²Π΅Π±-ΡΠ°Π·Π²ΠΈΠ²Π°Ρβ .
ΠΠ·Π²ΠΎΡ: www.habr.com