Почему я не могу остановить Progress Bar с помощью таймера? - PullRequest
0 голосов
/ 14 октября 2018

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

import UIKit

class ViewController: UIViewController {

var activePlayer = 1 // 1 = noughts, 2 = crosses
var gameState = [0, 0, 0, 0, 0, 0, 0, 0, 0]
let winningCombinations = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]]
var gameActive = true
var timer = Timer()

@IBOutlet weak var btnPlayAgain: UIButton!
@IBOutlet weak var progressBar: UIProgressView!

@IBAction func btnPlayAgain(_ sender: AnyObject) {

ОБНОВЛЕНИЕ

self.view.viewWithTag(1000)?.isHidden = true
if self.view.viewWithTag(1000)?.isHidden == false {
     self.view.viewWithTag(1000)?.isHidden = true
}

ОБНОВЛЕНИЕ

progressBar.progress = 0.5

gameState = [0, 0, 0, 0, 0, 0, 0, 0, 0]

activePlayer = 1
gameActive = true


gameOverLabel.isHidden = true
gameOverLabel.center = CGPoint(x: gameOverLabel.center.x - 500, y: gameOverLabel.center.y)

btnPlayAgain.isHidden = true
btnPlayAgain.center = CGPoint(x: btnPlayAgain.center.x - 500, y: btnPlayAgain.center.y)

var buttonToClear : UIButton

for i in 0..<9 {
    buttonToClear = view.viewWithTag(i) as! UIButton
    buttonToClear.setImage(nil, for: .normal)

    }

}
@IBOutlet weak var button: UIButton!
@IBOutlet weak var gameOverLabel: UILabel!

@IBAction func buttonPressed(_ sender: AnyObject) {

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


if (gameState[sender.tag] == 0) && ( gameActive == true) {

    gameState[sender.tag] = activePlayer

if activePlayer == 1 {
sender.setImage(UIImage(named: "nought.png"), for: .normal)

    activePlayer = 2
} else {
    sender.setImage(UIImage(named: "cross.png"), for: .normal)
   activePlayer = 1
}

    for combination in winningCombinations {
        if (gameState[combination[0]] != 0 &&
            gameState[combination[0]] == gameState[combination[1]] &&
            gameState[combination[1]] == gameState[combination[2]]) {

            gameActive = false

            if (gameState[combination[0]] == 1)
            {
                gameOverLabel.text = "Noughts has won!"

            } else {
                gameOverLabel.text = "Crosses has won!"
            }

           endGame()
        }
    }
    if gameActive == true {

    gameActive = false

    for buttonState in gameState {
        if buttonState == 0 {
            gameActive = true
        }
    }
    if gameActive == false {

        gameOverLabel.text = "It's a draw!"
        endGame()
    }
}
}

}

Как я могу контролировать индикатор выполнения, 1 или 0?Если 1 или 0 gameLabel.text должен быть "Кресты или нолики выиграли!"

@objc func updateProgress() {
       if activePlayer == 1 {
           progressBar.progress -= 0.01    
       } else {
           progressBar.progress += 0.01
       }      
}

Я хочу показать «доску победителей», когда игра закончится.Я добавил ниже коды для показа. Это нормально.Но когда я нажал кнопку playAgain, на первом экране скрывается, но когда вторая игра заканчивается, доска победителя не скрывается

func endGame() {

timer.invalidate()
gameActive = false
let rect = UIView(frame: CGRect(x: 0, y: 0, width: 600, height: 500))
rect.tag = 1000
rect.backgroundColor = UIColor.white

self.view.addSubview(rect)
rect.addSubview(gameOverLabel)
rect.addSubview(btnPlayAgain)

gameOverLabel.isHidden = false
btnPlayAgain.isHidden = false

progressBar.progress = 0.5

UIView.animate(withDuration: 0.5, animations:{ () -> Void in

    self.gameOverLabel.center = CGPoint(x: self.gameOverLabel.center.x + 500, y: self.gameOverLabel.center.y)

    self.btnPlayAgain.center = CGPoint(x: self.btnPlayAgain.center.x + 500, y: self.btnPlayAgain.center.y)

})

}

override func viewDidLoad() {
super.viewDidLoad()

progressBar.progress = 0.5

gameOverLabel.isHidden = true
gameOverLabel.center = CGPoint(x: gameOverLabel.center.x - 500, y: gameOverLabel.center.y)

btnPlayAgain.isHidden = true
btnPlayAgain.center = CGPoint(x: btnPlayAgain.center.x - 500, y: btnPlayAgain.center.y)
}

1 Ответ

0 голосов
/ 14 октября 2018

Я предполагаю, что вы создаете несколько таймеров, запланированных на каждое нажатие.Вы можете попробовать это.Сначала проверьте код таймера, как показано ниже:

if self.timer.isValid == true {
    self.timer.invalidate()
 }
timer = Timer.scheduledTimer(timeInterval: 0.6, target: self, selector: #selector(updateProgress), userInfo: nil, repeats: true)

Теперь, внутри вашего updateProgress, обновите его следующим образом.

@objc func updateProgress() {
        if activePlayer == 1 {
            progressBar.progress -= 0.01

        } else {
            progressBar.progress += 0.01
        }

        if progressBar.progress == 1.0 || progressBar.progress == 0.0 {
            if activePlayer == 1 {
                gameOverLabel.text = "Noughts has won!"

            } else {
                gameOverLabel.text = "Crosses has won!"
            }
            endGame()
        }
    }
...