Swift:可能的逻辑错误

Swift:可能的逻辑错误,swift,logic,Swift,Logic,我正在尝试创建一个简单的井字游戏。不需要人工智能。我已经到了可以在我的UI中点击按钮的地步,它们每次都会切换。我还创建了一个checkScore()函数。然而,我认为我的checkScore()函数在某些地方有错误的逻辑,我花了两天的时间试图找出它。如果用户连续获得三个,则应在win所在的位置运行WinneMessage()函数。我的变量名很容易解释 我这里的问题是,除非我注释掉checkScore()函数中的所有“else if”语句,否则winnerMessage将在第一次单击棋盘时运行。请

我正在尝试创建一个简单的井字游戏。不需要人工智能。我已经到了可以在我的UI中点击按钮的地步,它们每次都会切换。我还创建了一个checkScore()函数。然而,我认为我的checkScore()函数在某些地方有错误的逻辑,我花了两天的时间试图找出它。如果用户连续获得三个,则应在win所在的位置运行WinneMessage()函数。我的变量名很容易解释

我这里的问题是,除非我注释掉checkScore()函数中的所有“else if”语句,否则winnerMessage将在第一次单击棋盘时运行。请帮忙!谢谢

定义变量

    var player1 = "❌"
    var player2 = "⭕️"
    var currentPlayer = "❌"

    let originalValue = ""

    let winnerMessageTopHorizontal = "We have a winner across the top!"
    let winnerMessageCenterHorizontal = "We have a winner across the  center!"
    let winnerMessageBottomHorizontal = "We have a winner across the bottom!"
    let winnerMessageLeftVertical = "We have a winner on the left side!"
    let winnerMessageCenterVertical = "We have a winner down the center!"
    let winnerMessageRightVertical = "We have a winner on the right side!"
    let winnerMessageDiagonal1 = "We have a winner diagonally!"
    let winnerMessageDiagonal2 = "We have a winner diagonally!"
这是我创建的changePlayer()函数

/* function that changes from player1 to player2 (switching from X to O and O to X)*/
    func changePlayer(){

        if currentPlayer == player1{
            print ("\(player1)")
            currentPlayer = player2
        }



        else if currentPlayer == player2{
            print ("\(player2)")
            currentPlayer = player1
        }


        else{
            NSLog ("Error. Please reset the game.")
        }

    }
这是我一直遇到问题的checkScore()函数。如果注释掉函数中除第一行之外的所有行,则可以看到第一步的工作原理

func checkScore(){



   if topLeftOutlet.currentTitle == topCenterOutlet.currentTitle && topLeftOutlet.currentTitle == topRightOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageTopHorizontal
        }

        else if leftCenterOutlet.currentTitle == centerOutlet.currentTitle && leftCenterOutlet.currentTitle == rightCenterOutlet.currentTitle && leftCenterOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageCenterHorizontal
        }
        else if bottomLeftOutlet.currentTitle == bottomCenterOutlet.currentTitle && bottomLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && bottomLeftOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageBottomHorizontal
        }
        else if topLeftOutlet.currentTitle == leftCenterOutlet.currentTitle && topLeftOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageLeftVertical
        }
        else if topCenterOutlet.currentTitle == centerOutlet.currentTitle && topCenterOutlet.currentTitle == bottomCenterOutlet.currentTitle && topCenterOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageCenterVertical
        }
        else if topRightOutlet.currentTitle == rightCenterOutlet.currentTitle && topRightOutlet.currentTitle == bottomRightOutlet.currentTitle && topRightOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageRightVertical
        }
        else if topLeftOutlet.currentTitle == centerOutlet.currentTitle && topLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageDiagonal1
        }
        else if topRightOutlet.currentTitle == centerOutlet.currentTitle && topRightOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
            announcementArea.text = winnerMessageDiagonal2
        }

        else{
            NSLog ("Keep going")
        }




    }
     @IBOutlet weak var announcementArea: UITextField!
板上按钮的操作和插座。当用户单击按钮时,操作将更改为X或O。出口用于下面的重置功能,该功能将值重置为空

    @IBAction func topLeft(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var topLeftOutlet: UIButton!

    @IBAction func topCenter(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var topCenterOutlet: UIButton!

    @IBAction func topRight(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var topRightOutlet: UIButton!

    @IBAction func leftCenter(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var leftCenterOutlet: UIButton!

    @IBAction func center(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var centerOutlet: UIButton!

    @IBAction func rightCenter(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var rightCenterOutlet: UIButton!

    @IBAction func bottomLeft(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }

    @IBOutlet weak var bottomLeftOutlet: UIButton!

    @IBAction func bottomCenter(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var bottomCenterOutlet: UIButton!

    @IBAction func bottomRight(sender: UIButton) {
        sender.setTitle(currentPlayer, forState: .Normal)
        changePlayer()
        checkScore()
    }
    @IBOutlet weak var bottomRightOutlet: UIButton!
此按钮当前无效:

    @IBAction func startGame(sender: UIButton) {
        NSLog ("Player Started Game")
    }
resetButton()函数,当播放机单击重置按钮时重置棋盘

    @IBAction func resetGame(sender: UIButton) {
        NSLog ("Player Reset Game")
        topLeftOutlet.setTitle(originalValue, forState: .Normal)
        topCenterOutlet.setTitle(originalValue, forState: .Normal)
        topRightOutlet.setTitle(originalValue, forState: .Normal)
        leftCenterOutlet.setTitle(originalValue, forState: .Normal)
        centerOutlet.setTitle(originalValue, forState: .Normal)
        rightCenterOutlet.setTitle(originalValue, forState: .Normal)
        bottomLeftOutlet.setTitle(originalValue, forState: .Normal)
        bottomCenterOutlet.setTitle(originalValue, forState: .Normal)
        bottomRightOutlet.setTitle(originalValue, forState: .Normal)
    }


}

非常感谢您的关注。我不期望它是完美的。我只需要再看一眼,看看我是否漏掉了什么明显的东西

我发现了您的问题。问题出在changeScore方法中,您的按钮在开始时包含nil值,但您将它们与“”字符串进行比较,这就是为什么每次您的条件变为始终为true并显示赢家消息的原因。您只需替换所有您的条件!=“和我不喜欢这样

   if topLeftOutlet.currentTitle == topCenterOutlet.currentTitle && topLeftOutlet.currentTitle == topRightOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageTopHorizontal
    }

    else if leftCenterOutlet.currentTitle == centerOutlet.currentTitle && leftCenterOutlet.currentTitle == rightCenterOutlet.currentTitle && leftCenterOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageCenterHorizontal
    }
    else if bottomLeftOutlet.currentTitle == bottomCenterOutlet.currentTitle && bottomLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && bottomLeftOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageBottomHorizontal
    }
    else if topLeftOutlet.currentTitle == leftCenterOutlet.currentTitle && topLeftOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageLeftVertical
    }
    else if topCenterOutlet.currentTitle == centerOutlet.currentTitle && topCenterOutlet.currentTitle == bottomCenterOutlet.currentTitle && topCenterOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageCenterVertical
    }
    else if topRightOutlet.currentTitle == rightCenterOutlet.currentTitle && topRightOutlet.currentTitle == bottomRightOutlet.currentTitle && topRightOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageRightVertical
    }
    else if topLeftOutlet.currentTitle == centerOutlet.currentTitle && topLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageDiagonal1
    }
    else if topRightOutlet.currentTitle == centerOutlet.currentTitle && topRightOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
        announcementArea.text = winnerMessageDiagonal2
    }

    else{
        NSLog ("Keep going")
    }
在重置方法的按钮标题中也设置为零。
我希望它能解决您的问题

Sumit给我的答案是解决方案的一部分。谢谢你帮我找到了正确的方向!使其工作的方法是,checkScore()函数需要这样编写:

    func checkScore(){

    if (topLeftOutlet.currentTitle == topCenterOutlet.currentTitle && topLeftOutlet.currentTitle == topRightOutlet.currentTitle && topLeftOutlet.currentTitle != originalValue && topLeftOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageTopHorizontal

     }

    if (leftCenterOutlet.currentTitle == centerOutlet.currentTitle && centerOutlet.currentTitle == rightCenterOutlet.currentTitle && leftCenterOutlet.currentTitle != originalValue && leftCenterOutlet.currentTitle != nil) {

        announcementArea.text = winnerMessageCenterHorizontal

     }

     if (bottomLeftOutlet.currentTitle == bottomCenterOutlet.currentTitle && bottomLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && bottomLeftOutlet.currentTitle != originalValue && bottomLeftOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageBottomHorizontal
     }

     if (topLeftOutlet.currentTitle == leftCenterOutlet.currentTitle && topLeftOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet != originalValue && topLeftOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageLeftVertical
     }

     if (topCenterOutlet.currentTitle == centerOutlet.currentTitle && topCenterOutlet.currentTitle == bottomCenterOutlet.currentTitle && topCenterOutlet.currentTitle != originalValue && topCenterOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageCenterVertical
     }

     if (topRightOutlet.currentTitle == rightCenterOutlet.currentTitle && topRightOutlet.currentTitle == bottomRightOutlet.currentTitle && topRightOutlet.currentTitle != originalValue && topRightOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageRightVertical
     }

     if (topLeftOutlet.currentTitle == centerOutlet.currentTitle && topLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && topLeftOutlet.currentTitle != originalValue && topLeftOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageDiagonal1
     }

     if (topRightOutlet.currentTitle == centerOutlet.currentTitle && topRightOutlet.currentTitle == bottomLeftOutlet.currentTitle && topRightOutlet.currentTitle != originalValue && topRightOutlet.currentTitle != nil){

        announcementArea.text = winnerMessageDiagonal2
     }
}

每个“if”语句都需要检查按钮标题是否不等于我创建的空字符串变量originalValue。此外,正如Sumit提到的,它需要检查按钮标题是否不等于nil

仅供参考-您可以使用单个按钮操作来处理每个按钮,因为您现有的9个按钮处理程序中的所有代码都是相同的。但这与你的问题无关。只是一个建议。当调用您的
checkScore
方法时,哪一行错误地宣布了获胜者?使用调试器并逐行执行,看看会发生什么。感谢您的建议!引入的checkScore()函数的第二行将导致单击任意按钮,在文本字段@IBOutlet弱var announcementArea:UITextField!中显示winnerMessage!查看
checkScore()
中的最后一个
else if
子句,并查看它正在检查哪些按钮。我不明白您为什么不想使用else if语句。我不认为我的答案是解决方案的一部分,它完全是正确的答案