
рдпрд╣ рд▓реЗрдЦ рдПрдХ рд╕рд░рд▓ рдореЗрдореЛрд░реА рдЯреНрд░реЗрдирд┐рдВрдЧ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рд╣реИред рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рд╕реНрд╡рд┐рдлреНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрд╛рдиреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╢реБрд░реВ рдХрд░реЗрдВ, рдЪрд▓реЛ рдЦреЗрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрдВред
рд╣рдо рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░реЛрдореЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп 10,000 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рдСрди-рд▓рд╛рдЗрди рд╢реИрдХреНрд╖рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рдкреНрд░реЛрдлреЗрд╢рди рдЬрд╛рд╡рд╛-рдбреЗрд╡рд▓рдкрд░" ред
рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреИрд╕реЗ рдЦреЗрд▓реЗрдВ
рдЦреЗрд▓ рддрд╛рд╢ рдХреЗ рдкрддреНрддреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╡реЗ "рд╢рд░реНрдЯ" рдКрдкрд░ (рдХреНрд░рдорд╢рдГ, рдиреАрдЪреЗ рдЪреЗрд╣рд░рд╛) рдЭреВрда рдмреЛрд▓рддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЫрд╡рд┐ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЦреБрд▓рддреА рд╣реИред
рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдХрд╛рд░реНрдп рд╕рднреА рдХрд╛рд░реНрдбреЛрдВ рдХреЛ рд╕рдорд╛рди рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдвреВрдВрдврдирд╛ рд╣реИред рдпрджрд┐ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдб рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рджреВрд╕рд░реЗ рдФрд░ рдЪрд┐рддреНрд░реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдб рдЦреБрд▓реЗ рд░рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдб рдлрд┐рд░ рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдп рд╕рдм рдХреБрдЫ рдЦреЛрд▓рдирд╛ рд╣реИред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛
рдЗрд╕ рдЦреЗрд▓ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ: GameController.swiftред
- рдПрдХ рджреГрд╢реНрдп: CardCell.swiftред
- рджреЛ рдореЙрдбрд▓: MemoryGame.swift рдФрд░ Card.swiftред
- Main.storyboard рддрд╛рдХрд┐ рдШрдЯрдХреЛрдВ рдХрд╛ рдкреВрд░рд╛ рд╕реЗрдЯ рдЙрдкрд▓рдмреНрдз рд╣реЛред
рд╣рдо рдЦреЗрд▓ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдШрдЯрдХ, рдХрд╛рд░реНрдб рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
Card.swiftрдХрд╛рд░реНрдб рдореЙрдбрд▓ рдореЗрдВ рддреАрди рдЧреБрдг рд╣реЛрдВрдЧреЗ: рдкреНрд░рддреНрдпреЗрдХ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреА, рдХрд╛рд░реНрдб рдкрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ (рдЫрд┐рдкреЗ рдпрд╛ рдЦреБрд▓реЗ) рдФрд░ рдХрд▓рд╛рдХреГрддрд┐URL рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдЪрд░ред
class Card { var id: String var shown: Bool = false var artworkURL: UIImage! }
рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрди рддрд░реАрдХреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
рдПрдХ рдХрд╛рд░реНрдб рдкрд░ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ред рдпрд╣рд╛рдВ рд╣рдо рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЖрдИрдбреА рдХреЗ рд▓рд┐рдП, 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 }
рдФрд░ рдХрд╛рд░реНрдб рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдРрд░реЗ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред
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() } }
Main.storyboard рдФрд░ GameController.swift
Main.storyboard рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рдЖрдкрдХреЛ рдЧреНрд░рд┐рдб рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐рдпреЛрдВ рд╕рд╣рд┐рдд viewDidLoad рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдпрд╛ рдЧреЗрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЦреЗрд▓ рдореЗрдВ, рдпрд╣ рд╕рдм 4 * 4 рд╕рдВрдЧреНрд░рд╣ рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк collectionView рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ
рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рд╣рдо рдЧреЗрдордХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред GameController рдореЗрдВ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рджреГрд╢реНрдп рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ IBOutlet рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдФрд░ рд▓рд┐рдВрдХ IBAction onStartGame () рдмрдЯрди рдкрд░ рд╣реИ, рдпрд╣ UIButton рд╣реИ, рдЖрдк рдЗрд╕реЗ рдкреНрд▓реЗрдмреЛрд░реНрдб рдирд╛рдордХ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛:
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рджреЛ рдореБрдЦреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдЧреНрд░рд┐рдб (рдЧреЗрдо): рдЧреЗрдо = рдореЗрдореЛрд░реАрдЧреИрдо (), рдФрд░ рдХрд╛рд░реНрдб рдХреЗ рд╕реЗрдЯ рдкрд░: рдХрд╛рд░реНрдб = [рдХрд╛рд░реНрдб] ()ред
- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░ рдХреЛ viewDidLoad рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ, рдпрд╣ рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЗрдо рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЫреБрдкрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдореИрдкреНрд╕ рддрдм рддрдХ рдЫрд┐рдкреЗ рд░рд╣рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ PLAY рдХреЛ рджрдмрд╛рддрд╛ рд╣реИред
- рдЬреИрд╕реЗ рд╣реА рд╣рдо PLAY рдХреЛ рджрдмрд╛рддреЗ рд╣реИрдВ, onStartGame IBAction рд╕реЗрдХреНрд╢рди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рд╕рдВрдЧреНрд░рд╣ рджреГрд╢реНрдп isHidden рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдХрд╛рд░реНрдб рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХреЗрдВред
- рдЬрдм рднреА рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдХрд╛рд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рддреЛ didSelectItemAt рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдЧреЗрдо рдХреЗ рдореВрд▓ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕рд▓рд╛рдЗрдХ рдХрд╛рд░реНрдб рдХрд╣рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ 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 {
рдЕрдм рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реНрд╡рд┐рдлреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдиреАрдВрд╡ рд╣реИред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рд╡рд░реНрдЧ, рд╕рдВрд░рдЪрдирд╛, рдпрд╛ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓рд░ рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо GameController рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдм рд╣рдо рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
protocol MemoryGameProtocol {
рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ рдЪрд╛рд░ рдХреА рдЬрд░реВрд░рдд рд╣реИред
- рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд: memoryGameDidStartред
- рдХрд╛рд░реНрдб рдлреЗрд╕ рдХреЛ рдиреАрдЪреЗ рдлреНрд▓рд┐рдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: memoryGameShowCardsред
- рдХрд╛рд░реНрдб рдЪреЗрд╣рд░рд╛ рдиреАрдЪреЗ рдлреНрд▓рд┐рдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛: рдореЗрдореЛрд░реАрдЧреИрдорд╣рд╛рдЗрдбрдХрд╛рд░реНрдбреНрд╕ред
- рдЧреЗрдо рдкреВрд░рд╛ рдХрд░рдирд╛: memoryGameDidEnd
рд╣рдо рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЪрд╛рд░ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЧреЗрдордХрдВрдЯреНрд░реЛрд▓рд░ рд╣реИред
memoryGameDidStart
рдЬрдм рдпрд╣ рд╡рд┐рдзрд┐ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЦреЗрд▓ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЗрд╕ рджрдмрд╛рдП рд░рдЦреЗрдВ)ред рдпрд╣рд╛рдВ, рд╣рдо рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣ рджреГрд╢реНрдп .reloadData () рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдирдХреНрд╢реЗ рдореЗрдВ рдлреЗрд░рдмрджрд▓ рд╣реЛрдЧрд╛ред
func memoryGameDidStart(_ game: MemoryGame) { collectionView.reloadData() }
memoryGameShowCards
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ collectionSDViewSelectItemAt рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЪрдпрдирд┐рдд рдорд╛рдирдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдбрд╢рд╛рдЙрди рдПрд░реЗ рдореЗрдВ рдПрдХ рдмреЗрдЬреЛрдбрд╝ рдХрд╛рд░реНрдб рд╣реИ (рдпрджрд┐ рдХрд╛рд░реНрдбреНрд╕рд╣реЛрд▓реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рд╖рдо рд╣реИ)ред рдпрджрд┐ рдПрдХ рд╣реИ, рддреЛ рдЪрдпрдирд┐рдд рдХрд╛рд░реНрдб рдХреА рддреБрд▓рдирд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЪрд┐рддреНрд░ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдбреЛрдВ рдХреЛ рдХрд╛рд░реНрдбреНрд╕рд╣рд╛рдЙрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЦреБрд▓реЗ рд░рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдХрд╛рд░реНрдб рдХрд╛рд░реНрдб рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреЛрдиреЛрдВ рдЙрд▓реНрдЯрд╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
memoryGameHideCards
рдпрджрд┐ рдХрд╛рд░реНрдб рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдб рдХреА рдЫрд╡рд┐рдпрд╛рдВ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВред
рджрд┐рдЦрд╛рдпрд╛ = рдЭреВрдард╛ред
memoryGameDidEnd
рдЬрдм рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреБрд▓реЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдбрд╢реЛ рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВ: cardShown.count = cards.count, рдЗрд╕рд▓рд┐рдП рдЦреЗрд▓ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдПрдВрдбрдЧреЗрдо () рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЭреВрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЧреЗрдо рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред 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() } }

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЗрдо рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЪреНрдЫрд╛ рдХреЛрдбрд┐рдВрдЧ!
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: