Kuandika Mchezo wa Kadi za Kumbukumbu katika Swift
Nakala hii inaelezea mchakato wa kuunda mchezo rahisi wa mafunzo ya kumbukumbu ambao ninaupenda sana. Kando na kuwa mzuri yenyewe, utajifunza zaidi kuhusu madarasa na itifaki za Swift unapoendelea. Lakini kabla ya kuanza, hebu tuelewe mchezo wenyewe.
Tunakukumbusha:kwa wasomaji wote wa "Habr" - punguzo la rubles 10 wakati wa kujiandikisha katika kozi yoyote ya Skillbox kwa kutumia msimbo wa uendelezaji wa "Habr".
Mchezo huanza na onyesho la seti ya kadi. Wanalala chini (kwa mtiririko huo, picha chini). Unapobofya yoyote, picha inafungua kwa sekunde chache.
Kazi ya mchezaji ni kupata kadi zote zilizo na picha sawa. Ikiwa, baada ya kufungua kadi ya kwanza, unageuka ya pili na picha zinafanana, kadi zote mbili zinabaki wazi. Ikiwa hazifanani, kadi zimefungwa tena. Lengo ni kufungua kila kitu.
Muundo wa mradi
Ili kuunda toleo rahisi la mchezo huu unahitaji vifaa vifuatavyo:
Kidhibiti kimoja: GameController.swift.
Mtazamo Mmoja: CardCell.swift.
Miundo miwili: MemoryGame.swift na Card.swift.
Main.storyboard ili kuhakikisha kuwa seti nzima ya vipengele inapatikana.
Tunaanza na sehemu rahisi zaidi ya mchezo, kadi.
Kadi.mwepesi
Muundo wa kadi utakuwa na sifa tatu: kitambulisho cha kutambua kila moja, kigezo cha boolean kinachoonyeshwa ili kubainisha hali ya kadi (iliyofichwa au iliyofunguliwa), na URL ya mchoro kwa picha zilizo kwenye kadi.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
Utahitaji pia njia hizi ili kudhibiti mwingiliano wa watumiaji na ramani:
Njia ya kuonyesha picha kwenye kadi. Hapa tunaweka upya mali zote kuwa chaguo-msingi. Kwa kitambulisho, tunatoa kitambulisho nasibu kwa kupiga simu NSUUIS().uuidString.
Mfano wa pili ni MemoryGame, hapa tunaweka gridi ya 4 * 4. Muundo huo utakuwa na sifa kama vile kadi (safu ya kadi kwenye gridi ya taifa), safu ya kadi zinazoonyeshwa na kadi tayari zimefunguliwa, na kigezo cha boolean kinacheza ili kufuatilia hali ya mchezo.
class MemoryGame {
var cards:[Card] = [Card]()
var cardsShown:[Card] = [Card]()
var isPlaying: Bool = false
}
Tunahitaji pia kuunda mbinu za kudhibiti mwingiliano wa watumiaji na gridi ya taifa.
Njia ambayo huchanganya kadi kwenye gridi ya taifa.
Mbinu hii husoma kipengele cha mwisho katika safu ya **kadiZilizoonyeshwa** na kurejesha kadi isiyolingana.
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()
}
}
Ubao.kuu wa hadithi na GameController.mwepesi
Main.storyboard inaonekana kitu kama hiki:
Hapo awali, unahitaji kuweka mchezo mpya kama viewDidLoad katika kidhibiti, ikijumuisha picha za gridi ya taifa. Katika mchezo, yote haya yatawakilishwa na 4*4 collectionView. Ikiwa bado haujafahamu collectionView, hii hapa unaweza kupata habari unayohitaji.
Tutasanidi GameController kama kidhibiti kikuu cha programu. GameController itakuwa na collectionView ambayo tutarejelea kama IBOutlet. Rejea nyingine ni kitufe cha IBAction onStartGame(), hii ni UIButton, unaweza kuiona kwenye ubao wa hadithi inayoitwa PLAY.
Kidogo juu ya utekelezaji wa vidhibiti:
Kwanza, tunaanzisha vitu viwili kuu - gridi ya taifa: mchezo = MemoryGame (), na seti ya kadi: kadi = [Kadi] ().
Tunaweka vigezo vya awali kama viewDidLoad, hii ndiyo njia ya kwanza inayoitwa wakati mchezo unaendelea.
collectionView imewekwa kufichwa kwa sababu kadi zote zimefichwa hadi mtumiaji abonyeze PLAY.
Mara tu tunapobonyeza PLAY, sehemu ya onStartGame IBAction huanza, na tunaweka collectionView isHidden mali kuwa sivyo ili kadi ziweze kuonekana.
Kila wakati mtumiaji anachagua kadi, mbinu ya didSelectItemAt inaitwa. Katika njia tunayoita didSelectCard kutekeleza mantiki kuu ya mchezo.
Huu hapa ni utekelezaji wa mwisho wa GameController:
Sasa hebu tuzungumze kidogo kuhusu itifaki muhimu.
Itifaki
Kufanya kazi na itifaki ndio msingi wa programu ya Swift. Itifaki hutoa uwezo wa kufafanua sheria za darasa, muundo au hesabu. Kanuni hii hukuruhusu kuandika msimbo wa kawaida na wa kupanuka. Kwa kweli, huu ni muundo ambao tayari tunatekeleza kwa mkusanyikoTazama katika GameController. Sasa hebu tufanye toleo letu wenyewe. Syntax itaonekana kama hii:
protocol MemoryGameProtocol {
//protocol definition goes here
}
Tunajua kuwa itifaki huturuhusu kufafanua sheria au maagizo ya utekelezaji wa darasa, kwa hivyo hebu tufikirie jinsi zinafaa kuwa. Unahitaji nne kwa jumla.
Mwanzo wa mchezo: memoryGameDidStart.
Unahitaji kugeuza kadi uso chini: memoryGameShowCards.
Unahitaji kugeuza kadi uso chini: memoryGameHideCards.
Mwisho wa mchezo: memoryGameDidEnd.
Njia zote nne zinaweza kutekelezwa kwa darasa kuu, ambalo ni GameController.
memoryGameDidStart
Wakati njia hii inaendeshwa, mchezo unapaswa kuanza (mtumiaji bonyeza PLAY). Hapa tutapakia upya maudhui kwa kupiga simu collectionView.reloadData(), ambayo itachanganya kadi.
Tunaita njia hii kutoka kwa collectionSDViewSelectItemAt. Kwanza inaonyesha kadi iliyochaguliwa. Kisha angalia ili kuona kama kuna kadi isiyolinganishwa katika safu ya kadiInayoonyeshwa (ikiwa idadi ya kadiIliyoonyeshwa ni isiyo ya kawaida). Ikiwa kuna moja, kadi iliyochaguliwa inalinganishwa nayo. Ikiwa picha ni sawa, kadi zote mbili huongezwa kwenye kadi Zilizoonyeshwa na kubaki zimetazamana. Ikiwa ni tofauti, kadi huacha kadi Imeonyeshwa na zote mbili zimegeuzwa kifudifudi.
kumbukumbuMchezoFichaKadi
Ikiwa kadi hazifanani, njia hii inaitwa na picha za kadi zimefichwa.
imeonyeshwa = uongo.
memoryGameDidEnd
Njia hii inapoitwa, inamaanisha kuwa kadi zote tayari zimefichuliwa na ziko kwenye orodha ya kadi zilizoonyeshwa: cardsShown.count = cards.count, hivyo mchezo umeisha. Njia hiyo inaitwa mahususi baada ya sisi kuita endGame() kuweka isPlaying var kuwa sivyo, kisha ujumbe wa mwisho wa mchezo utaonyeshwa. Pia alertController inatumika kama kiashirio cha kidhibiti. viewDidDispear inaitwa na mchezo umewekwa upya.
Hivi ndivyo inavyoonekana katika 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()
}
}
Kweli, hiyo ndiyo yote. Unaweza kutumia mradi huu kuunda toleo lako la mchezo.