2016-03-01 3 views
0

Я пытаюсь создать игру с памятью, в которой я применяю изображения к 12 различным кнопкам и проверяю, совпадают ли изображения, когда отображаются 2 кнопки.Проверить идентичные значения swift

------------------- ЗАВЕРШЕННАЯ ФОРМА? ----------------------- -

Попробуйте предложение 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

Создать массив изображений. Назовем это 'images'. В методе buttonPressed установите изображение отправителя на 'images [sender.tag -1]'. Для первой кнопки вы, вероятно, захотите оставить изображение на своем месте. Для второй кнопки нажмите, вы хотите показать второе изображение, сказать «вы выиграли» или «вы проиграете», приостановите несколько секунд, а затем верните как первую кнопку, так и вторую кнопку обратно к своим общим изображениям. –

+0

@DuncanC Должен ли я перемешать массив, и если на втором изображении кнопок будут «изображения [sender.tag -2]» и т. Д. Для всех 12 кнопок? Спасибо за ваше терпение. –

+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

Несчастная вещь о выходе collecti что порядок объектов в массиве не гарантируется. Я был укушен этим пару раз. Кажется, что это работает, и затем в какой-то момент порядок выходов в массиве изменяется из-под вас. Это бесит. Если 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. 
    } 
} 

Вы могли бы иметь массив изображений использовать для каждого значения, а затем принести это изображение на основе значения firstButtonValue или sender.tag.

+0

Эй, я пробовал использовать знания, которые вы мне научили, но у меня все еще есть проблемы, которые, как вы думаете, легко решить .. :-) Посмотрите мое обновление, если вы все еще готовы помочь ;-) –

2

подход, а не полное решение

  • Создать 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! 
    } 
    
  • В Interface Builder назначайте теги от 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

Смежные вопросы