我正在编写一个小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]
答案 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)
}