2016-03-01 44 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