Kunyora Memory Cards Game muSwift

Kunyora Memory Cards Game muSwift

Ichi chinyorwa chinotsanangura maitiro ekugadzira iri nyore ndangariro yekudzidzira mutambo wandinoda chaizvo. Kunze kwekuve wakanaka pachako, iwe uchadzidza zvishoma nezve Swift makirasi uye mapuroteni paunenge uchienda. Asi tisati tatanga, ngatinzwisise mutambo wacho pachawo.

Tinoyeuchidza: kune vese vaverengi veHabr - a 10 ruble mutengo paunenge uchinyoresa mune chero Skillbox kosi uchishandisa iyo Habr promo kodhi.

Skillbox inokurudzira: Dzidzo yepamhepo kosi "Professional Java developer".

Maitiro ekutamba Memory Card

Mutambo unotanga nekuratidzwa kwekadhi yemakadhi. Vanorara vakatarisa pasi (zvichitevera, mufananidzo pasi). Paunodzvanya pane chero ipi zvayo, mufananidzo wacho unovhurika kwemasekonzi mashoma.

Basa remutambi nderekutsvaga makadhi ese ane mifananidzo yakafanana. Kana, mushure mekuvhura kadhi rekutanga, ukatenderedza rechipiri uye mifananidzo ichienderana, makadhi ese ari maviri anoramba akavhurika. Kana zvisingaenderane, makadhi anovharwa zvakare. Chinangwa ndechekuvhura zvese.

Chirongwa cheprojekiti

Kugadzira iri nyore vhezheni yemutambo uyu unoda zvinotevera zvikamu:

  • Mumwe Mudzori: GameController.swift.
  • One View: CardCell.swift.
  • Mienzaniso miviri: MemoryGame.swift uye Card.swift.
  • Main.storyboard kuti ive nechokwadi chekuti seti yese yezvikamu inowanikwa.

Tinotanga nechikamu chakareruka chemutambo, makadhi.

Kadhi.kumhanya

Iyo kadhi modhi ichange iine zvivakwa zvitatu: id yekuzivisa imwe neimwe, boolean shanduko inoratidzwa kutsanangura mamiriro ekadhi (yakavanzika kana yakavhurika), uye artworkURL yemifananidzo iri pamakadhi.

class Card {        
    var id: String    
    var shown: Bool = false    
    var artworkURL: UIImage!
}

Iwe unozodawo nzira idzi kudzora kudyidzana kwevashandisi nemamepu:

Nzira yekuratidza mufananidzo pane kadhi. Pano isu tinogadzirisa zvese zvivakwa kuti zvive default. Nekuda kweid, tinoburitsa chitubu chimwechete nekudaidza NSUUIS().uuidString.

init(image: UIImage) {        
    self.id = NSUUID().uuidString        
    self.shown = false        
    self.artworkURL = image    
}

Nzira yekuenzanisa ID makadhi.

func equals(_ card: Card) -> Bool {
    return (card.id == id)    
}

Nzira yekugadzira kopi yekadhi rega rega - kuti uwane nhamba huru yezvakafanana. Iyi nzira ichadzorera kadhi rine maitiro akafanana.

func copy() -> Card {        
    return Card(card: self)    
}
 
init(card: Card) {        
    self.id = card.id        
    self.shown = card.shown        
    self.artworkURL = card.artworkURL    
}

Uye imwezve nzira inodiwa kusanganisa makadhi pakutanga. Tichazviita kuwedzera kwekirasi yeArray.

extension Array {    
    mutating func shuffle() {        
        for _ in 0...self.count {            
            sort { (_,_) in arc4random() < arc4random() }        
        }   
    }
}

Uye heino kushandiswa kwekodhi yeKadhi modhi ine zvese zvivakwa uye nzira.

class Card {
    
    var id: String
    var shown: Bool = false
    var artworkURL: UIImage!
    
    static var allCards = [Card]()
 
    init(card: Card) {
        self.id = card.id
        self.shown = card.shown
        self.artworkURL = card.artworkURL
    }
    
    init(image: UIImage) {
        self.id = NSUUID().uuidString
        self.shown = false
        self.artworkURL = image
    }
    
    func equals(_ card: Card) -> Bool {
        return (card.id == id)
    }
    
    func copy() -> Card {
        return Card(card: self)
    }
}
 
extension Array {
    mutating func shuffle() {
        for _ in 0...self.count {
            sort { (_,_) in arc4random() < arc4random() }
        }
    }
}

Fambira Mberi.

Yechipiri modhi ndeye MemoryGame, pano isu tinoisa 4 * 4 grid. Iyo modhi ichange iine zvivakwa zvakaita semakadhi (akatevedzana emakadhi pane grid), makadhiAnoratidzwa array ane makadhi atovhurwa, uye boolean variable iriKutamba kuteedzera mamiriro emutambo.

class MemoryGame {        
    var cards:[Card] = [Card]()    
    var cardsShown:[Card] = [Card]()    
    var isPlaying: Bool = false
}

Isu tinofanirwawo kugadzira nzira dzekudzora kudyidzana kwevashandisi negridi.

Nzira inosanganisa makadhi mugridi.

func shuffleCards(cards:[Card]) -> [Card] {       
    var randomCards = cards        
    randomCards.shuffle()                
 
    return randomCards    
}

Nzira yekugadzira mutambo mutsva. Pano tinodaidza nzira yekutanga yekutanga dhizaini uye nekutanga iyo isPlaying vhezheni kuita chokwadi.

func newGame(cardsArray:[Card]) -> [Card] {       
    cards = shuffleCards(cards: cardsArray)        
    isPlaying = true            
 
    return cards    
}

Kana tichida kutanga mutambo, tobva taseta isPlaying inoshanduka kuita yenhema uye tobvisa dhizaini yekutanga yemakadhi.

func restartGame() {        
    isPlaying = false                
    cards.removeAll()        
    cardsShown.removeAll()    
}

Nzira yekusimbisa makadhi akadzvanywa. Zvimwe pamusoro pake gare gare.

func cardAtIndex(_ index: Int) -> Card? {        
    if cards.count > index {            
        return cards[index]        
    } else {            
        return nil        
    }    
}

Nzira inodzorera nzvimbo yekadhi chaiyo.

func indexForCard(_ card: Card) -> Int? {        
    for index in 0...cards.count-1 {            
        if card === cards[index] {                
            return index            
        }      
    }
        
    return nil    
}

Kutarisa kutevedza kwekadhi rakasarudzwa nechiyero.

func unmatchedCardShown() -> Bool {
    return cardsShown.count % 2 != 0
}

Iyi nzira inoverenga chinhu chekupedzisira mu **makadhiShown** array uye inodzosera kadhi risingaenderane.

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 uye GameController.swift

Main.storyboard inotaridzika seizvi:

Kunyora Memory Cards Game muSwift

Pakutanga, unofanirwa kuseta mutambo mutsva sekuonaDidLoad mune controller, kusanganisira iyo mifananidzo yegidhi. Mumutambo, zvese izvi zvinomiririrwa ne4 * 4 collectionView. Kana iwe usati wajairana ne collectionView, heino unogona kuwana ruzivo rwaunoda.

Isu tichagadzirisa iyo GameController semudzi wekushandisa. Iyo GameController ichave iine muunganidzwaView yatichataura seIBOutlet. Imwe chirevo ndeye IBAction onStartGame() bhatani, iyi UIButton, unogona kuiona mubhodhi renyaya rinonzi PLAY.

Zvishoma nezve kuitwa kwevatongi:

  • Kutanga, tinotanga zvinhu zviviri zvikuru - grid: mutambo = MemoryGame (), uye seti yemakadhi: makadhi = [Kadhi] ().
  • Isu tinoisa mavheti ekutanga sekuti viewDidLoad, iyi ndiyo nzira yekutanga inonzi mutambo uchimhanya.
  • collectionView yakagadzirirwa kuvanzwa nekuti makadhi ese akavanzwa kusvika mushandisi adzvanya PLAY.
  • Patinongodzvanya PLAY, chikamu cheStartGame IBAction chinotanga, uye isu tinoseta iyo yekuunganidzaTarisa isHidden pfuma kuita nhema kuitira kuti makadhi aonekwe.
  • Nguva imwe neimwe mushandisi paanosarudza kadhi, iyo didSelectItemAt nzira inonzi. Munzira yatinodaidza didSelectCard kuita iyo huru mutambo logic.

Heino yekupedzisira GameController kuita:

class GameController: UIViewController {
 
    @IBOutlet weak var collectionView: UICollectionView!
    
    let game = MemoryGame()
    var cards = [Card]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        game.delegate = self
        
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.isHidden = true
        
        APIClient.shared.getCardImages { (cardsArray, error) in
            if let _ = error {
                // show alert
            }
            
            self.cards = cardsArray!
            self.setupNewGame()
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        if game.isPlaying {
            resetGame()
        }
    }
    
    func setupNewGame() {
        cards = game.newGame(cardsArray: self.cards)
        collectionView.reloadData()
    }
    
    func resetGame() {
        game.restartGame()
        setupNewGame()
    }
    
    @IBAction func onStartGame(_ sender: Any) {
        collectionView.isHidden = false
    }
}
 
// MARK: - CollectionView Delegate Methods
extension GameController: UICollectionViewDelegate, UICollectionViewDataSource {
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cards.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! CardCell
        cell.showCard(false, animted: false)
        
        guard let card = game.cardAtIndex(indexPath.item) else { return cell }
        cell.card = card
        
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as! CardCell
        
        if cell.shown { return }
        game.didSelectCard(cell.card)
        
        collectionView.deselectItem(at: indexPath, animated:true)
    }
}

Zvino ngatitaure zvishoma nezve akakosha maprotocol.

Mitemo

Kushanda nemaprotocol ndiyo musimboti weSwift programming. Protocols inopa kugona kutsanangura mitemo yekirasi, chimiro, kana kuverenga. Iyi nheyo inobvumira iwe kunyora modular uye yakawedzera kodhi. Muchokwadi, iyi pateni yatiri kutoita yekuunganidzaView muGameController. Zvino ngatiite yedu vhezheni. Syntax ichaita seizvi:

protocol MemoryGameProtocol {
    //protocol definition goes here
}

Isu tinoziva kuti protocol inotitendera kutsanangura mitemo kana mirairo yekushandisa kirasi, saka ngatifungei nezve iyo inofanirwa kuve. Unoda zvina zvakazara.

  • Kutanga kwemutambo: memoryGameDidStart.
  • Unoda kutendeudzira kadhi pasi: memoryGameShowCards.
  • Iwe unofanirwa kushandura kadhi chiso pasi: memoryGameHideCards.
  • Kupera kwemutambo: memoryGameDidEnd.

Nzira ina dzese dzinogona kushandiswa kukirasi huru, inova GameController.

memoryGameDidStart

Kana iyi nzira yaitwa, mutambo unofanirwa kutanga (mushandisi anodzvanya PLAY). Pano tichangoisazve zvirimo nekufonera collectionView.reloadData(), iyo inosanganisa makadhi.

func memoryGameDidStart(_ game: MemoryGame) {
    collectionView.reloadData()
}

memoryGameShowCards

Isu tinodaidza iyi nzira kubva muunganidzwaSDViewSelectItemAt. Kutanga inoratidza kadhi rakasarudzwa. Wotarisa kuti uone kana pane kadhi risingaenzaniswi mumakadhiAnoratidzwa array (kana nhamba yemakadhiAnoratidzwa isingaite). Kana pane imwe, kadhi yakasarudzwa inofananidzwa nayo. Kana mifananidzo yakafanana, makadhi ese ari maviri anowedzerwa kumakadhiAnoratidzwa uye anoramba akatarisana. Kana zvakasiyana, kadhi rinosiya makadhiAkaratidzwa uye ose ari maviri akatarisa pasi.

memoryGameHideCards

Kana makadhi asingaenderani, nzira iyi inonzi uye kadhi mifananidzo yakavanzwa.

kuratidzwa = nhema.

memoryGameDidEnd

Kana nzira iyi yadanwa, zvinoreva kuti makadhi ese akatoburitswa uye ari mumakadhiAnoratidzwa runyoro: makadhiShown.count = makadhi.count, saka mutambo wapera. Iyo nzira inodaidzwa chaizvo mushure mekunge tadaidza endGame () kuseta iyo isPlaying var kune yenhema, mushure meiyo meseji yekupedzisira yemutambo inoratidzwa. Uyewo alertController inoshandiswa sechiratidzo chemutongi. viewDidDisappear inodaidzwa uye mutambo unoitwa patsva.

Hezvino izvo zvinotaridzika zvese muGameController:

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()
    }
}

Kunyora Memory Cards Game muSwift
Chaizvoizvo, ndizvo chete. Unogona kushandisa chirongwa ichi kugadzira yako yega vhezheni yemutambo.

Happy coding!

Skillbox inokurudzira:

Source: www.habr.com

Voeg