【发布时间】:2010-10-27 20:23:30
【问题描述】:
我是编写井字游戏的开端。我刚刚运行它并得到以下堆栈跟踪:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:571)
at java.util.ArrayList.get(ArrayList.java:349)
at TicTacToe.isMarked(TicTacToe.java:23)
at TicTacToe.mark(TicTacToe.java:59)
at TicTacToe.main(TicTacToe.java:7)
我怀疑是我设置 ArrayList 的方式有问题?我在某处读到了关于导致问题的空值,但这是我第一次处理数组,所以我不熟悉这个主题。无论如何,这是我的代码:
import java.util.*;
public class TicTacToe {
public static void main(String[] args) {
newBoard();
******************System.out.println(mark(1));************
System.out.println(mark(5));
System.out.println(mark(9));
}
// Creates a blank board.
public static ArrayList<String> newBoard() {
ArrayList<String> board = new ArrayList<String>(8);
return board;
}
// Returns true if the square has been marked.
public static boolean isMarked(int numberOfSquare) {
if (numberOfSquare > 9 || numberOfSquare < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
************if (newBoard().get(numberOfSquare - 1) == null) {***********
return false;
} else
return true;
}
// Returns the number of moves that have been made.
public static int moveCount() {
return countMove();
}
// If called, adds 1 to number of moves.
public static int countMove() {
int moveNumber = 0;
moveNumber++;
return moveNumber;
}
// Checks for a win at the specified array location and player (X or O).
public static boolean checkForWin(int x, int y, int z, int player) {
if (player == 0) {
return (newBoard().get(x)).equals("O")
&& (newBoard().get(y)).equals("O")
&& (newBoard().get(y)).equals("O");
} else {
return (newBoard().get(x)).equals("O")
&& (newBoard().get(y)).equals("O")
&& (newBoard().get(y)).equals("O");
}
}
// Places an X or O on the specified square.
public static boolean mark(int markSquareNumber) {
if (markSquareNumber > 9 || markSquareNumber < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
***********if (isMarked(markSquareNumber)) {*******************
throw new IllegalArgumentException("Square is already marked.");
}
if (moveCount() % 2 != 0) {
newBoard().add(markSquareNumber - 1, "X");
countMove();
} else {
newBoard().add(markSquareNumber - 1, "O");
countMove();
}
if (checkForWin(0, 1, 2, 1) || checkForWin(3, 4, 5, 1)
|| checkForWin(6, 7, 8, 1)) {
System.out.println("Player-X just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 1) || checkForWin(1, 4, 7, 1)
|| checkForWin(2, 5, 8, 1)) {
System.out.println("Player-X just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 1) || checkForWin(2, 4, 6, 1)
|| checkForWin(0, 4, 8, 1)) {
System.out.println("Player-X just won diagonally!");
return true;
}
if (checkForWin(0, 1, 2, 0) || checkForWin(3, 4, 5, 0)
|| checkForWin(6, 7, 8, 0)) {
System.out.println("Player-O just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 0) || checkForWin(1, 4, 7, 0)
|| checkForWin(2, 5, 8, 0)) {
System.out.println("Player-O just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 0) || checkForWin(2, 4, 6, 0)
|| checkForWin(0, 4, 8, 0)) {
System.out.println("Player-O just won diagonally!");
return true;
} else
return false;
}
}
我只是在堆栈跟踪中出现的行旁边加上一大堆星号。如果有人能指出我哪里出错了,那就太好了,谢谢!
好的,这是我在您的所有精彩输入后提出的解决方案:(请仅将其用于教育和参考目的,如果您在我的 CS1410 课,你抄我!!!)
//Written by JTN for Assignment7.3- CS1410; October 2010.
import java.util.*;
public class TicTacToe {
private static int moveNumber = 0;
private static ArrayList<String> board = new ArrayList<String>(8);
public static void main(String[] args) {
newBoard();
mark(1);mark(2);
mark(5);mark(3);
mark(9);
boardString();
}
// Returns the number of moves that have been made.
public static int moveCount() {
return (countMove()-1);
}
// If called, adds 1 to number of moves.
public static int countMove() {
moveNumber= moveNumber + 1;
return moveNumber;
}
// Creates a blank board.
public static ArrayList<String> newBoard() {
for (int i = 0; i <= 8; i++)
board.add("_");
return board;
}
// Returns true if the square has been marked.
public static boolean isMarked(int numberOfSquare) {
if (numberOfSquare > 9 || numberOfSquare < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
if ((board.get(numberOfSquare - 1)).equals("_")) {
return false;
} else
return true;
}
// Checks for a win at the specified array location and player (X or O).
public static boolean checkForWin(int x, int y, int z, int player) {
if (player == 0) {
return (board.get(x)).equals("O")
&& (board.get(y)).equals("O")
&& (board.get(z)).equals("O");
}
else {
return (board.get(x)).equals("X")
&& (board.get(y)).equals("X")
&& (board.get(z)).equals("X");
}
}
// Places an X or O on the specified square.
public static boolean mark(int markSquareNumber) {
if (markSquareNumber > 9 || markSquareNumber < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
if (isMarked(markSquareNumber)) {
throw new IllegalArgumentException("Square is already marked.");
}
if ((countMove() % 2) == 0){
board.set(markSquareNumber - 1, "O");
}
else {
board.set(markSquareNumber - 1, "X");
}
if (checkForWin(0, 1, 2, 1) || checkForWin(3, 4, 5, 1)
|| checkForWin(6, 7, 8, 1)) {
System.out.println("Player-X just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 1) || checkForWin(1, 4, 7, 1)
|| checkForWin(2, 5, 8, 1)) {
System.out.println("Player-X just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 1) || checkForWin(2, 4, 6, 1)
|| checkForWin(0, 4, 8, 1)) {
System.out.println("Player-X just won diagonally!");
return true;
}
else if (checkForWin(0, 1, 2, 0) || checkForWin(3, 4, 5, 0)
|| checkForWin(6, 7, 8, 0)) {
System.out.println("Player-O just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 0) || checkForWin(1, 4, 7, 0)
|| checkForWin(2, 5, 8, 0)) {
System.out.println("Player-O just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 0) || checkForWin(2, 4, 6, 0)
|| checkForWin(0, 4, 8, 0)) {
System.out.println("Player-O just won diagonally!");
return true;
} else
return false;
}
public static String boardString(){
String row1 = board.get(0)+"|"+board.get(1)+"|"+board.get(2);
String row2 = board.get(3)+"|"+board.get(4)+"|"+board.get(5);
String row3 = board.get(6)+"|"+board.get(7)+"|"+board.get(8);
System.out.println(row1);
System.out.println(row2);
System.out.println(row3);
return row1+row2+row3;
}
}
【问题讨论】:
-
你能格式化你的代码吗?选择代码,然后按编辑器顶部的 100100 按钮。
-
请编辑您的帖子并修复代码格式。这将为您生成更多反馈/答案。 Edit 看起来像 shoebox639 打败了我。
-
抱歉,我已将其格式化,但后来发生了什么事?现在已经修复了。
-
只是对设计的评论:你不想在 mark() 方法中检查胜利。你的 checkForWin 方法真的应该没有参数,只返回获胜者,如果没有人获胜,则返回 -1。在检查胜利中,您可以进行硬编码检查。
-
对不起,我不知道胜利检查的事情......关于这个问题,我只是按照我的教授告诉我们的去做。好吧,他只要求返回真或假,但这只是帮助我验证它在打印他们如何获胜以及在哪里获胜时的工作。我其实发现了一些错误,但我会在完成后立即更新和胜利。
标签: java arrays exception-handling arraylist