gpt4 book ai didi

java - TicTacToe 游戏的 OutOfBoundsException;问题: arrays?

转载 作者:行者123 更新时间:2023-12-01 06:33:49 25 4
gpt4 key购买 nike

我刚刚开始编写井字棋游戏。我刚刚运行它并得到以下堆栈跟踪:

 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;
}
}

最佳答案

这一行

ArrayList<String> board = new ArrayList<String>(8);

不会创建 8 个字符串的数组(或者 9 个字符串,如果这是有意的话)。它将创建一个 ArrayList,其初始容量为 8 个元素,但大小为 0。

为面板创建 ArrayList 后,您必须使用 add 方法向其中填充元素。尝试做类似的事情:

public static ArrayList<String> newBoard() {
ArrayList<String> board = new ArrayList<String>(8);
for (int i = 0; i < 9; i++)
board.add("");
return board;
}

消息 Exception in thread "main"java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 表示您正在尝试访问长度为 0 的列表中的第 0 个元素(在没有元素的列表)。

此外,还有以下行:

newBoard().add(markSquareNumber - 1, "X");

应该是

newBoard().set(markSquareNumber - 1, "X");

关于java - TicTacToe 游戏的 OutOfBoundsException;问题: arrays?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com