เจเจน เจฒเฉเจ เจเฉฑเจ เจธเจงเจพเจฐเจจ เจฎเฉเจฎเฉเจฐเฉ เจธเจฟเจเจฒเจพเจ เจเฉเจฎ เจฌเจฃเจพเจเจฃ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจฆเจพ เจนเฉ เจเจฟเจธเจฆเจพ เจฎเฉเจ เจธเฉฑเจเจฎเฉเฉฑเจ เจ
เจจเฉฐเจฆ เจฒเฉเจเจฆเจพ เจนเจพเจ. เจเจชเจฃเฉ เจเจช เจตเจฟเฉฑเจ เจเฉฐเจเฉ เจนเฉเจฃ เจฆเฉ เจเจฒเจพเจตเจพ, เจคเฉเจธเฉเจ เจเจพเจเจฆเฉ เจธเจฎเฉเจ Swift เจเจฒเจพเจธเจพเจ เจ
เจคเฉ เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจฌเจพเจฐเฉ เจฅเฉเฉเจพ เจนเฉเจฐ เจธเจฟเฉฑเจเฉเจเฉเฅค เจชเจฐ เจเจธ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจฟ เจ
เจธเฉเจ เจธเจผเฉเจฐเฉ เจเจฐเฉเจ, เจเจ เจเฉเจก เจจเฉเฉฐ เจธเจฎเจเฉเจเฅค
เจ เจธเฉเจ เจฏเจพเจฆ เจฆเจฟเจตเจพเจเจเจฆเฉ เจนเจพเจ: "Habr" เจฆเฉ เจธเจพเจฐเฉ เจชเจพเจ เจเจพเจ เจฒเจ - "Habr" เจชเฉเจฐเจเจพเจฐ เจเฉเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเจฟเจธเฉ เจตเฉ เจธเจเจฟเฉฑเจฒเจฌเจพเจเจธ เจเฉเจฐเจธ เจตเจฟเฉฑเจ เจฆเจพเจเจฒเจพ เจฒเฉเจฃ เจตเฉเจฒเฉ 10 เจฐเฉเจฌเจฒ เจฆเฉ เจเฉเจเฅค
เจธเจเจฟเฉฑเจฒเจฌเจพเจเจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉ: เจตเจฟเจฆเจฟเจ เจ เจเจจเจฒเจพเจเจจ เจเฉเจฐเจธ
"เจชเฉเจฐเฉเจซเฉเจธเจผเจจ เจเจพเจตเจพ เจกเจฟเจตเฉเจฒเจชเจฐ" .
เจฎเฉเจฎเฉเจฐเฉ เจเจพเจฐเจก เจเจฟเจตเฉเจ เจเฉเจกเจฃเจพ เจนเฉ
เจเฉเจก เจเจพเจฐเจกเจพเจ เจฆเฉ เจเฉฑเจ เจธเฉเฉฑเจ เจฆเฉ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจเจน เจฎเฉเฉฐเจน เจนเฉเจ เจพเจ เจฒเฉเจเจฆเฉ เจนเจจ (เจเฉเจฐเจฎเจตเจพเจฐ, เจเจฟเฉฑเจคเจฐ เจนเฉเจ เจพเจ). เจเจฆเฉเจ เจคเฉเจธเฉเจ เจเจฟเจธเฉ 'เจคเฉ เจเจฒเจฟเฉฑเจ เจเจฐเจฆเฉ เจนเฉ, เจคเจพเจ เจเจฟเฉฑเจคเจฐ เจเฉเจ เจธเจเจฟเฉฐเจเจพเจ เจฒเจ เจเฉเฉฑเจฒเฉเจนเจฆเจพ เจนเฉเฅค
เจเจฟเจกเจพเจฐเฉ เจฆเจพ เจเฉฐเจฎ เจเฉฑเจเฉ เจคเจธเจตเฉเจฐเจพเจ เจตเจพเจฒเฉ เจธเจพเจฐเฉ เจเจพเจฐเจกเจพเจ เจจเฉเฉฐ เจฒเฉฑเจญเจฃเจพ เจนเฉเฅค เจเฉเจเจฐ, เจชเจนเจฟเจฒเฉ เจเจพเจฐเจก เจจเฉเฉฐ เจเฉเจฒเฉเจนเจฃ เจคเฉเจ เจฌเจพเจ เจฆ, เจคเฉเจธเฉเจ เจฆเฉเจเฉ เจจเฉเฉฐ เจฎเฉเฉเจฆเฉ เจนเฉ เจ เจคเฉ เจคเจธเจตเฉเจฐเจพเจ เจฎเฉเจฒ เจเจพเจเจฆเฉเจเจ เจนเจจ, เจคเจพเจ เจฆเฉเจตเฉเจ เจเจพเจฐเจก เจเฉเฉฑเจฒเฉเจนเฉ เจฐเจนเจฟเฉฐเจฆเฉ เจนเจจเฅค เจเฉเจเจฐ เจเจน เจฎเฉเจฒ เจจเจนเฉเจ เจเจพเจเจฆเฉ, เจคเจพเจ เจเจพเจฐเจก เจฆเฉเจฌเจพเจฐเจพ เจฌเฉฐเจฆ เจเจฐ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเจจเฅค เจเฉเจเจพ เจธเจญ เจเฉเจ เจเฉเจฒเฉเจนเจฃเจพ เจนเฉ.
เจชเฉเจฐเฉเจเฉเจเจ เจฌเจฃเจคเจฐ
เจเจธ เจเฉเจฎ เจฆเจพ เจเฉฑเจ เจธเจงเจพเจฐเจจ เจธเฉฐเจธเจเจฐเจฃ เจฌเจฃเจพเจเจฃ เจฒเจ เจคเฉเจนเจพเจจเฉเฉฐ เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจญเจพเจเจพเจ เจฆเฉ เจฒเฉเฉ เจนเฉ:
- เจเฉฑเจ เจเฉฐเจเจฐเฉเจฒเจฐ: GameController.swift.
- เจเฉฑเจ เจฆเฉเจฐเจฟเจธเจผ: CardCell.swift.
- เจฆเฉ เจฎเจพเจกเจฒ: MemoryGame.swift เจ เจคเฉ Card.swiftเฅค
- Main.storyboard เจเจน เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจฟ เจญเจพเจเจพเจ เจฆเจพ เจชเฉเจฐเจพ เจธเฉเฉฑเจ เจเจชเจฒเจฌเจง เจนเฉเฅค
เจ เจธเฉเจ เจเฉเจก เจฆเฉ เจธเจญ เจคเฉเจ เจธเจฐเจฒ เจนเจฟเฉฑเจธเฉ, เจเจพเจฐเจกเจพเจ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเจพเจเฅค
เจเจพเจฐเจก.เจธเจตเจฟเจซเจ
เจเจพเจฐเจก เจฎเจพเจกเจฒ เจฆเฉเจเจ เจคเจฟเฉฐเจจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจนเฉเจฃเจเฉเจเจ: เจนเจฐเฉเจ เจฆเฉ เจชเจเจพเจฃ เจเจฐเจจ เจฒเจ เจเจเจกเฉ, เจเจพเจฐเจก เจฆเฉ เจธเจฅเจฟเจคเฉ (เจฒเฉเจเจฟเจ เจเจพเจ เจเฉเฉฑเจฒเฉเจนเจพ) เจฆเจฐเจธเจพเจเจฃ เจฒเจ เจฆเจฟเจเจพเจเจ เจเจฟเจ เจเฉฑเจ เจฌเฉเจฒเฉเจ เจจ เจตเฉเจฐเฉเจเจฌเจฒ, เจ เจคเฉ เจเจพเจฐเจกเจพเจ 'เจคเฉ เจเจฟเฉฑเจคเจฐเจพเจ เจฒเจ เจเจฐเจเจตเจฐเจ 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() }
}
}
}
เจ เฉฑเจเฉ เจตเจงเฉ.
เจฆเฉเจเจพ เจฎเจพเจกเจฒ 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 เจเฉเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจเจฆเจพ เจนเฉ:
เจธเจผเฉเจฐเฉ เจตเจฟเฉฑเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจจเจตเฉเจ เจเฉเจฎ เจจเฉเฉฐ เจเฉฐเจเจฐเฉเจฒเจฐ เจตเจฟเฉฑเจ viewDidLoad เจฆเฉ เจคเฉเจฐ 'เจคเฉ เจธเฉเฉฑเจ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ, เจเจฟเจธ เจตเจฟเฉฑเจ เจเจฐเจฟเฉฑเจก เจฒเจ เจเจฟเฉฑเจคเจฐ เจธเจผเจพเจฎเจฒ เจนเจจเฅค เจเฉเจฎ เจตเจฟเฉฑเจ, เจเจน เจธเจญ 4*4 เจเจฒเฉเจเจธเจผเจจ เจตเจฟเจ เจฆเฉเจเจฐเจพ เจฆเจฐเจธเจพเจเจ เจเจพเจตเฉเจเจพเฅค เจเฉเจเจฐ เจคเฉเจธเฉเจ เจ
เจเฉ เจเจฒเฉเจเจธเจผเจจเจตเจฟเจ เจคเฉเจ เจเจพเจฃเฉ เจจเจนเฉเจ เจนเฉ, เจคเจพเจ เจเจน เจเฉฑเจฅเฉ เจนเฉ
เจ เจธเฉเจ GameController เจจเฉเฉฐ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจฐเฉเจ เจเฉฐเจเจฐเฉเจฒเจฐ เจตเจเฉเจ เจเฉเจเจซเจฟเจเจฐ เจเจฐเจพเจเจเฉเฅค เจเฉเจฎเจเฉฐเจเจฐเฉเจฒเจฐ เจเฉเจฒ เจเฉฑเจ เจเจฒเฉเจเจธเจผเจจ เจตเจฟเจ เจนเฉเจตเฉเจเจพ เจเจฟเจธเจฆเจพ เจ เจธเฉเจ เจเฉฑเจ IBOutlet เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจนเจตเจพเจฒเจพ เจฆเฉเจตเจพเจเจเฉเฅค เจเฉฑเจ เจนเฉเจฐ เจนเจตเจพเจฒเจพ IBAction onStartGame() เจฌเจเจจ เจฆเจพ เจนเฉ, เจเจน เจเฉฑเจ UIButton เจนเฉ, เจคเฉเจธเฉเจ เจเจธเจจเฉเฉฐ PLAY เจจเจพเจฎเจ เจธเจเฉเจฐเฉเจฌเฉเจฐเจก เจตเจฟเฉฑเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเฉเฅค
เจเฉฐเจเจฐเฉเจฒเจฐเจพเจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฌเจพเจฐเฉ เจฅเฉเฉเจพ เจเจฟเจนเจพ:
- เจชเจนเจฟเจฒเจพเจ, เจ เจธเฉเจ เจฆเฉ เจฎเฉเฉฑเจ เจตเจธเจคเฉเจเจ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเจพเจ - เจเจฐเจฟเฉฑเจก: เจเฉเจฎ = เจฎเฉเจฎเฉเจฐเฉ เจเฉเจฎ (), เจ เจคเฉ เจเจพเจฐเจกเจพเจ เจฆเจพ เจเฉฑเจ เจธเจฎเฉเจน: เจเจพเจฐเจก = [เจเจพเจฐเจก]()เฅค
- เจ เจธเฉเจ เจธเจผเฉเจฐเฉเจเจคเฉ เจตเฉเจฐเฉเจเจฌเจฒเจพเจ เจจเฉเฉฐ viewDidLoad เจฆเฉ เจคเฉเจฐ 'เจคเฉ เจธเฉเฉฑเจ เจเฉเจคเจพ เจนเฉ, เจเจน เจชเจนเจฟเจฒเจพ เจคเจฐเฉเจเจพ เจนเฉ เจเจฟเจธ เจจเฉเฉฐ เจเฉเจฎ เจฆเฉ เจเฉฑเจฒเจฆเฉ เจธเจฎเฉเจ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉเฅค
- เจเจฒเฉเจเจธเจผเจจ เจตเจฟเจ เจจเฉเฉฐ เจฒเฉเจเจพเจเจฃ เจฒเจ เจธเฉเฉฑเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเจฟเจเจเจเจฟ เจธเจพเจฐเฉ เจเจพเจฐเจก เจเจฆเฉเจ เจคเฉฑเจ เจฒเฉเจเฉ เจฐเจนเจฟเฉฐเจฆเฉ เจนเจจ เจเจฆเฉเจ เจคเฉฑเจ เจเจชเจญเฉเจเจคเจพ เจชเจฒเฉ เจจเจนเฉเจ เจฆเจฌเจพเจเจเจฆเฉเฅค
- เจเจฟเจตเฉเจ เจนเฉ เจ เจธเฉเจ 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)
}
}
เจเจ เจนเฉเจฃ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจฌเจพเจฐเฉ เจฅเฉเฉเฉ เจเฉฑเจฒ เจเจฐเฉเจ.
เจชเฉเจฐเฉเจเฉเจเฉเจฒ
เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจเจพ เจธเจตเจฟเจซเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจฆเจพ เจฎเฉเฉฑเจ เจนเจฟเฉฑเจธเจพ เจนเฉเฅค เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจเฉฑเจ เจเจฒเจพเจธ, เจฌเจฃเจคเจฐ, เจเจพเจ เจเจฃเจจเจพ เจฒเจ เจจเจฟเจฏเจฎเจพเจ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจจ เจฆเฉ เจฏเฉเจเจคเจพ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเฉ เจนเจจเฅค เจเจน เจธเจฟเจงเจพเจเจค เจคเฉเจนเจพเจจเฉเฉฐ เจฎเจพเจกเจฏเฉเจฒเจฐ เจ เจคเฉ เจเจเจธเจเฉเจเจธเฉเจฌเจฒ เจเฉเจก เจฒเจฟเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจตเจพเจธเจคเจต เจตเจฟเฉฑเจ, เจเจน เจเฉฑเจ เจชเฉเจเจฐเจจ เจนเฉ เจเฉ เจ เจธเฉเจ เจเฉเจฎเจเฉฐเจเจฐเฉเจฒเจฐ เจตเจฟเฉฑเจ เจเจฒเฉเจเจธเจผเจจเจตเจฟเจ เจฒเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจฒเจพเจเฉ เจเจฐ เจฐเจนเฉ เจนเจพเจเฅค เจเจ เจนเฉเจฃ เจเจชเจฃเจพ เจธเฉฐเจธเจเจฐเจฃ เจฌเจฃเจพเจเจเจฆเฉ เจนเจพเจเฅค เจธเฉฐเจเฉเจเจธ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจเจพเจ เจฆเฉเจตเฉเจเจพ:
protocol MemoryGameProtocol {
//protocol definition goes here
}
เจ เจธเฉเจ เจเจพเจฃเจฆเฉ เจนเจพเจ เจเจฟ เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเฉเจฒ เจธเจพเจจเฉเฉฐ เจเจฒเจพเจธ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฒเจ เจจเจฟเจฏเจฎเจพเจ เจเจพเจ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจเจธ เจฒเจ เจเจ เจเจธ เจฌเจพเจฐเฉ เจธเฉเจเฉเจ เจเจฟ เจเจน เจเฉ เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเจจเฅค เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเฉฑเจฒ เจเจพเจฐ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
- เจเฉเจฎ เจธเจผเฉเจฐเฉ: memoryGameDidStart.
- เจคเฉเจนเจพเจจเฉเฉฐ เจเจพเจฐเจก เจจเฉเฉฐ เจนเฉเจ เจพเจ เจตเฉฑเจฒ เจฎเฉเฉเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ: memoryGameShowCardsเฅค
- เจคเฉเจนเจพเจจเฉเฉฐ เจเจพเจฐเจก เจจเฉเฉฐ เจนเฉเจ เจพเจ เจตเฉฑเจฒ เจฎเฉเฉเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ: memoryGameHideCardsเฅค
- เจเฉเจฎ เจฆเจพ เจ เฉฐเจค: memoryGameDidEndเฅค
เจธเจพเจฐเฉ เจเจพเจฐ เจคเจฐเฉเจเจฟเจเจ เจจเฉเฉฐ เจฎเฉเฉฑเจ เจเจฒเจพเจธ เจฒเจ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจเฉ เจเจฟ เจเฉเจฎ เจเฉฐเจเจฐเฉเจฒเจฐ เจนเฉเฅค
memoryGameDidStart
เจเจฆเฉเจ เจเจน เจตเจฟเจงเฉ เจเจฒเจพเจ เจเจพเจเจฆเฉ เจนเฉ, เจคเจพเจ เจเฉเจฎ เจธเจผเฉเจฐเฉ เจนเฉ เจเจพเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเฉ (เจเจชเจญเฉเจเจคเจพ PLAY เจจเฉเฉฐ เจฆเจฌเจพเจเจฆเจพ เจนเฉ)เฅค เจเฉฑเจฅเฉ เจ เจธเฉเจ collectionView.reloadData() เจจเฉเฉฐ เจเจพเจฒ เจเจฐเจเฉ เจธเจฎเฉฑเจเจฐเฉ เจจเฉเฉฐ เจฎเฉเฉ เจฒเฉเจก เจเจฐเจพเจเจเฉ, เจเฉ เจเจพเจฐเจกเจพเจ เจจเฉเฉฐ เจฌเจฆเจฒ เจฆเฉเจตเฉเจเจพเฅค
func memoryGameDidStart(_ game: MemoryGame) {
collectionView.reloadData()
}
เจฎเฉเจฎเฉเจฐเฉ เจเฉเจฎเจธเจผเฉเจเจพเจฐเจกเจธ
เจ เจธเฉเจ เจเจธ เจตเจฟเจงเฉ เจจเฉเฉฐ collectionSDViewSelectItemAt เจคเฉเจ เจเจพเจฒ เจเจฐเจฆเฉ เจนเจพเจเฅค เจชเจนเจฟเจฒเจพเจ เจเจน เจเฉเจฃเจฟเจ เจเจพเจฐเจก เจฆเจฟเจเจพเจเจเจฆเจพ เจนเฉเฅค เจซเจฟเจฐ เจเจน เจฆเฉเจเจฃ เจฒเจ เจเจพเจเจ เจเจฐเจฆเจพ เจนเฉ เจเจฟ เจเฉ เจเจพเจฐเจก เจฆเจฟเจเจพเจ เจเจ เจเจฐเฉ เจตเจฟเฉฑเจ เจเฉเจ เจฎเฉเจฒ เจจเจนเฉเจ เจเจพเจเจฆเจพ เจเจพเจฐเจก เจนเฉ (เจเฉเจเจฐ เจฆเจฟเจเจพเจ เจเจ เจเจพเจฐเจกเจพเจ เจฆเฉ เจเจฟเจฃเจคเฉ เจ เจเฉเจฌ เจนเฉ)เฅค เจเฉเจเจฐ เจเฉฑเจ เจนเฉ, เจคเจพเจ เจเฉเจฃเฉ เจนเฉเจ เจเจพเจฐเจก เจฆเฉ เจคเฉเจฒเจจเจพ เจเจธ เจจเจพเจฒ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค เจเฉเจเจฐ เจคเจธเจตเฉเจฐเจพเจ เจเฉฑเจเฉ เจเจฟเจนเฉเจเจ เจนเจจ, เจคเจพเจ เจฆเฉเจตเฉเจ เจเจพเจฐเจก เจฆเจฟเจเจพเจ เจเจ เจเจพเจฐเจกเจพเจ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเจจ เจ เจคเฉ เจธเจพเจนเจฎเจฃเฉ เจฐเจนเจฟเฉฐเจฆเฉ เจนเจจเฅค เจเฉเจเจฐ เจตเฉฑเจเฉ-เจตเฉฑเจเจฐเฉ เจนเฉเฉฐเจฆเฉ เจนเจจ, เจคเจพเจ เจเจพเจฐเจก เจเฉฑเจกเฉ เจเจพเจฐเจก เจฆเจฟเจเจพเจ เจเจพเจเจฆเฉ เจนเจจ เจ เจคเฉ เจฆเฉเจตเฉเจ เจฎเฉเฉฐเจน เจนเฉเจ เจพเจ เจเจฐ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเจจเฅค
MemoryGameHideCards
เจเฉเจเจฐ เจเจพเจฐเจก เจฎเฉเจฒ เจจเจนเฉเจ เจเจพเจเจฆเฉ, เจคเจพเจ เจเจธ เจตเจฟเจงเฉ เจจเฉเฉฐ เจฌเฉเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ เจ เจคเฉ เจเจพเจฐเจก เจเจฟเฉฑเจคเจฐเจพเจ เจจเฉเฉฐ เจฒเฉเจเจพเจเจ เจเจพเจเจฆเจพ เจนเฉเฅค
เจฆเจฟเจเจพเจเจ = เจเฉเจ เจพเฅค
memoryGameDidEnd
เจเจฆเฉเจ เจเจธ เจตเจฟเจงเฉ เจจเฉเฉฐ เจฌเฉเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ, เจคเจพเจ เจเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจธเจพเจฐเฉ เจเจพเจฐเจก เจชเจนเจฟเจฒเจพเจ เจนเฉ เจชเฉเจฐเจเจ เจเฉเจคเฉ เจเจ เจนเจจ เจ เจคเฉ เจเจพเจฐเจก เจฆเจฟเจเจพเจ เจเจ เจธเฉเจเฉ เจตเจฟเฉฑเจ เจนเจจ: cardsShown.count = cards.count, เจเจธ เจฒเจ เจเฉเจก เจเจคเจฎ เจนเฉ เจเจ เจนเฉเฅค เจตเจฟเจงเฉ เจจเฉเฉฐ เจเจพเจธ เจคเฉเจฐ 'เจคเฉ เจเจฆเฉเจ เจฌเฉเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ เจเจฆเฉเจ เจ เจธเฉเจ isPlaying var เจจเฉเฉฐ เจเจฒเจค 'เจคเฉ เจธเฉเฉฑเจ เจเจฐเจจ เจฒเจ endGame() เจจเฉเฉฐ เจเจพเจฒ เจเจฐเจฆเฉ เจนเจพเจ, เจเจฟเจธ เจคเฉเจ เจฌเจพเจ เจฆ เจเฉเจฎ เจธเจฎเจพเจชเจคเฉ เจธเฉเจจเฉเจนเจพ เจฆเจฟเจเจพเจเจ เจเจพเจเจฆเจพ เจนเฉเฅค เจจเจพเจฒ เจนเฉ 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()
}
}
เจ
เจธเจฒ เจตเจฟเฉฑเจ, เจเจน เจธเจญ เจนเฉ. เจคเฉเจธเฉเจ เจเจธ เจชเฉเจฐเฉเจเฉเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจฎ เจฆเจพ เจเจชเจฃเจพ เจธเฉฐเจธเจเจฐเจฃ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค
เจนเฉเจชเฉ เจเฉเจกเจฟเฉฐเจ!
เจธเจเจฟเฉฑเจฒเจฌเจพเจเจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉ:
- เจชเฉเจฐเฉเจเจเฉเจเจฒ เจเฉเจฐเจธ
"เจฎเฉเจฌเจพเจเจฒ เจกเจฟเจตเฉเจฒเจชเจฐ เจชเฉเจฐเฉ" .- เจเจจเจฒเจพเจเจจ เจเฉเจฐเจธ เจ เจชเจฒเจพเจ เจเฉเจคเจพ
"เจชเจพเจเจฅเจจ เจกเฉเจเจพ เจเจจเจพเจฒเจฟเจธเจ" .- เจฆเฉ เจธเจพเจฒเจพ เจชเฉเจฐเฉเจเจเฉเจเจฒ เจเฉเจฐเจธ
"เจฎเฉเจ เจเฉฑเจ เจชเฉเจฐเฉ เจตเฉเฉฑเจฌ เจกเจฟเจตเฉเจฒเจชเจฐ เจนเจพเจ" .
เจธเจฐเฉเจค: www.habr.com