Bu məqalə mənim çox bəyəndiyim sadə yaddaş təlimi oyununun yaradılması prosesini təsvir edir. Özlüyündə yaxşı olmaqdan əlavə, getdikcə Swift dərsləri və protokolları haqqında bir az daha çox öyrənəcəksiniz. Ancaq başlamazdan əvvəl oyunun özünü anlayaq.
Xatırladırıq:"Habr" ın bütün oxucuları üçün - "Habr" promosyon kodundan istifadə edərək hər hansı bir Skillbox kursuna yazılarkən 10 000 rubl endirim.
Oyun bir sıra kartların nümayişi ilə başlayır. Üzüstə uzanırlar (müvafiq olaraq, şəkil aşağı). Hər hansı birinin üzərinə kliklədiyiniz zaman şəkil bir neçə saniyə ərzində açılır.
Oyunçunun vəzifəsi eyni şəkilləri olan bütün kartları tapmaqdır. Birinci kartı açdıqdan sonra ikincini çevirsəniz və şəkillər uyğun gəlsə, hər iki kart açıq qalır. Əgər onlar uyğun gəlmirsə, kartlar yenidən bağlanır. Məqsəd hər şeyi açmaqdır.
Layihə strukturu
Bu oyunun sadə versiyasını yaratmaq üçün sizə aşağıdakı komponentlər lazımdır:
Bir Nəzarətçi: GameController.swift.
Bir Görünüş: CardCell.swift.
İki Model: MemoryGame.swift və Card.swift.
Bütün komponentlər dəstinin mövcud olmasını təmin etmək üçün Main.storyboard.
Oyunun ən sadə komponenti olan kartlardan başlayırıq.
Card.swift
Kart modelinin üç xassələri olacaq: hər birini müəyyən etmək üçün id, kartın statusunu təyin etmək üçün göstərilən mantiq dəyişəni (gizli və ya açıq) və kartlardakı şəkillər üçün artworkURL.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
İstifadəçinin xəritələrlə qarşılıqlı əlaqəsini idarə etmək üçün sizə bu üsullara da ehtiyacınız olacaq:
Kartda təsvirin göstərilməsi üsulu. Burada bütün xassələri standart vəziyyətə qaytarırıq. İd üçün NSUUIS().uuidString zəng edərək təsadüfi id yaradırıq.
İkinci model MemoryGame-dir, burada biz 4*4 şəbəkə qurduq. Model kartlar (torda olan kartlar massivi), artıq açıq kartları olan cardsShown massivi və oyunun statusunu izləmək üçün isPlaying boolean dəyişəni kimi xüsusiyyətlərə malik olacaq.
class MemoryGame {
var cards:[Card] = [Card]()
var cardsShown:[Card] = [Card]()
var isPlaying: Bool = false
}
Biz həmçinin istifadəçinin şəbəkə ilə qarşılıqlı əlaqəsini idarə etmək üçün metodlar hazırlamalıyıq.
Bu üsul **cardsShown** massivindəki sonuncu elementi oxuyur və uyğun olmayan kartı qaytarır.
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 və GameController.swift
Main.storyboard belə görünür:
Əvvəlcə yeni oyunu, şəbəkə üçün şəkillər də daxil olmaqla, nəzarətçidə viewDidLoad kimi təyin etməlisiniz. Oyunda bütün bunlar 4*4 collectionView ilə təmsil olunacaq. CollectionView ilə hələ tanış deyilsinizsə, budur lazım olan məlumatları əldə edə bilərsiniz.
Biz GameController-i proqramın kök nəzarətçisi kimi konfiqurasiya edəcəyik. GameController-də IBOutlet kimi istinad edəcəyimiz kolleksiya Görünüşü olacaq. Başqa bir istinad IBAction onStartGame() düyməsidir, bu UIButtondur, siz onu PLAY adlı hekayə lövhəsində görə bilərsiniz.
Nəzarətçilərin tətbiqi haqqında bir az:
Əvvəlcə iki əsas obyekti işə salırıq - şəbəkə: oyun = MemoryGame() və bir sıra kartlar: kartlar = [Kart]().
İlkin dəyişənləri viewDidLoad olaraq təyin etdik, bu, oyun işləyərkən çağırılan ilk üsuldur.
collectionView gizli olaraq təyin edilib, çünki istifadəçi PLAY düyməsini basana qədər bütün kartlar gizlədilir.
PLAY düyməsini basan kimi onStartGame IBAction bölməsi başlayır və biz collectionView isHidden xüsusiyyətini false olaraq təyin edirik ki, kartların görünməsi mümkün olsun.
İstifadəçi hər dəfə kartı seçəndə didSelectItemAt metodu çağırılır. Əsas oyun məntiqini həyata keçirmək üçün didSelectCard adlandırdığımız metodda.
Protokollarla işləmək Swift proqramlaşdırmasının əsasını təşkil edir. Protokollar sinif, struktur və ya siyahıyaalma üçün qaydaları müəyyən etmək imkanı verir. Bu prinsip modul və genişləndirilə bilən kodu yazmağa imkan verir. Əslində, bu, GameController-də collectionView üçün artıq tətbiq etdiyimiz nümunədir. İndi öz versiyamızı yaradaq. Sintaksis belə görünəcək:
protocol MemoryGameProtocol {
//protocol definition goes here
}
Biz bilirik ki, protokol bizə bir sinfi həyata keçirmək üçün qaydaları və ya təlimatları müəyyən etməyə imkan verir, ona görə də onların nə olması lazım olduğunu düşünək. Sizə cəmi dörd lazımdır.
Oyunun başlanğıcı: yaddaşGameDidStart.
Siz kartı üzü aşağı çevirməlisiniz: memoryGameShowCards.
Kartın üzünü aşağı çevirməlisiniz: memoryGameHideCards.
Oyunun sonu: yaddaşGameDidEnd.
Bütün dörd üsul GameController olan əsas sinif üçün həyata keçirilə bilər.
yaddaşGameDidStart
Bu üsul işə salındıqda oyun başlamalıdır (istifadəçi PLAY düyməsini basır). Burada sadəcə olaraq, kartları qarışdıracaq collectionView.reloadData() çağıraraq məzmunu yenidən yükləyəcəyik.
Biz bu metodu collectionSDViewSelectItemAt-dan çağırırıq. Əvvəlcə seçilmiş kartı göstərir. Sonra cardsShown massivində (göstərilən kartların sayı təkdirsə) bənzərsiz kartın olub olmadığını yoxlayır. Əgər varsa, seçilmiş kart onunla müqayisə edilir. Şəkillər eyni olarsa, hər iki kart Göstərilən kartlara əlavə edilir və üzü yuxarı qalır. Əgər fərqlidirsə, kart kartları Göstərilir və hər ikisi üzü aşağı çevrilir.
yaddaşGameGameCards
Kartlar uyğun gəlmirsə, bu üsul çağırılır və kart şəkilləri gizlədilir.
göstərilir = yalan.
yaddaşGameDidEnd
Bu üsul çağırıldıqda, bu, bütün kartların artıq aşkar edildiyini və kartların Göstərilən siyahısında olduğunu bildirir: cardsShown.count = cards.count, beləliklə, oyun bitdi. Metod xüsusi olaraq isPlaying var parametrini false kimi təyin etmək üçün endGame() funksiyasını çağırdıqdan sonra çağırılır, bundan sonra oyunun bitmə mesajı göstərilir. Həmçinin alertController nəzarətçi üçün göstərici kimi istifadə olunur. viewDidDisappear çağırılır və oyun yenidən qurulur.
GameController-də hər şey belə görünür:
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()
}
}
Əslində, hamısı budur. Oyunun öz versiyasını yaratmaq üçün bu layihədən istifadə edə bilərsiniz.