【发布时间】:2020-06-11 18:27:40
【问题描述】:
我正在使用 2D 数组在 Kotlin 中创建一个简单的 Connect Four 程序来打印电路板。除了我的水平 win-checker 功能外,一切正常。由于我使用的逻辑,在尝试将您的作品放在第一列时出现(索引超出范围)错误,因为它正在尝试检查数组中的下一列,但没有。有没有更好的方法来处理检查获胜者?这是我的功能:
fun checkWinsHorizontal() {
for(row in 0 until gameBoard.size) {
for(col in 0 until gameBoard.size){
// if this spot is taken up by an "X", and the horizontally adjacent spaces are the same, declare winner
if (gameBoard[row][col] == "X" && (gameBoard[row][col] == gameBoard[row][col - 1] && gameBoard[row][col] == gameBoard[row][col - 2] && gameBoard[row][col] == gameBoard[row][col - 3]) ){
printBoard()
println("YOU WIN")
winner = true
return
}
// same thing as above but for a "computer" opponent
else if (gameBoard[row][col] == "O" && gameBoard[row][col] == gameBoard[row][col - 1] && gameBoard[row][col] == gameBoard[row][col - 2] && gameBoard[row][col] == gameBoard[row][col - 3]){
printBoard()
println("COMPUTER WINS")
winner = true
return
}
}
}
}
【问题讨论】:
-
索引超出范围是因为您遍历整个长度并且使用了前驱和后继。此外:算法应该只检查水平获胜条件还是垂直和对角线获胜条件?
-
有几个选项。我可能会重构一下,但就目前而言,在外部循环中,您可以使用 ganeBoard[row][0] 的值初始化一个变量,然后在内部循环中将每个 gameBoard[row][col] 与该值进行比较价值。如果有任何不同,则退出循环,因为没有胜利。如果您到达内部循环的末尾,那么获胜者就是该变量中符号的所有者
标签: java kotlin indexoutofboundsexception 2d-games