2016-03-01 47 views
0

我試圖製作一個記憶遊戲,將圖像應用到12個不同的按鈕,並檢查2個按鈕顯示時圖像是否相同。檢查相同的值swift

------------------- FINISHED FORM?----------------------- -

這是Duncan C的建議,

func setImages() { 

    var values = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6] 
    values.shuffleInPlace() 

    button1.tag = values[0] 
    button2.tag = values[1] 
    button3.tag = values[2] 
    button4.tag = values[3] 
    button5.tag = values[4] 
    button6.tag = values[5] 
    button7.tag = values[6] 
    button8.tag = values[7] 
    button9.tag = values[8] 
    button10.tag = values[9] 
    button11.tag = values[10] 
    button12.tag = values[11] 

} 

@IBAction func buttonPressed(sender: UIButton) { 

    var images : [UIImage] = [ 
     UIImage(named:"ye1")!, 
     UIImage(named:"ye2")!, 
     UIImage(named:"ye3")!, 
     UIImage(named:"ye4")!, 
     UIImage(named:"ye5")!, 
     UIImage(named:"ye6")!, 
     UIImage(named:"ye7")!, 
     UIImage(named:"ye8")!, 
     UIImage(named:"ye9")!, 
     UIImage(named:"ye10")!, 
     UIImage(named:"ye11")!, 
     UIImage(named:"ye12")! 
    ] 

    images.shuffleInPlace() 

    let integrera = (sender.tag - 1) 
    let imageString:String = String(format: "ye%i", integrera) 

    if !firstButtonAlreadyPresssed { 
     firstButtonValue = sender.tag //remember the button for later 
     firstButtonAlreadyPresssed = true 
     sender.setImage(UIImage(named: imageString), forState: .Normal) 

    } 
    else 
     //We already have a first button pressed. 
     if sender.tag == firstButtonValue { 

     sender.setImage(UIImage(named: imageString), forState: .Normal) 

     } 
     else { 

     let secondimage = (sender.tag) 
     let secondString : String = String(format: "ye%i", secondimage) 

     sender.setImage(UIImage(named: secondString), forState: .Normal) 
     } 
     firstButtonAlreadyPresssed = false //reset the "isFirstButton" flag for the next time. 
    } 
} 
+0

創建圖像的陣列。我們稱之爲'圖像'。在你的buttonPressed方法中,將sender的圖像設置爲'images [sender.tag -1]'。對於第一個按鈕,您可能想要保留圖像。按第二個按鈕,您想要顯示第二個圖像,例如說「您贏了」或「您輸了」,暫停幾秒鐘,然後將第一個按鈕和第二個按鈕恢復爲其通用圖像。 –

+0

@DuncanC對於所有12個按鈕,我是否應該隨機排列數組,並且第二個按鈕圖像是否應該是'images [sender.tag -2]'等等?謝謝你的耐心。 –

+0

@DuncanC看看更新後的代碼和評論界的問題,我想我們會解決這個問題! –

回答

2

嗯,這裏有一些冗長和重複的代碼,我相信。您可以將所有按鈕添加到相同的@IBAction func。所以你可以有一個@IBAction func buttonPressed(sender: UIButton)而不是像現在這樣的12個(我認爲,因爲你的函數叫@IBAction func button1PRESSED(sender: AnyObject))。所以,當你第一次點擊一個按鈕時,你將存儲該按鈕,並且如果它的第一個或第二個按鈕被點擊,它也會被存儲。當你點擊第二個按鈕時,你會檢查它是否與第一個點擊的一樣,具有相同的UIImage,否則你就應該這樣做。

@IBAction func buttonPressed(sender: UIButton) { 
    if self.firstButtonStored == true { 
     if self.firstButton.image == sender.image { 
      // They are the same  
     } else { 
      // they are not the same 
     } 
    } else { 
     self.firstButtonStored = true 
     self.firstButton = sender 
    } 
} 

我還建議存儲在自一個OutletCollection(工作方式類似的陣列),而不是12個按鈕的所有按鈕。而且我還會用UIImage以外的東西來檢查它們是否相同,不確定這是否真的起作用,因爲您需要圖像名稱而不是圖像本身進行比較。讓我知道你是否需要幫助。

+0

關於outlet collecti的不幸之處ons是數組中對象的順序不能保證。我被這幾次咬了。它似乎工作,然後在某個時候,陣列中的插座的順序從你下面改變。這真令人氣憤。如果Apple不打算保留一個插座集合中的物品的順序,他們應該使它成爲無序的集合,而不是陣列。更好的是,他們**應該**保存項目的順序! –

+0

@DuncanC如果我沒有弄錯,他們會按照您拖拽的方式進行排序。我從來沒有遇到過使用Outlet集合描述的問題。此外,如果你只是要遍歷所有這些,你不需要它被命令。除非你想訪問一個應該總是包含特定對象的特定索引,否則它並不重要。儘管指出了這一點,並再次 - 我可能在這裏是錯的。 – ClockWise

2

不要,不要,不要創建12個獨立的變量,card1-card12和12 IBActionsbutton1PRESSED - button12PRESSED。這種情況下,你有許多完全相同的東西,唯一改變的就是一個值「代碼異味」。它告訴你你做錯了。

相反,你應該找到一種方法來做到這一點,你可以在所有的按鈕上使用相同的IBAction,並且索引到數組中,而不是有12個單獨的變量。

我會建議在按鈕上使用標籤。讓按鈕1使用標籤1,按鈕2使用標籤2等。

然後在您的IBAction中,從按鈕獲取標籤並使用它來確定哪個按鈕被按下以及要做什麼。

你還需要一個標誌,告訴你這是第一個按鈕還是第二個按鈕,所以你可以告訴你是否需要測試匹配(如果是第二個)或者只記得哪個按下了如果這是按下第一按鈕。)

var firstButtonValue: Int 
var firstButtonAlreadyPresssed: Bool 

@IBAction func buttonPressed(sender: UIButton) 
{ 
    if !firstButtonAlreadyPresssed 
    { 
    firstButtonValue = sender.tag //remember the button for later 
    firstButtonAlreadyPresssed = true 
    } 
    else 
    { 
    //We already have a first button pressed. 
    if sender.tag == firstButtonValue 
    { 
     //right answer. Handle it. 
    } 
    else 
    { 
     //wrong answer. Handle it. 
    } 
    firstButtonAlreadyPresssed = false //reset the "isFirstButton" flag for the next time. 
    } 
} 

可能同時圖像的陣列用於每個值,然後基於對firstButtonValuesender.tag值獲取該圖像。

+0

嘿,我試着使用你教給我的知識,但仍然有索姆問題,我敢打賭你認爲很容易解決.. :-)看看我的更新,如果你仍然願意幫助;-) –

2

的一種方法,而不是一個完整的解決方案

  • 創建一個結構Cardvalueindex性能和價值使其Equatable
    您可以添加更多的屬性,如donestatus,image或其他。

    struct Card : Equatable, CustomStringConvertible { 
        let value : Int 
        let index : Int 
        var description : String { return "Card \(index)"} 
    } 
    
    func ==(lhs: Card, rhs: Card) -> Bool 
    { 
        return lhs.value == rhs.value 
    } 
    
  • 洗牌的值,並創建的12卡

    var values = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6] 
    values.shuffleInPlace() 
    
    
    var cards = [Card]() 
    for (index, value) in values.enumerate() { 
        cards.append(Card(value: value, index: index)) 
    } 
    
  • 陣列實現的方法找到相應的卡

    func twinCard(card : Card) -> Card { 
        return cards.filter({$0 == card && $0.index != card.index}).first! 
    } 
    
  • 在界面生成器從0標記指定給11到十二個按鈕並將所有按鈕連接到同一個@IBAction

    @IBAction func buttonPressed(sender: UIButton) { 
        let tag = sender.tag 
        let chosenCard = cards[tag] 
        let otherCard = twinCard(chosenCard) 
    
        // The following depends on the design of the UI   
        // for example get the corresponding button by viewWithTag(otherCard.index) 
        // or use an array which holds the button references. 
    
        ... 
    } 
    

別拖着認爲,洗牌模型;-)

+0

真的很好的方法,除非我不推薦使用標籤,因爲我不喜歡使用它們。當然,他們工作,但不是我個人的偏好。儘管這個解決方案是迄今爲止最好的解決方案:)試用一下 – ClockWise