Ku qorista ciyaarta kaararka xusuusta gudaha Swift

Ku qorista ciyaarta kaararka xusuusta gudaha Swift

Maqaalkani wuxuu sharxayaa habka abuurista ciyaarta tababarka xusuusta fudud oo aan runtii jeclahay. Marka laga soo tago in aad lafteedu ku wanaagsan tahay, waxaad baran doontaa wax yar oo ku saabsan fasallada Swift iyo borotokoollada markaad tagto. Laakiin ka hor intaanan bilaabin, aan fahanno ciyaarta lafteeda.

Waxaan xusuusineynaa: dhammaan akhristayaasha "Habr" - qiimo dhimis ah 10 rubles marka la qorayo koorso kasta oo Skillbox ah iyadoo la adeegsanayo koodhka xayeysiinta "Habr".

Skillbox waxay ku talinaysaa: Koorso online ah oo waxbarasho "Horumarinta Xirfadda Java".

Sida loo ciyaaro Memory Card

Ciyaartu waxay ku bilaabataa muujinta kaararka. Waxay u jiifsadaan wejiga (sida ay u kala horreeyaan, sawirka hoos). Markaad mid uun gujiso, sawirku wuxuu furmayaa dhowr ilbiriqsi.

Hawsha ciyaartoygu waa inuu helo dhammaan kaadhadhka sawiro isku mid ah leh. Haddii, ka dib markaad furto kaarka koowaad, aad rogto kan labaad oo sawiradu iswaafaqaan, labada kaadhba way furn yihiin. Haddii ay iswaafaqi waayaan, kaadhadhku mar kale waa la xidhay. Ujeedadu waa in wax walba la furo.

Qaab dhismeedka mashruuca

Si aad u abuurto nooc fudud oo ciyaartan ah waxaad u baahan tahay qaybaha soo socda:

  • Hal maamule: GameController.swift.
  • Hal Muuqaal: CardCell.swift.
  • Laba nooc: MemoryGame.swift iyo Card.swift.
  • Main.storyboard si loo hubiyo in dhammaan qaybaha qaybaha la heli karo.

Waxaan ku bilownaa qaybta ugu fudud ee ciyaarta, kaararka.

Kaarka.degdega

Qaabka kaadhku waxa uu yeelan doonaa saddex guri: id si loo garto mid walba, doorsoome boolean ah oo la tusay si loo qeexo heerka kaadhka (qarsoon ama furan), iyo artworkURL ee sawirada kaararka.

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

Waxaad sidoo kale u baahan doontaa hababkan si aad u xakamayso isdhexgalka isticmaalaha khariidadaha:

Habka loogu muujinayo sawirka kaadhka. Halkan waxaan dib u dejinay dhammaan guryaha si ay u noqdaan kuwo default ah. Aqoonsi ahaan, waxaanu soo saareynaa id random annagoo wacaya NSUUIS() .uuidString.

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

Habka isbarbardhigga kaararka aqoonsiga.

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

Habka loo sameeyo nuqul kaar kasta - si loo helo tiro badan oo isku mid ah. Habkani wuxuu soo celin doonaa kaadhka qiimaha la midka ah.

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

Iyo hal hab oo kale ayaa loo baahan yahay si loo isku shaandheeyo kaararka bilowga. Waxaan ka dhigi doonaa kordhinta fasalka Array.

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

Oo halkan waa hirgelinta koodka qaabka Kaadhka oo leh dhammaan sifooyinka iyo hababka.

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

Hore u soco

Qaabka labaad waa MemoryGame, halkan waxaan dejinay 4*4 grid. Qaabku waxa uu yeelan doonaa sifooyin ay ka mid yihiin kaadhadhka (habka kaadhadhka ee shabaqlaha), kaarka la soo bandhigay ee kaadhadhku hore u furnaayeen, iyo doorsoome boolean ah oo u ciyaaraya si uu ula socdo heerka ciyaarta.

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

Waxaan sidoo kale u baahanahay inaan horumarino habab lagu xakameynayo isdhexgalka isticmaalaha ee shabakada.

Habka isku shaandhaynta kaadhadhka shabaqlaha.

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

Habka abuurista ciyaar cusub. Halkan waxaan ugu yeernaa habka ugu horreeya ee lagu bilaabo qaabka hore oo aan ku bilowno doorsoomaha isPlaying si run ah.

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

Haddii aan rabno inaan dib u bilowno ciyaarta, ka dib waxaan u dhignay isPlaying variable si been ah oo aan ka saarno qaabka hore ee kaararka.

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

Habka lagu xaqiijinayo kaadhadhka la gujiyay. Wax badan oo isaga ku saabsan dambe.

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

Habka soo celinaya booska kaarka gaarka ah.

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

Hubinta u hoggaansanaanta kaarka la doortay ee heerka.

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

Habkani waxa uu akhriyaa qaybta ugu dambaysa ee shaxda **cardsShown** oo soo celisa kaadhka aan ku habboonayn.

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

Main.storyboard wuxuu u eg yahay sidan:

Ku qorista ciyaarta kaararka xusuusta gudaha Swift

Ugu horrayn, waxaad u baahan tahay inaad ciyaarta cusub u dejiso sidii viewDidLoad kontaroolaha, oo ay ku jiraan sawirrada xadhkaha. Ciyaarta dhexdeeda, waxaas oo dhan waxaa matali doona 4*4 collectionView. Haddii aadan weli aqoon u lahayn collectionView, waa kan waxaad heli kartaa macluumaadka aad u baahan tahay.

Waxaan u habeyn doonaa GameController-ka inuu noqdo kantaroolaha xididka codsiga. GameController-ku waxa uu yeelan doonaa muqaal ururin kaas oo aanu tixraaci doono IBOutlet ahaan. Tixraac kale waa badhanka IBAction onStartGame(), kani waa UIButton, waxaad ka arki kartaa sabuuradda sheeko ee la yiraahdo PLAY.

Wax yar oo ku saabsan hirgelinta kontaroolayaasha:

  • Marka hore, waxaynu bilownaa laba walxood oo waaweyn - shabakad: ciyaarta = MemoryGame (), iyo kaararka kaararka: kaararka = [kaarka] ().
  • Waxaan u dejinay doorsoomayaasha bilowga ah sida viewDidLoad, tani waa habka ugu horreeya ee la yiraahdo inta ciyaartu socoto.
  • CollectView waxaa loo dejiyay inay qarsoonto sababtoo ah dhammaan kaadhadhku waa qarsoon yihiin ilaa isticmaaluhu uu riixayo PLAY.
  • Isla marka aan riixno PLAY, qaybta onStartGame IBAction ayaa bilaabmaysa, waxaanan u dhignay ururinta View isHidden hantida been si ay kaararku u noqdaan kuwo muuqda.
  • Mar kasta oo isticmaaluhu doorto kaarka, habka didSelectItemAt ayaa loo yaqaan. Habka aan ugu yeerno didSelectCard si loo hirgeliyo macquulka ciyaarta ugu weyn.

Waa kan fulinta GameController-kii u dambeeyay:

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

Hadda aan wax yar ka hadalno borotokoolka muhiimka ah.

Hab-raacyada

Ku shaqaynta borotokoollada waa udub dhexaadka barnaamijka Swift. Hab-maamuusyadu waxay bixiyaan awoodda lagu qeexo xeerarka fasalka, qaab-dhismeedka, ama tirinta. Mabda'aani wuxuu kuu ogolaanayaa inaad qorto koodka modular iyo extensible. Dhab ahaantii, kani waa qaab aanu horeba ugu fulinaynay ururinta View gudaha GameController. Hadda aynu samayno nooc noo gaar ah. Syntax-ku wuxuu u ekaan doonaa sidan:

protocol MemoryGameProtocol {
    //protocol definition goes here
}

Waxaan ognahay in hab-maamuusku noo ogolaado inaan qeexno xeerarka ama tilmaamaha lagu hirgelinayo fasalka, markaa aan ka fikirno waxay noqon doonaan. Waxaad u baahan tahay afar guud ahaan.

  • Bilawga ciyaarta: memoryGameDidStart.
  • Waxaad u baahan tahay inaad kaarka hoos u dhigto: memoryGameShowCards.
  • Waxaad u baahan tahay inaad kaarka hoos u dhigto: memoryGameHideCards.
  • Dhamaadka ciyaarta: memoryGameDidEnd.

Dhammaan afarta hab waxaa loo hirgelin karaa fasalka ugu weyn, kaas oo ah GameController.

XusuustaGameDidStart

Marka habkan la ordo, ciyaartu waa inay bilaabataa (isticmaalehu wuxuu riixaa PLAY). Halkan waxaan si fudud dib ugu soo dejin doonaa waxa ku jira annagoo wacaya collectionView.reloadData(), kaas oo isku shaandheyn doona kaararka.

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

xusuustaGameShowCard

Habkan waxaan uga yeernaa ururintaSDViewSelectItemAt. Marka hore waxay muujinaysaa kaadhka la doortay. Ka dib hubi inuu jiro kaadh aan isku mid ahayn oo ku jira shaxda kaararkaShown (haddii tirada kaararkaShown ay tahay mid aan caadi ahayn). Haddii uu mid jiro, kaarka la doortay ayaa la barbar dhigayaa. Haddii sawiradu isku mid yihiin, labada kaadhba waxa lagu daraa kaadhadhkaShown oo ay kor u taagan yihiin. Haddii uu ka duwan yahay, kaarku wuxuu ka baxayaa cardsShown oo labaduba wejigooda ayaa loo rogay.

xusuustaGameHideCards

Haddii kaararku aysan iswaafajin, habkan ayaa loo yaqaan oo sawirada kaadhku waa qarsoon yihiin.

tusay = been.

xusuustaGameDidEnd

Marka habkan la yiraahdo, waxay ka dhigan tahay in dhammaan kaararku mar horeba shaaca laga qaaday oo ay ku jiraan liiska kaararka: cardsShown.count = cards.count, markaa ciyaartu waa dhammaatay. Habka waxaa loogu yeeraa si gaar ah ka dib markii aan u yeernay endGame () si loo dejiyo isPlaying var been ah, ka dib markii fariinta dhamaadka ciyaarta la muujiyo. Sidoo kale alertController waxa loo istcimaalaa tilmaame ka mid ah kantaroolaha. ViewDisappear waa la wacay oo ciyaarta dib ayaa loo dajiyay.

Waa kuwan waxa dhammaan u eg 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()
    }
}

Ku qorista ciyaarta kaararka xusuusta gudaha Swift
Dhab ahaantii, taasi waa dhammaan. Waxaad u isticmaali kartaa mashruucan si aad u abuurto noocaada ciyaarta.

Codayn farxad leh!

Skillbox waxay ku talinaysaa:

Source: www.habr.com

Add a comment