Ity lahatsoratra ity dia mamaritra ny fizotran'ny famoronana lalao fanofanana fahatsiarovana tsotra izay tena tiako. Ankoatra ny maha-tsara azy dia hianatra bebe kokoa momba ny kilasy Swift sy ny protocols ianao rehefa mandeha. Fa alohan'ny hanombohantsika dia aoka isika hahatakatra ny lalao mihitsy.
Ny lalao dia manomboka amin'ny fampisehoana karatra maromaro. Mandry miankohoka izy ireo (sary midina). Rehefa manindry na iza na iza ianao dia misokatra segondra vitsy ny sary.
Ny asan'ny mpilalao dia ny mitady karatra rehetra mitovy sary. Raha toa ka avadikao ny karatra faharoa aorian'ny fanokafana ny karatra voalohany ary mifanandrify ny sary, dia mbola misokatra ny karatra roa. Raha tsy mifanaraka izy ireo dia hikatona indray ny karatra. Ny tanjona dia ny hanokatra ny zava-drehetra.
Rafitra tetikasa
Mba hamoronana dikan-teny tsotra amin'ity lalao ity dia mila ireto singa manaraka ireto ianao:
Mpifehy iray: GameController.swift.
Fijery iray: CardCell.swift.
Modely roa: MemoryGame.swift sy Card.swift.
Main.storyboard mba hahazoana antoka fa misy ny fitambaran'ny singa rehetra.
Manomboka amin'ny singa tsotra indrindra amin'ny lalao isika, dia ny karatra.
Card.swift
Ny maodelin'ny karatra dia hanana toetra telo: id hamantarana ny tsirairay, faribolana boolean aseho hamaritana ny satan'ny karatra (miafina na misokatra), ary artworkURL ho an'ny sary eo amin'ny karatra.
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
Mila ireto fomba ireto koa ianao hifehezana ny fifandraisan'ny mpampiasa amin'ny sari-tany:
Fomba fanehoana sary amin'ny karatra. Eto dia averinay ho default ny fananana rehetra. Ho an'ny id dia mamorona id kisendrasendra izahay amin'ny fiantsoana ny NSUUIS().uuidString.
Ny maodely faharoa dia MemoryGame, eto dia mametraka grid 4 * 4 izahay. Ny maodely dia hanana fananana toy ny karatra (karatra maromaro eo amin'ny grid), karatra aseho miaraka amin'ny karatra efa misokatra, ary ny boolean variable isPlaying hanaraha-maso ny satan'ny lalao.
class MemoryGame {
var cards:[Card] = [Card]()
var cardsShown:[Card] = [Card]()
var isPlaying: Bool = false
}
Mila mamolavola fomba hifehezana ny fifandraisan'ny mpampiasa amin'ny grid ihany koa isika.
Fomba hamoronana lalao vaovao. Eto isika dia miantso ny fomba voalohany hanombohana ny drafitra voalohany ary manomboka ny fari-piadidiana isPlaying ho marina.
Ity fomba ity dia mamaky ny singa farany ao amin'ny **cardsShown** array ary mamerina ny karatra tsy mifanentana.
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 sy GameController.swift
Main.storyboard dia toa izao:
Amin'ny voalohany dia mila mametraka ny lalao vaovao ho viewDidLoad ao amin'ny controller ianao, anisan'izany ny sary ho an'ny grid. Ao amin'ny lalao, izany rehetra izany dia hisolo tena ny 4*4 collectionView. Raha mbola tsy zatra amin'ny collectionView ianao dia ity afaka mahazo ny vaovao ilainao ianao.
Hamboarinay ny GameController ho mpanara-maso ny fakany. Ny GameController dia hanana collectionView izay holazainay ho IBOutlet. Ny fanondroana iray hafa dia ny bokotra IBAction onStartGame(), ity dia UIButton, azonao jerena ao amin'ny solaitrabe antsoina hoe PLAY.
Nametraka ny variables voalohany ho viewDidLoad izahay, ity no fomba voalohany antsoina rehefa mandeha ny lalao.
Ny collectionView dia natao miafina satria nafenina avokoa ny karatra rehetra mandra-panery ny mpampiasa ny PLAY.
Raha vantany vao manindry ny PLAY izahay dia manomboka ny fizarana onStartGame IBAction, ary apetrakay ho diso ny fananana CollectionView isHidden mba ho hita ny karatra.
Isaky ny mifidy karatra ny mpampiasa dia antsoina ny fomba didSelectItemAt. Amin'ny fomba antsoina hoe didSelectCard hampihatra ny lojika lalao lehibe.
Andeha isika hiresaka kely momba ny protocols manan-danja.
Protocols
Ny fiasana amin'ny protocols no fototry ny fandaharana Swift. Ny protocols dia manome fahafahana mamaritra fitsipika ho an'ny kilasy, rafitra, na fanisana. Ity fitsipika ity dia ahafahanao manoratra code modular sy extensible. Raha ny marina, ity dia lamina efa apetrakay ho an'ny collectionView ao amin'ny GameController. Andeha isika hanao ny dikan-tsika manokana. Ny syntax dia ho toy izao:
protocol MemoryGameProtocol {
//protocol definition goes here
}
Fantatsika fa ny protocol dia mamela antsika hamaritra fitsipika na torolalana amin'ny fampiharana kilasy iray, ka andeha hojerentsika ny tokony ho izy. Mila efatra ianao amin'ny fitambarany.
Manomboka ny lalao: memoryGameDidStart.
Mila avadika midina ny karatra: memoryGameShowCards.
Mila avadika midina ny karatra: memoryGameHideCards.
Famaranana ny lalao: memoryGameDidEnd.
Ireo fomba efatra rehetra dia azo ampiharina amin'ny kilasy lehibe, dia ny GameController.
memoryGameDidStart
Rehefa mandeha io fomba io dia tokony hanomboka ny lalao (manindry ny PLAY ny mpampiasa). Eto isika dia hamerina fotsiny ny atiny amin'ny fiantsoana collectionView.reloadData(), izay hanodina ny karatra.
Antsoinay ity fomba ity avy amin'ny collectionSDViewSelectItemAt. Voalohany dia mampiseho ny karatra voafantina. Dia jereo raha misy karatra tsy mifanandrify ao amin'ny laharan'ny cardsShown (raha toa hafahafa ny isan'ny karatra aseho). Raha misy iray dia ampitahaina aminy ny karatra voafantina. Raha mitovy ny sary, dia ampiana amin'ny karatra Aseho ny karatra roa ary mijanona mitsangana. Raha tsy mitovy dia mamela karatra Aseho ny karatra ary avadika miondrika izy roa.
MemoryGameHideCards
Raha tsy mifanaraka ny karatra, dia antsoina io fomba io ary nafenina ny sary karatra.
aseho = diso.
memoryGameDidEnd
Rehefa antsoina io fomba io dia midika izany fa efa nambara ny karatra rehetra ary ao anatin'ny lisitry ny karatra aseho: cardsShown.count = cards.count, ka vita ny lalao. Ny fomba dia antsoina manokana taorian'ny niantsoanay endGame() hametraka ny isPlaying var ho diso, ary avy eo dia aseho ny hafatra fiafaran'ny lalao. Ny alertController koa dia ampiasaina ho famantarana ny controller. Nantsoina ny viewDidDisappear ary averina ny lalao.
Toy izao ny endriny rehetra ao amin'ny 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()
}
}
Raha ny marina dia izay ihany. Azonao atao ny mampiasa ity tetikasa ity mba hamoronana ny dikan-teninao manokana amin'ny lalao.