āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŽā§āĻŽāĻ°āĻŋ āĻĒā§āĻ°āĻļāĻŋāĻā§āĻˇāĻŖ āĻā§āĻŽ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°ā§ āĻ¯āĻž āĻāĻŽāĻŋ āĻ¸āĻ¤ā§āĻ¯āĻŋāĻ āĻĒāĻāĻ¨ā§āĻĻ āĻāĻ°āĻŋāĨ¤ āĻ¨āĻŋāĻā§ āĻāĻžāĻ˛ā§ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āĻāĻĒāĻ¨āĻŋ āĻ¯ā§āĻ¤ā§ āĻ¯ā§āĻ¤ā§ āĻ¸ā§āĻāĻĢāĻ āĻā§āĻ˛āĻžāĻ¸ āĻāĻŦāĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻ°āĻ āĻāĻŋāĻā§ āĻļāĻŋāĻāĻŦā§āĻ¨āĨ¤ āĻ¤āĻŦā§ āĻāĻŽāĻ°āĻž āĻļā§āĻ°ā§ āĻāĻ°āĻžāĻ° āĻāĻā§, āĻāĻ¸ā§āĻ¨ āĻā§āĻ˛āĻžāĻāĻŋ āĻ¨āĻŋāĻā§āĻ āĻŦā§āĻāĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤
āĻāĻŽāĻ°āĻž āĻŽāĻ¨ā§ āĻāĻ°āĻŋāĻ¯āĻŧā§ āĻĻāĻŋāĻā§āĻāĻŋ: "Habr"-āĻāĻ° āĻ¸āĻāĻ˛ āĻĒāĻžāĻ āĻāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ - "Habr" āĻĒā§āĻ°āĻāĻžāĻ°āĻŽā§āĻ˛āĻ āĻā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¯ā§āĻā§āĻ¨ā§ Skillbox āĻā§āĻ°ā§āĻ¸ā§ āĻ¨āĻĨāĻŋāĻā§āĻā§āĻ¤ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ 10 āĻ°ā§āĻŦā§āĻ˛ āĻāĻžāĻĄāĻŧāĨ¤
Skillbox āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻāĻ°ā§: āĻļāĻŋāĻā§āĻˇāĻžāĻāĻ¤ āĻ āĻ¨āĻ˛āĻžāĻāĻ¨ āĻā§āĻ°ā§āĻ¸
"āĻĒā§āĻļāĻž āĻāĻžāĻāĻž āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§" .
āĻāĻŋāĻāĻžāĻŦā§ āĻŽā§āĻŽāĻ°āĻŋ āĻāĻžāĻ°ā§āĻĄ āĻā§āĻ˛āĻ¤ā§ āĻšāĻ¯āĻŧ
āĻā§āĻŽāĻāĻŋ āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻ¤āĻžāĻ°āĻž āĻŽā§āĻ āĻāĻ°ā§ āĻļā§āĻ¯āĻŧā§ āĻĨāĻžāĻā§ (āĻ¯āĻĨāĻžāĻā§āĻ°āĻŽā§, āĻāĻŋāĻ¤ā§āĻ° āĻ¨āĻŋāĻā§)āĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯ā§āĻā§āĻ¨ā§ āĻāĻāĻāĻŋāĻ¤ā§ āĻā§āĻ˛āĻŋāĻ āĻāĻ°āĻ˛ā§, āĻāĻŦāĻŋāĻāĻŋ āĻāĻ¯āĻŧā§āĻ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻ˛ā§āĨ¤
āĻĒā§āĻ˛ā§āĻ¯āĻŧāĻžāĻ°ā§āĻ° āĻāĻžāĻ āĻšāĻ˛ āĻāĻāĻ āĻāĻŦāĻŋ āĻ¸āĻš āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻžāĻ°ā§āĻĄ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻžāĨ¤ āĻ¯āĻĻāĻŋ, āĻĒā§āĻ°āĻĨāĻŽ āĻāĻžāĻ°ā§āĻĄ āĻā§āĻ˛āĻžāĻ° āĻĒāĻ°ā§, āĻāĻĒāĻ¨āĻŋ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻāĻŋ āĻāĻ˛ā§āĻā§ āĻĻā§āĻ¨ āĻāĻŦāĻ āĻāĻŦāĻŋāĻā§āĻ˛āĻŋ āĻŽāĻŋāĻ˛ā§ āĻ¯āĻžāĻ¯āĻŧ, āĻāĻāĻ¯āĻŧ āĻāĻžāĻ°ā§āĻĄāĻ āĻā§āĻ˛āĻž āĻĨāĻžāĻā§āĨ¤ āĻ¸ā§āĻā§āĻ˛ā§ āĻ¨āĻž āĻŽāĻŋāĻ˛āĻ˛ā§ āĻāĻžāĻ°ā§āĻĄāĻā§āĻ˛ā§ āĻāĻŦāĻžāĻ° āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻ˛āĻā§āĻˇā§āĻ¯ āĻšāĻ˛ āĻ¸āĻŦāĻāĻŋāĻā§ āĻā§āĻ˛āĻžāĨ¤
āĻĒā§āĻ°āĻāĻ˛ā§āĻĒ āĻāĻžāĻ āĻžāĻŽā§
āĻāĻ āĻā§āĻŽāĻāĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸āĻšāĻ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻĒāĻžāĻĻāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨:
- āĻāĻ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°: GameController.swiftāĨ¤
- āĻāĻ¯āĻŧāĻžāĻ¨ āĻāĻŋāĻ: CardCell.swiftāĨ¤
- āĻĻā§āĻāĻŋ āĻŽāĻĄā§āĻ˛: MemoryGame.swift āĻāĻŦāĻ Card.swiftāĨ¤
- āĻāĻĒāĻžāĻĻāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¸ā§āĻ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻ°āĻ¯āĻŧā§āĻā§ āĻ¤āĻž āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻāĻ°āĻ¤ā§ Main.storyboardāĨ¤
āĻāĻŽāĻ°āĻž āĻā§āĻŽā§āĻ° āĻ¸āĻšāĻāĻ¤āĻŽ āĻāĻĒāĻžāĻĻāĻžāĻ¨, āĻāĻžāĻ°ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§ āĻļā§āĻ°ā§ āĻāĻ°āĻŋāĨ¤
Card.swift
āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻŽāĻĄā§āĻ˛ā§āĻ° āĻ¤āĻŋāĻ¨āĻāĻŋ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻĨāĻžāĻāĻŦā§: āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋāĻā§ āĻļāĻ¨āĻžāĻā§āĻ¤ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻĄāĻŋ, āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ (āĻ˛ā§āĻāĻžāĻ¨ā§ āĻŦāĻž āĻā§āĻ˛āĻž) āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻŋāĻ¯āĻŧāĻžāĻ¨ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻāĻŦāĻ āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻāĻŋāĻ¤ā§āĻ°āĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ°ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻāĻāĻāĻ°āĻāĻ˛āĨ¤
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() }
}
}
}
āĻāĻŽāĻ°āĻž āĻāĻ°āĻ āĻāĻāĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻ
āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻŽāĻĄā§āĻ˛āĻāĻŋ āĻšāĻ˛ 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 āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛āĻāĻŋāĻā§ āĻŽāĻŋāĻĨā§āĻ¯āĻžāĻ¤ā§ āĻ¸ā§āĻ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻāĻžāĻ°ā§āĻĄāĻā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻ˛ā§āĻāĻāĻāĻāĻŋ āĻ¸āĻ°āĻŋāĻ¯āĻŧā§ āĻĢā§āĻ˛āĻŋāĨ¤
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 āĻāĻ°āĻāĻŽ āĻāĻŋāĻā§ āĻĻā§āĻāĻžāĻ¯āĻŧ:
āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻāĻāĻžāĻŦā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻ¨āĻ¤ā§āĻ¨ āĻā§āĻŽāĻāĻŋāĻā§ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°ā§ āĻāĻŋāĻāĻĄāĻŋāĻĄāĻ˛ā§āĻĄ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻ¸ā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§, āĻā§āĻ°āĻŋāĻĄā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŋāĻ¤ā§āĻ°āĻā§āĻ˛āĻŋ āĻ¸āĻšāĨ¤ āĻā§āĻŽāĻāĻŋāĻ¤ā§, āĻāĻ āĻ¸āĻŽāĻ¸ā§āĻ¤āĻā§āĻ˛āĻŋ āĻāĻāĻāĻŋ 4*4 āĻ¸āĻāĻā§āĻ°āĻš āĻāĻŋāĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻāĻ¨āĻ collectionView āĻāĻ° āĻ¸āĻžāĻĨā§ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻ¨āĻž āĻšāĻ¨ āĻ¤āĻŦā§ āĻāĻāĻŋ āĻāĻāĻžāĻ¨ā§
āĻāĻŽāĻ°āĻž āĻā§āĻŽ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°āĻā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋāĻ° āĻ°ā§āĻ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻŦāĨ¤ āĻā§āĻŽ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°ā§āĻ° āĻāĻāĻāĻŋ āĻāĻžāĻ˛ā§āĻāĻļāĻ¨ āĻāĻŋāĻ āĻĨāĻžāĻāĻŦā§ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ IBOutlet āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻŦāĨ¤ āĻāĻ°ā§āĻāĻāĻŋ āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸ āĻšāĻ˛ IBAction onStartGame() āĻŦā§āĻ¤āĻžāĻŽ, āĻāĻāĻŋ āĻāĻāĻāĻŋ UIButton, āĻāĻĒāĻ¨āĻŋ āĻāĻāĻŋ PLAY āĻ¨āĻžāĻŽāĻ āĻ¸ā§āĻā§āĻ°āĻŋāĻŦā§āĻ°ā§āĻĄā§ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤
āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻāĻā§:
- āĻĒā§āĻ°āĻĨāĻŽā§, āĻāĻŽāĻ°āĻž āĻĻā§āĻāĻŋ āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ āĻŦāĻā§āĻā§āĻ āĻļā§āĻ°ā§ āĻāĻ°āĻŋ - āĻā§āĻ°āĻŋāĻĄ: āĻā§āĻŽ = āĻŽā§āĻŽāĻ°āĻŋāĻā§āĻŽ(), āĻāĻŦāĻ āĻ¤āĻžāĻ¸ā§āĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ: āĻāĻžāĻ°ā§āĻĄ = [āĻāĻžāĻ°ā§āĻĄ]()āĨ¤
- āĻāĻŽāĻ°āĻž āĻāĻŋāĻāĻĄāĻŋāĻĄāĻ˛ā§āĻĄ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻ¸ā§āĻ āĻāĻ°āĻŋ, āĻā§āĻŽāĻāĻŋ āĻāĻ˛āĻžāĻāĻžāĻ˛ā§āĻ¨ āĻāĻāĻŋāĻ āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ¯āĻž āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤
- CollectionView āĻ˛ā§āĻāĻžāĻ¨ā§ āĻ āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻ¸ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻāĻžāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻĒā§āĻ˛ā§ āĻĒā§āĻ°ā§āĻ¸ āĻ¨āĻž āĻāĻ°āĻž āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻžāĻ°ā§āĻĄ āĻ˛ā§āĻāĻžāĻ¨ā§ āĻĨāĻžāĻā§āĨ¤
- āĻ¯āĻ¤ āĻ¤āĻžāĻĄāĻŧāĻžāĻ¤āĻžāĻĄāĻŧāĻŋ āĻāĻŽāĻ°āĻž PLAY āĻāĻŋāĻĒā§āĻ¨, onStartGame IBAction āĻŦāĻŋāĻāĻžāĻ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ, āĻāĻŦāĻ āĻāĻŽāĻ°āĻž collectionView isHidden āĻĒā§āĻ°āĻĒāĻžāĻ°ā§āĻāĻŋāĻāĻŋāĻā§ āĻŽāĻŋāĻĨā§āĻ¯āĻžāĻ¤ā§ āĻ¸ā§āĻ āĻāĻ°āĻŋ āĻ¯āĻžāĻ¤ā§ āĻāĻžāĻ°ā§āĻĄāĻā§āĻ˛āĻŋ āĻĻā§āĻļā§āĻ¯āĻŽāĻžāĻ¨ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
- āĻĒā§āĻ°āĻ¤āĻŋāĻŦāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻāĻāĻāĻŋ āĻāĻžāĻ°ā§āĻĄ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°ā§, didSelectItemAt āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§ āĻāĻŽāĻ°āĻž āĻŽā§āĻ˛ āĻā§āĻŽā§āĻ° āĻ¯ā§āĻā§āĻ¤āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻ¤ā§ didSelectCard āĻŦāĻ˛āĻŋāĨ¤
āĻāĻāĻžāĻ¨ā§ āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻā§āĻŽ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨:
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)
}
}
āĻāĻāĻ¨ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻāĻā§ āĻāĻĨāĻž āĻŦāĻ˛āĻž āĻ¯āĻžāĻāĨ¤
āĻĒā§āĻ°ā§āĻā§āĻāĻ˛
āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻž āĻ¸ā§āĻāĻĢāĻ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻŋāĻ āĻāĻ° āĻŽā§āĻ˛āĨ¤ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻāĻāĻāĻŋ āĻļā§āĻ°ā§āĻŖā§, āĻāĻžāĻ āĻžāĻŽā§, āĻŦāĻž āĻāĻŖāĻ¨āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻžāĻ° āĻā§āĻˇāĻŽāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻāĻ āĻ¨ā§āĻ¤āĻŋāĻāĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻŽāĻĄā§āĻ˛āĻžāĻ° āĻāĻŦāĻ āĻāĻā§āĻ¸āĻā§āĻ¨āĻ¸āĻŋāĻŦāĻ˛ āĻā§āĻĄ āĻ˛āĻŋāĻāĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻā§āĻ¤āĻĒāĻā§āĻˇā§, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¨ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ GameController-āĻ collectionView āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻāĻŋāĨ¤ āĻāĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻ¯āĻžāĻ. āĻ¸āĻŋāĻ¨āĻā§āĻ¯āĻžāĻā§āĻ¸ āĻāĻ āĻŽāĻ¤ āĻĻā§āĻāĻžāĻŦā§:
protocol MemoryGameProtocol {
//protocol definition goes here
}
āĻāĻŽāĻ°āĻž āĻāĻžāĻ¨āĻŋ āĻ¯ā§ āĻāĻāĻāĻŋ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻāĻāĻŋ āĻā§āĻ˛āĻžāĻ¸ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻŦāĻž āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļāĻžāĻŦāĻ˛ā§ āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧ, āĻ¤āĻžāĻ āĻāĻ¸ā§āĻ¨ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻā§ āĻšāĻāĻ¯āĻŧāĻž āĻāĻāĻŋāĻ¤ āĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻžāĻŦāĻŋāĨ¤ āĻāĻĒāĻ¨āĻžāĻ° āĻŽā§āĻ āĻāĻžāĻ°āĻāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨āĨ¤
- āĻā§āĻ˛āĻž āĻļā§āĻ°ā§: memoryGameDidStart.
- āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻŽā§āĻ āĻ¨āĻŋāĻā§ āĻ¨āĻžāĻŽāĻžāĻ¤ā§ āĻšāĻŦā§: memoryGameShowCardsāĨ¤
- āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻŽā§āĻ āĻ¨āĻŋāĻā§ āĻ¨āĻžāĻŽāĻžāĻ¤ā§ āĻšāĻŦā§: memoryGameHideCardsāĨ¤
- āĻā§āĻ˛āĻž āĻļā§āĻˇ: memoryGameDidEnd.
āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻžāĻ°āĻāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ āĻŽā§āĻ˛ āĻļā§āĻ°ā§āĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¯āĻž āĻā§āĻŽ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°āĨ¤
āĻŽā§āĻŽāĻ°āĻŋ āĻā§āĻŽāĻĄāĻŋāĻĄāĻ¸ā§āĻāĻžāĻ°ā§āĻ
āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻāĻžāĻ˛āĻžāĻ¨ā§ āĻšāĻ˛ā§, āĻā§āĻŽāĻāĻŋ āĻļā§āĻ°ā§ āĻšāĻāĻ¯āĻŧāĻž āĻāĻāĻŋāĻ¤ (āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻĒā§āĻ˛ā§ āĻāĻŋāĻĒā§)āĨ¤ āĻāĻāĻžāĻ¨ā§ āĻāĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° collectionView.reloadData() āĻāĻ˛ āĻāĻ°ā§ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ˛ā§āĻĄ āĻāĻ°āĻŦ, āĻ¯āĻž āĻāĻžāĻ°ā§āĻĄāĻā§āĻ˛āĻŋāĻā§ āĻāĻ˛ā§āĻŽā§āĻ˛ā§ āĻāĻ°āĻŦā§āĨ¤
func memoryGameDidStart(_ game: MemoryGame) {
collectionView.reloadData()
}
āĻŽā§āĻŽāĻ°āĻŋ āĻā§āĻŽāĻļā§āĻāĻžāĻ°ā§āĻĄ
āĻāĻŽāĻ°āĻž āĻ¸āĻāĻā§āĻ°āĻš āĻāĻ¸āĻĄāĻŋāĻāĻŋāĻ āĻ¸āĻŋāĻ˛ā§āĻā§āĻ āĻāĻāĻā§āĻŽāĻāĻ āĻĨā§āĻā§ āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋāĻā§ āĻāĻ˛ āĻāĻ°āĻŋāĨ¤ āĻĒā§āĻ°āĻĨāĻŽā§ āĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻŋāĻ¤ āĻāĻžāĻ°ā§āĻĄ āĻĻā§āĻāĻžāĻ¯āĻŧāĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻāĻžāĻ°ā§āĻĄ āĻĻā§āĻāĻžāĻ¨ā§ āĻ ā§āĻ¯āĻžāĻ°ā§āĻ¤ā§ āĻāĻāĻāĻŋ āĻ āĻŽāĻŋāĻ˛ āĻāĻžāĻ°ā§āĻĄ āĻāĻā§ āĻāĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻĻā§āĻā§āĻ¨ (āĻ¯āĻĻāĻŋ āĻĻā§āĻāĻžāĻ¨ā§ āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž āĻŦāĻŋāĻā§āĻĄāĻŧ āĻšāĻ¯āĻŧ)āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻāĻāĻŋ āĻĨāĻžāĻā§ āĻ¤āĻŦā§ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻŋāĻ¤ āĻāĻžāĻ°ā§āĻĄāĻāĻŋ āĻāĻ° āĻ¸āĻžāĻĨā§ āĻ¤ā§āĻ˛āĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻŦāĻŋ āĻāĻāĻ āĻšāĻ˛ā§, āĻāĻāĻ¯āĻŧ āĻāĻžāĻ°ā§āĻĄāĻ āĻāĻžāĻ°ā§āĻĄā§ āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻĻā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻŽā§āĻā§āĻŽā§āĻāĻŋ āĻĨāĻžāĻā§āĨ¤ āĻāĻŋāĻ¨ā§āĻ¨ āĻšāĻ˛ā§, āĻāĻžāĻ°ā§āĻĄ āĻā§āĻĄāĻŧā§ āĻāĻžāĻ°ā§āĻĄ āĻĻā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻāĻ¯āĻŧāĻ āĻŽā§āĻ āĻĨā§āĻŦāĻĄāĻŧā§ āĻĒāĻĄāĻŧā§āĨ¤
āĻŽā§āĻŽāĻ°āĻŋ āĻā§āĻŽāĻšāĻžāĻāĻĄāĻāĻžāĻ°ā§āĻĄ
āĻ¯āĻĻāĻŋ āĻāĻžāĻ°ā§āĻĄāĻā§āĻ˛āĻŋ āĻŽā§āĻ˛ā§ āĻ¨āĻž, āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻžāĻ°ā§āĻĄā§āĻ° āĻāĻŦāĻŋāĻā§āĻ˛āĻŋ āĻ˛ā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧāĨ¤
āĻĻā§āĻāĻžāĻ¨ā§ = āĻŽāĻŋāĻĨā§āĻ¯āĻžāĨ¤
āĻŽā§āĻŽāĻ°āĻŋ āĻā§āĻŽāĻĄāĻŋāĻĄāĻāĻ¨ā§āĻĄ
āĻ¯āĻāĻ¨ āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ, āĻāĻ° āĻŽāĻžāĻ¨ā§ āĻšāĻ˛ āĻ¯ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻžāĻ°ā§āĻĄ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻžāĻ°ā§āĻĄ āĻĻā§āĻāĻžāĻ¨ā§ āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻ¯āĻŧ āĻ°āĻ¯āĻŧā§āĻā§: cardsShown.count = cards.count, āĻ¤āĻžāĻ āĻā§āĻŽāĻāĻŋ āĻļā§āĻˇāĨ¤ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋāĻā§ āĻŦāĻŋāĻļā§āĻˇāĻāĻžāĻŦā§ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻ¯āĻāĻ¨ āĻāĻŽāĻ°āĻž endGame() āĻā§ āĻāĻ˛ āĻāĻ°ā§ isPlaying var-āĻā§ āĻŽāĻŋāĻĨā§āĻ¯āĻž āĻ¸ā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻā§āĻŽā§āĻ° āĻļā§āĻˇ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻāĻŋ āĻĻā§āĻāĻžāĻ¨ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ alertController āĻ¨āĻŋāĻ¯āĻŧāĻžāĻŽāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸ā§āĻāĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤ viewDidDisappear āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻā§āĻŽāĻāĻŋ āĻ°āĻŋāĻ¸ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻā§āĻŽ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°ā§ āĻāĻāĻŋ āĻā§āĻŽāĻ¨ āĻĻā§āĻāĻžāĻ¯āĻŧ āĻ¤āĻž āĻāĻāĻžāĻ¨ā§:
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 āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻāĻ°ā§:
- āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻā§āĻ°ā§āĻ¸
"āĻŽā§āĻŦāĻžāĻāĻ˛ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ° āĻĒā§āĻ°ā§" .- āĻ āĻ¨āĻ˛āĻžāĻāĻ¨ āĻā§āĻ°ā§āĻ¸ā§āĻ° āĻāĻŦā§āĻĻāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§
"āĻĒāĻžāĻāĻĨāĻ¨ āĻĄā§āĻāĻž āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻ" .- āĻĻā§āĻ āĻŦāĻāĻ°ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻā§āĻ°ā§āĻ¸
"āĻāĻŽāĻŋ āĻāĻāĻāĻ¨ āĻĒā§āĻ°ā§ āĻāĻ¯āĻŧā§āĻŦ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°" .
āĻāĻ¤ā§āĻ¸: www.habr.com