Почему случайный массив повторяется - PullRequest
0 голосов
/ 19 апреля 2020

Я тасую свой массив.

Затем я присваиваю значение каждому из индексов в массиве.

Затем я выполняю действие для каждого индекса. В этом случае цвет ячейки в массиве становится красным. Несмотря на то, что я присвоил разные значения каждому из индексов в перетасованном массиве, я все еще получаю повторение, и иногда одна и та же ячейка остается красной в течение более одной секунды подряд. Почему это так, как будто массив постоянно перетасовывается между операторами If? Код ниже.

Я отредактировал код, чтобы показать весь viewController.

   import UIKit

class ViewController: UIViewController {


    @IBOutlet var theview: UIView!

    @IBOutlet weak var timerx: UILabel!

    @IBOutlet weak var square1: UIImageView!

    @IBOutlet weak var square2: UIImageView!

    @IBOutlet weak var square3: UIImageView!

    @IBOutlet weak var square4: UIImageView!

    @IBOutlet weak var square5: UIImageView!

    @IBOutlet weak var square6: UIImageView!

    @IBOutlet weak var square7: UIImageView!

    @IBOutlet weak var square8: UIImageView!

    @IBOutlet weak var square9: UIImageView!

    var viewArray = [UIImageView]()

    var timer:Timer?
    var seconds = 11







    override func viewDidLoad() {
        super.viewDidLoad()


        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timeElapsed), userInfo: nil, repeats: true)


        }

         @objc func timeElapsed() {
       seconds -= 1
       timerx.text = "\(seconds)"
       if seconds <= 0 {
           timer?.invalidate()
                     }
      viewArray = [square1,square2,square3,square4,square5,square6,square7,square8,square9]

            func allcellsYellow(){
                           square1.backgroundColor = UIColor.systemYellow
                           square2.backgroundColor = UIColor.systemYellow
                           square3.backgroundColor = UIColor.systemYellow
                           square4.backgroundColor = UIColor.systemYellow
                           square5.backgroundColor = UIColor.systemYellow
                           square6.backgroundColor = UIColor.systemYellow
                           square7.backgroundColor = UIColor.systemYellow
                           square8.backgroundColor = UIColor.systemYellow
                           square9.backgroundColor = UIColor.systemYellow
                                     }
            func allcellsRed(){
                                      square1.backgroundColor = UIColor.red
                                      square2.backgroundColor = UIColor.red
                                      square3.backgroundColor = UIColor.red
                                      square4.backgroundColor = UIColor.red
                                      square5.backgroundColor = UIColor.red
                                      square6.backgroundColor = UIColor.red
                                      square7.backgroundColor = UIColor.red
                                      square8.backgroundColor = UIColor.red
                                      square9.backgroundColor = UIColor.red
                                                }

            viewArray.shuffle()


            let randomcell = (viewArray[0])
            let randomcell2 = (viewArray[1])
            let randomcell3 = (viewArray[2])
            let randomcell4 = (viewArray[3])
            let randomcell5 = (viewArray[4])
            let randomcell6 = (viewArray[5])
            let randomcell7 = (viewArray[6])
            let randomcell8 = (viewArray[7])
            let randomcell9 = (viewArray[8])


            if seconds == 10 {
                randomcell.backgroundColor = UIColor.red
            }
            if seconds < 10 {
                allcellsYellow()
            }
            if seconds == 9 {
                randomcell2.backgroundColor = UIColor.red
            }
            if seconds < 9 {
                allcellsYellow()
            }
            if seconds == 8 {
                randomcell3.backgroundColor = UIColor.red
            }
            if seconds < 8 {
                allcellsYellow()
            }
            if seconds == 7 {
                randomcell4.backgroundColor = UIColor.red
            }
            if seconds < 7 {
                allcellsYellow()
            }
            if seconds == 6 {
                randomcell5.backgroundColor = UIColor.red
            }
            if seconds < 6 {
                allcellsYellow()
            }
            if seconds == 5 {
                randomcell6.backgroundColor = UIColor.red
            }
            if seconds < 5 {
                allcellsYellow()
            }
            if seconds == 4 {
                randomcell7.backgroundColor = UIColor.red
            }
            if seconds < 4 {
                allcellsYellow()
            }
            if seconds == 3 {
                randomcell8.backgroundColor = UIColor.red
            }
            if seconds < 3 {
                allcellsYellow()
            }
            if seconds == 2 {
                randomcell9.backgroundColor = UIColor.red
            }
            if seconds < 2 {
                allcellsYellow()
            }
            if seconds == 1 {
                randomcell.backgroundColor = UIColor.red
            }
            if seconds < 1 {
                allcellsYellow()
            }
            if seconds == 0 {
                allcellsRed()
            }

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Вам не нужен один выход для каждого просмотра изображения. Вы можете подключить их все к одной коллекции IBOutlet. Тогда вы можете просто создать коллекцию ее индексов и перемешать ее. Вы также можете закончить sh очистку большей части своего кода, создав метод, позволяющий превратить все фоны или только один в определенный цвет c:

class ViewController: UIViewController {
    @IBOutlet var squares: [UIImageView]!
    @IBOutlet weak var timeLabel: UILabel!
    var timer = Timer()
    var indices: [Int] = []
    var seconds = 11
    override func viewDidLoad() {
        super.viewDidLoad()
        timer = .scheduledTimer(timeInterval: 1, target: self, selector: #selector(timeElapsed), userInfo: nil, repeats: true)
        indices = squares.indices.shuffled()
        setAllSquares(to: .systemYellow)
    }
    func setAllSquares(to color: UIColor) {
        squares.forEach { $0.backgroundColor = color }
    }
    func setSquare(at index: Int, to color: UIColor) {
        squares[index].backgroundColor = color
    }
    @objc func timeElapsed(_ timer: Timer) {
        timeLabel.text = "seconds: \(seconds)"
        if seconds <= 0 { timer.invalidate() }
        switch seconds {
        case 2 ... 10:
            setAllSquares(to: .systemYellow)
            setSquare(at: indices[seconds-2], to: .systemRed)
        case 1:
            setAllSquares(to: .systemYellow)
        case 0:
            setAllSquares(to: .systemRed)
        default:
            break
        }
        seconds -= 1
    }
}

Пример проекта

0 голосов
/ 19 апреля 2020

Я держу этот код как можно более похожим на ваш, чтобы вы могли видеть, какие изменения структуры необходимы. Как уже говорили, есть много вещей, которые вы можете сделать, чтобы сделать его более лаконичным и управляемым.

Пожалуйста, воспринимайте это только как предложение по перестановке, а не как хорошее решение!

import UIKit

class ViewController: UIViewController {

@IBOutlet var theview: UIView!
@IBOutlet weak var timerx: UILabel!
@IBOutlet weak var square1: UIImageView!
@IBOutlet weak var square2: UIImageView!
@IBOutlet weak var square3: UIImageView!
@IBOutlet weak var square4: UIImageView!
@IBOutlet weak var square5: UIImageView!
@IBOutlet weak var square6: UIImageView!
@IBOutlet weak var square7: UIImageView!
@IBOutlet weak var square8: UIImageView!
@IBOutlet weak var square9: UIImageView!

var viewArray = [UIImageView]()

var timer:Timer?
var seconds = 11

    override func viewDidLoad() {
        super.viewDidLoad()
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timeElapsed), userInfo: nil, repeats: true)
        viewArray = [square1,square2,square3,square4,square5,square6,square7,square8,square9]
        viewArray.shuffle()
    }

    func allcellsYellow(){
        square1.backgroundColor = UIColor.systemYellow
        square2.backgroundColor = UIColor.systemYellow
        square3.backgroundColor = UIColor.systemYellow
        square4.backgroundColor = UIColor.systemYellow
        square5.backgroundColor = UIColor.systemYellow
        square6.backgroundColor = UIColor.systemYellow
        square7.backgroundColor = UIColor.systemYellow
        square8.backgroundColor = UIColor.systemYellow
        square9.backgroundColor = UIColor.systemYellow
    }
    func allcellsRed(){
        square1.backgroundColor = UIColor.red
        square2.backgroundColor = UIColor.red
        square3.backgroundColor = UIColor.red
        square4.backgroundColor = UIColor.red
        square5.backgroundColor = UIColor.red
        square6.backgroundColor = UIColor.red
        square7.backgroundColor = UIColor.red
        square8.backgroundColor = UIColor.red
        square9.backgroundColor = UIColor.red
    }

    fileprivate func updateColours() {
        let randomcell = (viewArray[0])
        let randomcell2 = (viewArray[1])
        let randomcell3 = (viewArray[2])
        let randomcell4 = (viewArray[3])
        let randomcell5 = (viewArray[4])
        let randomcell6 = (viewArray[5])
        let randomcell7 = (viewArray[6])
        let randomcell8 = (viewArray[7])
        let randomcell9 = (viewArray[8])


        if seconds == 10 {
            randomcell.backgroundColor = UIColor.red
        }
        if seconds < 10 {
            allcellsYellow()
        }
        if seconds == 9 {
            randomcell2.backgroundColor = UIColor.red
        }
        if seconds < 9 {
            allcellsYellow()
        }
        if seconds == 8 {
            randomcell3.backgroundColor = UIColor.red
        }
        if seconds < 8 {
            allcellsYellow()
        }
        if seconds == 7 {
            randomcell4.backgroundColor = UIColor.red
        }
        if seconds < 7 {
            allcellsYellow()
        }
        if seconds == 6 {
            randomcell5.backgroundColor = UIColor.red
        }
        if seconds < 6 {
            allcellsYellow()
        }
        if seconds == 5 {
            randomcell6.backgroundColor = UIColor.red
        }
        if seconds < 5 {
            allcellsYellow()
        }
        if seconds == 4 {
            randomcell7.backgroundColor = UIColor.red
        }
        if seconds < 4 {
            allcellsYellow()
        }
        if seconds == 3 {
            randomcell8.backgroundColor = UIColor.red
        }
        if seconds < 3 {
            allcellsYellow()
        }
        if seconds == 2 {
            randomcell9.backgroundColor = UIColor.red
        }
        if seconds < 2 {
            allcellsYellow()
        }
        if seconds == 1 {
            randomcell.backgroundColor = UIColor.red
        }
        if seconds < 1 {
            allcellsYellow()
        }
        if seconds == 0 {
            allcellsRed()
        }
    }

    @objc func timeElapsed() {
       seconds -= 1
       timerx.text = "\(seconds)"
        print("\(seconds)")
       if seconds <= 0 {
           timer?.invalidate()
        }
        DispatchQueue.main.async {
            self.updateColours()
        }
    }

}
...