检查相同的值swift
我试图制作一个记忆游戏,将图像应用到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.
}
}
嗯,这里有一些冗长和重复的代码,我相信。您可以将所有按钮添加到相同的@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
以外的东西来检查它们是否相同,不确定这是否真的起作用,因为您需要图像名称而不是图像本身进行比较。让我知道你是否需要帮助。
关于outlet collecti的不幸之处ons是数组中对象的顺序不能保证。我被这几次咬了。它似乎工作,然后在某个时候,阵列中的插座的顺序从你下面改变。这真令人气愤。如果Apple不打算保留一个插座集合中的物品的顺序,他们应该使它成为无序的集合,而不是阵列。更好的是,他们**应该**保存项目的顺序! –
@DuncanC如果我没有弄错,他们会按照您拖拽的方式进行排序。我从来没有遇到过使用Outlet集合描述的问题。此外,如果你只是要遍历所有这些,你不需要它被命令。除非你想访问一个应该总是包含特定对象的特定索引,否则它并不重要。尽管指出了这一点,并再次 - 我可能在这里是错的。 – ClockWise
不要,不要,不要创建12个独立的变量,card1-card12
和12 IBActions
button1PRESSED
- 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.
}
}
可能同时图像的阵列用于每个值,然后基于对firstButtonValue
或sender.tag
值获取该图像。
嘿,我试着使用你教给我的知识,但仍然有索姆问题,我敢打赌你认为很容易解决.. :-)看看我的更新,如果你仍然愿意帮助;-) –
的一种方法,而不是一个完整的解决方案
-
创建一个结构
Card
与value
和index
性能和价值使其Equatable
。
您可以添加更多的属性,如done
,status
,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. ... }
别拖着认为,洗牌模型;-)
真的很好的方法,除非我不推荐使用标签,因为我不喜欢使用它们。当然,他们工作,但不是我个人的偏好。尽管这个解决方案是迄今为止最好的解决方案:)试用一下 – ClockWise
创建图像的阵列。我们称之为'图像'。在你的buttonPressed方法中,将sender的图像设置为'images [sender.tag -1]'。对于第一个按钮,您可能想要保留图像。按第二个按钮,您想要显示第二个图像,例如说“您赢了”或“您输了”,暂停几秒钟,然后将第一个按钮和第二个按钮恢复为其通用图像。 –
@DuncanC对于所有12个按钮,我是否应该随机排列数组,并且第二个按钮图像是否应该是'images [sender.tag -2]'等等?谢谢你的耐心。 –
@DuncanC看看更新后的代码和评论界的问题,我想我们会解决这个问题! –