调试tic-tac-toe逻辑

时间:2017-10-16 12:17:18

标签: swift if-statement

我正在编写一个小TicTacToe。现在我正处于“isRow()”函数,我在下面的代码中遇到了一个非常奇怪的错误:

var game = [0, 0, 0, 0, 0, 0, 0, 0, 0]
let winPatterns = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]]

func hasWon() -> Int
{
    for pattern in winPatterns {
        if (game[pattern[0]] != 0 && game[pattern[0]] == game[pattern[1]] && game[pattern[1]] == game[pattern[2]]) {
            if (game[pattern[0]] == 1) {
                return(1)
            }
            else {
                return(2)
            }
        }
        else if (!game.contains(0)) {
            return(0)
        }
    }

    return(-1)
}

现在,当我的游戏阵列看起来像这样时,我调用hasWon()函数:

[1, 2, 1, 1, 2, 2, 1, 1, 2]

我的hasWon()函数返回0,但它应返回1 在我尝试解决此问题一段时间后,我将代码更改为:

func hasWon() -> Int
{
    for pattern in winPatterns {
        if (game[pattern[0]] != 0) {
            if (game[pattern[0]] == game[pattern[1]]) {
                if (game[pattern[1]] == game[pattern[2]]) {
                    if (game[pattern[0]] == 1) {
                        return(1)
                    }
                    else {
                        return(2)
                    }
                }
            }
        }
        else if (!game.contains(0)) {
            return(0)
        }
    }

如果游戏阵列如上所示,则返回0。但是当我的代码看起来像这样时,如果我的数组看起来像这样,它会返回任何内容而不是0

[1, 2, 1, 1, 2, 1, 2, 1, 2]

1 个答案:

答案 0 :(得分:-1)

问题在于这一部分:

else if (!game.contains(0)) {
    return(0)
}

else部分否定了第一个if语句中的条件,即:

game[pattern[0]] != 0 && 
    game[pattern[0]] == game[pattern[1]] && 
    game[pattern[1]] == game[pattern[2]]

表示"如果在模式"描述的行,列或对角线中有三个非0;

所以你的else if是基本的说法"如果模式描述的行,列或对角线中有三个非0,则该板不包含任何0和#34;

else if中,你返回0,我认为这意味着平局。

从表面上看,这似乎是有道理的,但不要忘记你在这里循环遍历所有模式!如果一个模式连续不包含三个1或2,并且电路板已填满,则不一定是平局。

您需要先完成检查所有模式,如果没有模式连续3个1或2个,请检查电路板是否已填满。

func hasWon() -> Int
{
    for pattern in winPatterns {
        if (game[pattern[0]] != 0 && game[pattern[0]] == game[pattern[1]] && game[pattern[1]] == game[pattern[2]]) {
            if (game[pattern[0]] == 1) {
                return(1)
            }
            else {
                return(2)
            }
        }
    }

    if (!game.contains(0)) { // note that I moved this out of the loop.
        return(0)
    }

    return(-1)
}