Dan l-artikolu jiddeskrivi l-proċess tal-ħolqien ta 'logħba sempliċi ta' taħriġ tal-memorja li nħobb ħafna. Minbarra li tkun tajba fiha nnifisha, titgħallem ftit aktar dwar il-klassijiet u l-protokolli Swift kif tmur. Iżda qabel ma nibdew, ejja nifhmu l-logħba nnifisha.
Infakkrukom:għall-qarrejja kollha ta '"Habr" - skont ta' 10 rublu meta tirreġistra fi kwalunkwe kors ta 'Skillbox billi tuża l-kodiċi promozzjonali "Habr".
Il-logħba tibda b'dimostrazzjoni ta' sett ta' karti. Huma jimteddu wiċċ 'l isfel (rispettivament, immaġni 'l isfel). Meta tikklikkja fuq kwalunkwe waħda, l-immaġni tiftaħ għal ftit sekondi.
Il-kompitu tal-plejer huwa li jsib il-karti kollha bl-istess stampi. Jekk, wara li tiftaħ l-ewwel karta, taqleb it-tieni u l-istampi jaqblu, iż-żewġ karti jibqgħu miftuħa. Jekk ma jaqblux, il-karti jerġgħu jingħalqu. L-għan huwa li tiftaħ kollox.
Struttura tal-proġett
Biex toħloq verżjoni sempliċi ta 'din il-logħba għandek bżonn il-komponenti li ġejjin:
Kontrollur wieħed: GameController.swift.
One View: CardCell.swift.
Żewġ Mudelli: MemoryGame.swift u Card.swift.
Main.storyboard biex jiġi żgurat li s-sett kollu ta 'komponenti huwa disponibbli.
Nibdew bl-aktar komponent sempliċi tal-logħba, il-karti.
Card.swift
Il-mudell tal-karta se jkollu tliet proprjetajiet: id biex tidentifika kull waħda, varjabbli boolean murija biex tispeċifika l-istatus tal-karta (moħbija jew miftuħa), u artworkURL għall-immaġini fuq il-karti.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
Ikollok bżonn ukoll dawn il-metodi biex tikkontrolla l-interazzjoni tal-utent mal-mapep:
Metodu għall-wiri ta 'immaġni fuq karta. Hawnhekk irrisettjaw il-proprjetajiet kollha għal default. Għall-id, niġġeneraw id każwali billi nsejħu NSUUIS().uuidString.
It-tieni mudell huwa MemoryGame, hawn waqqafna grilja 4 * 4. Il-mudell se jkollu proprjetajiet bħal karti (firxa ta 'karti fuq grilja), firxa ta' kardsShown b'karti diġà miftuħa, u varjabbli boolean qed Playing biex issegwi l-istatus tal-logħba.
class MemoryGame {
var cards:[Card] = [Card]()
var cardsShown:[Card] = [Card]()
var isPlaying: Bool = false
}
Għandna bżonn ukoll li niżviluppaw metodi biex nikkontrollaw l-interazzjoni tal-utent mal-grid.
Dan il-metodu jaqra l-aħħar element fil-firxa **cardsShown** u jirritorna l-karta li ma taqbilx.
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 u GameController.swift
Main.storyboard jidher xi ħaġa bħal din:
Inizjalment, għandek bżonn issettja l-logħba l-ġdida bħala viewDidLoad fil-kontrollur, inklużi l-immaġini għall-grilja. Fil-logħba, dan kollu se jkun rappreżentat minn 4 * 4 collectionView. Jekk għadek m'intix familjari ma' collectionView, hawnhekk qiegħed tista' tikseb l-informazzjoni li għandek bżonn.
Aħna ser tikkonfigura l-GameController bħala l-kontrollur tal-għeruq tal-applikazzjoni. Il-GameController se jkollu collectionView li se nirreferuha bħala IBOutlet. Referenza oħra hija għall-buttuna IBAction onStartGame(), din hija UIButton, tista 'taraha fl-istoryboard imsejjaħ PLAY.
Ftit dwar l-implimentazzjoni tal-kontrolluri:
L-ewwel, aħna initialize żewġ oġġetti ewlenin - il-grid: logħba = MemoryGame (), u sett ta 'karti: karti = [Kard] ().
Aħna waqqafna l-varjabbli inizjali bħala viewDidLoad, dan huwa l-ewwel metodu li jissejjaħ waqt li l-logħba tkun qed taħdem.
collectionView huwa ssettjat biex moħbi għaliex il-karti kollha huma moħbija sakemm l-utent jagħfas PLAY.
Hekk kif nagħfsu PLAY, tibda s-sezzjoni onStartGame IBAction, u nissettjaw il-proprjetà collectionView isHidden għal falza sabiex il-karti jkunu jistgħu jsiru viżibbli.
Kull darba li l-utent jagħżel karta, jissejjaħ il-metodu didSelectItemAt. Fil-metodu li nsejħu didSelectCard biex timplimenta l-loġika tal-logħba prinċipali.
Hawnhekk hawn l-implimentazzjoni finali tal-GameController:
Issa ejja nitkellmu ftit dwar il-protokolli importanti.
Protokolli
Il-ħidma bi protokolli hija l-qalba tal-ipprogrammar Swift. Protokolli jipprovdu l-abbiltà li jiddefinixxu regoli għal klassi, struttura, jew enumerazzjoni. Dan il-prinċipju jippermettilek tikteb kodiċi modulari u estensibbli. Fil-fatt, dan huwa mudell li diġà qed nimplimentaw għal collectionView fil-GameController. Issa ejja nagħmlu l-verżjoni tagħna stess. Is-sintassi se tidher bħal din:
protocol MemoryGameProtocol {
//protocol definition goes here
}
Aħna nafu li protokoll jippermettilna niddefinixxu regoli jew struzzjonijiet għall-implimentazzjoni ta 'klassi, allura ejja naħsbu dwar x'għandhom ikunu. Għandek bżonn erbgħa b'kollox.
Bidu tal-logħba: memoryGameDidStart.
Trid iddawwar il-karta wiċċ l-isfel: memoryGameShowCards.
Trid iddawwar il-karta wiċċ l-isfel: memoryGameHideCards.
Tmiem tal-logħba: memoryGameDidEnd.
L-erba 'metodi kollha jistgħu jiġu implimentati għall-klassi prinċipali, li hija GameController.
memoryGameDidStart
Meta dan il-metodu jitmexxa, il-logħba għandha tibda (l-utent jagħfas PLAY). Hawnhekk aħna sempliċiment nerġgħu ngħaġġu l-kontenut billi nsejħu collectionView.reloadData(), li se shuffle l-karti.
Aħna nsejħu dan il-metodu minn collectionSDViewSelectItemAt. L-ewwel turi l-karta magħżula. Imbagħad jiċċekkja biex tara jekk hemmx karta mhux imqabbla fil-firxa cardsShown (jekk in-numru ta 'cardsShown huwiex fard). Jekk hemm waħda, il-karta magħżula titqabbel magħha. Jekk l-istampi huma l-istess, iż-żewġ karti jiżdiedu mal-karti murija u jibqgħu wiċċhom 'il fuq. Jekk differenti, il-karta tħalli l-karti murija u t-tnejn jinqalbu wiċċhom 'l isfel.
memoryGameHideCards
Jekk il-karti ma jaqblux, dan il-metodu jissejjaħ u l-immaġini tal-karti huma moħbija.
muri = falz.
memoryGameDidEnd
Meta jissejjaħ dan il-metodu, dan ifisser li l-karti kollha huma diġà żvelati u jinsabu fil-lista tal-kartiShown: cardsShown.count = cards.count, għalhekk il-logħba spiċċat. Il-metodu jissejjaħ speċifikament wara li sejjaħna endGame() biex tissettja l-isPlaying var għal falza, u wara jintwera l-messaġġ tat-tmiem tal-logħba. Ukoll alertController jintuża bħala indikatur għall-kontrollur. viewDidDisappear tissejjaħ u l-logħba hija reset.
Hawn kif jidher kollu f'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()
}
}
Fil-fatt, dak kollu. Tista 'tuża dan il-proġett biex toħloq il-verżjoni tiegħek tal-logħba.