Artikel ini menerangkan proses mencipta permainan latihan memori mudah yang saya sangat suka. Selain menjadi baik dengan sendirinya, anda akan mempelajari lebih sedikit tentang kelas dan protokol Swift semasa anda pergi. Tetapi sebelum kita mula, mari kita fahami permainan itu sendiri.
Kami mengingatkan:untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".
Permainan dimulakan dengan demonstrasi set kad. Mereka berbaring menghadap ke bawah (masing-masing, imej ke bawah). Apabila anda mengklik pada mana-mana satu, imej terbuka selama beberapa saat.
Tugas pemain adalah untuk mencari semua kad dengan gambar yang sama. Jika, selepas membuka kad pertama, anda membelek yang kedua dan gambar sepadan, kedua-dua kad kekal terbuka. Jika mereka tidak sepadan, kad ditutup semula. Matlamatnya adalah untuk membuka segala-galanya.
Struktur projek
Untuk mencipta versi ringkas permainan ini, anda memerlukan komponen berikut:
Satu Pengawal: GameController.swift.
Satu Pandangan: CardCell.swift.
Dua Model: MemoryGame.swift dan Card.swift.
Main.storyboard untuk memastikan keseluruhan set komponen tersedia.
Kita mulakan dengan komponen permainan yang paling mudah, kad.
Card.swift
Model kad akan mempunyai tiga sifat: id untuk mengenal pasti setiap satu, pembolehubah boolean yang ditunjukkan untuk menentukan status kad (tersembunyi atau terbuka), dan artworkURL untuk imej pada kad.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
Anda juga memerlukan kaedah ini untuk mengawal interaksi pengguna dengan peta:
Kaedah untuk memaparkan imej pada kad. Di sini kami menetapkan semula semua sifat kepada lalai. Untuk id, kami menjana id rawak dengan memanggil NSUUIS().uuidString.
Model kedua ialah MemoryGame, di sini kami menetapkan grid 4*4. Model ini akan mempunyai sifat seperti kad (susunan kad pada grid), tatasusunan cardShown dengan kad telah dibuka dan pembolehubah boolean isPlaying untuk menjejaki status permainan.
class MemoryGame {
var cards:[Card] = [Card]()
var cardsShown:[Card] = [Card]()
var isPlaying: Bool = false
}
Kami juga perlu membangunkan kaedah untuk mengawal interaksi pengguna dengan grid.
Kaedah untuk mencipta permainan baharu. Di sini kami memanggil kaedah pertama untuk memulakan susun atur awal dan memulakan pembolehubah isPlaying kepada benar.
Kaedah ini membaca elemen terakhir dalam tatasusunan **cardsShown** dan mengembalikan kad yang tidak sepadan.
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 dan GameController.swift
Main.storyboard kelihatan seperti ini:
Pada mulanya, anda perlu menetapkan permainan baharu sebagai viewDidLoad dalam pengawal, termasuk imej untuk grid. Dalam permainan, semua ini akan diwakili oleh 4*4 collectionView. Jika anda belum biasa dengan collectionView, inilah dia anda boleh mendapatkan maklumat yang anda perlukan.
Kami akan mengkonfigurasi GameController sebagai pengawal akar aplikasi. GameController akan mempunyai collectionView yang akan kami rujuk sebagai IBOutlet. Rujukan lain ialah pada butang IBAction onStartGame(), ini adalah UIButton, anda boleh melihatnya dalam papan cerita yang dipanggil PLAY.
Sedikit mengenai pelaksanaan pengawal:
Mula-mula, kami memulakan dua objek utama - grid: permainan = MemoryGame(), dan satu set kad: kad = [Kad]().
Kami menetapkan pembolehubah awal sebagai viewDidLoad, ini adalah kaedah pertama yang dipanggil semasa permainan sedang berjalan.
collectionView ditetapkan kepada tersembunyi kerana semua kad disembunyikan sehingga pengguna menekan PLAY.
Sebaik sahaja kami menekan PLAY, bahagian onStartGame IBAction bermula dan kami menetapkan sifat collectionView isHidden kepada palsu supaya kad boleh kelihatan.
Setiap kali pengguna memilih kad, kaedah didSelectItemAt dipanggil. Dalam kaedah yang kami panggil didSelectCard untuk melaksanakan logik permainan utama.
Berikut ialah pelaksanaan GameController terakhir:
Sekarang mari kita bercakap sedikit tentang protokol penting.
Protokol
Bekerja dengan protokol adalah teras pengaturcaraan Swift. Protokol menyediakan keupayaan untuk menentukan peraturan untuk kelas, struktur atau penghitungan. Prinsip ini membolehkan anda menulis kod modular dan boleh diperluaskan. Malah, ini ialah corak yang kami sudah laksanakan untuk collectionView dalam GameController. Sekarang mari kita buat versi kita sendiri. Sintaks akan kelihatan seperti ini:
protocol MemoryGameProtocol {
//protocol definition goes here
}
Kami tahu bahawa protokol membolehkan kami mentakrifkan peraturan atau arahan untuk melaksanakan kelas, jadi mari kita fikirkan apa yang sepatutnya. Anda memerlukan empat secara keseluruhan.
Permulaan permainan: memoryGameDidStart.
Anda perlu membalikkan kad ke bawah: memoryGameShowCards.
Anda perlu membalikkan kad ke bawah: memoryGameHideCards.
Tamat permainan: memoryGameDidEnd.
Keempat-empat kaedah boleh dilaksanakan untuk kelas utama, iaitu GameController.
memoryGameDidStart
Apabila kaedah ini dijalankan, permainan harus dimulakan (pengguna menekan PLAY). Di sini kami hanya akan memuatkan semula kandungan dengan memanggil collectionView.reloadData(), yang akan mengocok kad.
Kami memanggil kaedah ini daripada collectionSDViewSelectItemAt. Mula-mula ia menunjukkan kad yang dipilih. Kemudian semak untuk melihat sama ada terdapat kad yang tidak sepadan dalam tatasusunan cardsShown (jika bilangan kadShown ganjil). Jika ada, kad yang dipilih akan dibandingkan dengannya. Jika gambar adalah sama, kedua-dua kad ditambahkan pada kad yang Ditunjukkan dan kekal menghadap ke atas. Jika berbeza, kad itu meninggalkan kad Ditunjukkan dan kedua-duanya menghadap ke bawah.
memoryGameHideKad
Jika kad tidak sepadan, kaedah ini dipanggil dan imej kad disembunyikan.
ditunjukkan = palsu.
memoryGameDidEnd
Apabila kaedah ini dipanggil, ini bermakna semua kad telah didedahkan dan berada dalam senarai kadShown: cardsShown.count = cards.count, jadi permainan tamat. Kaedah ini dipanggil secara khusus selepas kami memanggil endGame() untuk menetapkan isPlaying var kepada false, selepas itu mesej tamat permainan ditunjukkan. Juga alertController digunakan sebagai penunjuk untuk pengawal. viewDidDisappear dipanggil dan permainan ditetapkan semula.
Inilah rupa semuanya dalam 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()
}
}
Sebenarnya, itu sahaja. Anda boleh menggunakan projek ini untuk mencipta versi permainan anda sendiri.