AtmiÅas karÅ”u spÄles rakstÄ«Å”ana programmÄ Swift
Å ajÄ rakstÄ ir aprakstÄ«ts vienkÄrÅ”as atmiÅas treniÅu spÄles izveides process, kas man ļoti patÄ«k. Papildus tam, ka tas pats par sevi ir labs, jÅ«s uzzinÄsit nedaudz vairÄk par Swift nodarbÄ«bÄm un protokoliem. Bet pirms sÄkam, sapratÄ«sim paÅ”u spÄli.
SpÄle sÄkas ar kÄrÅ”u komplekta demonstrÄciju. ViÅi guļ ar seju uz leju (attiecÄ«gi, attÄls uz leju). NoklikŔķinot uz jebkura, attÄls tiek atvÄrts uz dažÄm sekundÄm.
SpÄlÄtÄja uzdevums ir atrast visas kÄrtis ar vienÄdiem attÄliem. Ja pÄc pirmÄs kartÄ«tes atvÄrÅ”anas apgriežat otro un attÄli sakrÄ«t, abas kartÄ«tes paliek atvÄrtas. Ja tÄs nesakrÄ«t, kartes atkal tiek aizvÄrtas. MÄrÄ·is ir visu atvÄrt.
Projekta struktūra
Lai izveidotu vienkÄrÅ”u Ŕīs spÄles versiju, jums ir nepiecieÅ”ami Å”Ädi komponenti:
Viens kontrolieris: GameController.swift.
Viens skats: CardCell.swift.
Divi modeļi: MemoryGame.swift un Card.swift.
Main.storyboard, lai nodroÅ”inÄtu, ka ir pieejams viss komponentu komplekts.
MÄs sÄkam ar vienkÄrÅ”Äko spÄles sastÄvdaļu, kÄrtÄ«m.
Card.swift
Kartes modelim bÅ«s trÄ«s rekvizÄ«ti: ID, lai identificÄtu katru, BÅ«la mainÄ«gais, kas tiek rÄdÄ«ts, lai norÄdÄ«tu kartes statusu (slÄpts vai atvÄrts), un artworkURL kartÄ«tÄs esoÅ”ajiem attÄliem.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
Jums bÅ«s nepiecieÅ”amas arÄ« Ŕīs metodes, lai kontrolÄtu lietotÄja mijiedarbÄ«bu ar kartÄm:
Metode attÄla parÄdÄ«Å”anai kartÄ. Å eit mÄs atiestatÄm visus rekvizÄ«tus uz noklusÄjuma iestatÄ«jumiem. ID mÄs Ä£enerÄjam nejauÅ”u ID, izsaucot NSUUIS().uuidString.
Otrais modelis ir MemoryGame, Å”eit mÄs iestatÄm 4 * 4 režģi. Modelim bÅ«s tÄdi rekvizÄ«ti kÄ kÄrtis (karÅ”u masÄ«vs uz režģa), kÄrtis ParÄdÄ«ts masÄ«vs ar jau atvÄrtÄm kartÄm un BÅ«la mainÄ«gais isPlaying, lai izsekotu spÄles statusu.
class MemoryGame {
var cards:[Card] = [Card]()
var cardsShown:[Card] = [Card]()
var isPlaying: Bool = false
}
Mums ir arÄ« jÄizstrÄdÄ metodes, lai kontrolÄtu lietotÄju mijiedarbÄ«bu ar tÄ«klu.
Å Ä« metode nolasa pÄdÄjo elementu masÄ«vÄ **cardsShown** un atgriež neatbilstoÅ”o karti.
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 un GameController.swift
Main.storyboard izskatÄs apmÄram Å”Ädi:
SÄkotnÄji jums ir jÄiestata jaunÄ spÄle kontrollerÄ« kÄ viewDidLoad, ieskaitot režģa attÄlus. SpÄlÄ to visu pÄrstÄvÄs 4*4 kolekcijaView. Ja vÄl neesat pazÄ«stams ar collectionView, Å”eit tas ir jÅ«s varat iegÅ«t nepiecieÅ”amo informÄciju.
MÄs konfigurÄsim GameController kÄ lietojumprogrammas saknes kontrolieri. GameController bÅ«s kolekcijaSkats, ko mÄs atsaucÄsim kÄ IBOutlet. VÄl viena atsauce ir uz IBAction onStartGame() pogu, Ŕī ir UIBpoga, to var redzÄt scenÄrijÄ ar nosaukumu PLAY.
Mazliet par kontrolieru ievieŔanu:
PirmkÄrt, mÄs inicializÄjam divus galvenos objektus - režģi: spÄle = MemoryGame () un karÅ”u kopu: kartes = [Card] ().
SÄkotnÄjos mainÄ«gos iestatÄ«jÄm kÄ viewDidLoad, Ŕī ir pirmÄ metode, kas tiek izsaukta spÄles darbÄ«bas laikÄ.
collectionView ir iestatÄ«ts kÄ slÄpts, jo visas kartÄ«tes ir paslÄptas, lÄ«dz lietotÄjs nospiež PLAY.
TiklÄ«dz mÄs nospiežam PLAY, tiek sÄkta onStartGame IBAction sadaļa, un mÄs iestatÄm rekvizÄ«tu collectionView isHidden uz false, lai kartes varÄtu kļūt redzamas.
Katru reizi, kad lietotÄjs izvÄlas karti, tiek izsaukta metode didSelectItemAt. MetodÄ mÄs izsaucam didSelectCard, lai Ä«stenotu galveno spÄles loÄ£iku.
Tagad parunÄsim nedaudz par svarÄ«gajiem protokoliem.
Protokoli
Darbs ar protokoliem ir Swift programmÄÅ”anas pamatÄ. Protokoli nodroÅ”ina iespÄju definÄt noteikumus klasei, struktÅ«rai vai uzskaitei. Å is princips ļauj rakstÄ«t modulÄru un paplaÅ”inÄmu kodu. Faktiski Å”is ir modelis, ko mÄs jau ievieÅ”am CollectionView programmÄ GameController. Tagad izveidosim savu versiju. Sintakse izskatÄ«sies Å”Ädi:
protocol MemoryGameProtocol {
//protocol definition goes here
}
MÄs zinÄm, ka protokols ļauj mums definÄt noteikumus vai instrukcijas klases ievieÅ”anai, tÄpÄc padomÄsim, kÄdiem tiem vajadzÄtu bÅ«t. KopÄ vajag Äetrus.
SpÄles sÄkums: memoryGameDidStart.
Jums jÄpagriež karte ar priekÅ”pusi uz leju: memoryGameShowCards.
Jums jÄpagriež karte ar priekÅ”pusi uz leju: memoryGameHideCards.
SpÄles beigas: memoryGameDidEnd.
Visas Äetras metodes var ieviest galvenajai klasei, kas ir GameController.
memoryGameDidStart
Kad Ŕī metode tiek palaista, spÄlei jÄsÄkas (lietotÄjs nospiež PLAY). Å eit mÄs vienkÄrÅ”i pÄrlÄdÄsim saturu, izsaucot collectionView.reloadData(), kas sajauc kartÄ«tes.
MÄs Å”o metodi saucam no kolekcijasSDViewSelectItemAt. Vispirms tiek parÄdÄ«ta izvÄlÄtÄ karte. PÄc tam pÄrbauda, āāvai masÄ«vÄ cardsShown ir nesaskaÅota karte (ja ParÄdÄ«to kÄrÅ”u skaits ir nepÄra). Ja tÄda ir, izvÄlÄtÄ karte tiek salÄ«dzinÄta ar to. Ja attÄli ir vienÄdi, abas kÄrtis tiek pievienotas ParÄdÄ«tajÄm kartÄm un paliek ar attÄlu uz augÅ”u. Ja atŔķiras, kartÄ«te atstÄj kÄrtisParÄdÄ«tas un abas ir pagrieztas ar attÄlu uz leju.
memoryGameHideCards
Ja kartes nesakrÄ«t, tiek izsaukta Ŕī metode un karÅ”u attÄli tiek paslÄpti.
parÄdÄ«ts = nepatiess.
memoryGameDidEnd
Kad tiek izsaukta Ŕī metode, tas nozÄ«mÄ, ka visas kÄrtis jau ir atklÄtas un atrodas kÄrÅ”u sarakstÄShown: cardsShown.count = cards.count, tÄtad spÄle ir beigusies. Metode tiek Ä«paÅ”i izsaukta pÄc tam, kad esam izsaukuÅ”i endGame(), lai iestatÄ«tu isPlaying var uz false, pÄc tam tiek parÄdÄ«ts spÄles beigu ziÅojums. ArÄ« alertController tiek izmantots kÄ kontrollera indikators. Tiek izsaukts viewDidDisappar un spÄle tiek atiestatÄ«ta.
LÅ«k, kÄ tas viss izskatÄs 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()
}
}
PatiesÄ«bÄ tas arÄ« viss. Varat izmantot Å”o projektu, lai izveidotu savu spÄles versiju.