Note that there are some explanatory texts on larger screens.

plurals
  1. POOutOfBoundsException for TicTacToe Game; Issue: arrays?
    text
    copied!<p>I am the beginnings of writing a tic-tac-toe game. I just ran it and got the following stack trace:</p> <pre><code> 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) </code></pre> <p>I suspect it is a problem with the way I have the ArrayList setup? I read somewhere about nulls causing problems, but this is my first time dealing with arrays, so I'm not to familiar with the subject. Anyhow, here is my code:</p> <pre><code> 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&lt;String&gt; newBoard() { ArrayList&lt;String&gt; board = new ArrayList&lt;String&gt;(8); return board; } // Returns true if the square has been marked. public static boolean isMarked(int numberOfSquare) { if (numberOfSquare &gt; 9 || numberOfSquare &lt; 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") &amp;&amp; (newBoard().get(y)).equals("O") &amp;&amp; (newBoard().get(y)).equals("O"); } else { return (newBoard().get(x)).equals("O") &amp;&amp; (newBoard().get(y)).equals("O") &amp;&amp; (newBoard().get(y)).equals("O"); } } // Places an X or O on the specified square. public static boolean mark(int markSquareNumber) { if (markSquareNumber &gt; 9 || markSquareNumber &lt; 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; } } </code></pre> <p>I just put a whole bunch of asterisks by the lines that came up in the stack-trace. If anyone could point out where I am going wrong that would be splendid, thanks! </p> <p><strong>Ok, here is the solution that I came up with after all your wonderful input: (Please only use this for educational and reference purposes, I don't want to get yelled at by my professor if you are in my CS1410 class and you copy me!!!!)</strong></p> <pre><code>//Written by JTN for Assignment7.3- CS1410; October 2010. import java.util.*; public class TicTacToe { private static int moveNumber = 0; private static ArrayList&lt;String&gt; board = new ArrayList&lt;String&gt;(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&lt;String&gt; newBoard() { for (int i = 0; i &lt;= 8; i++) board.add("_"); return board; } // Returns true if the square has been marked. public static boolean isMarked(int numberOfSquare) { if (numberOfSquare &gt; 9 || numberOfSquare &lt; 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") &amp;&amp; (board.get(y)).equals("O") &amp;&amp; (board.get(z)).equals("O"); } else { return (board.get(x)).equals("X") &amp;&amp; (board.get(y)).equals("X") &amp;&amp; (board.get(z)).equals("X"); } } // Places an X or O on the specified square. public static boolean mark(int markSquareNumber) { if (markSquareNumber &gt; 9 || markSquareNumber &lt; 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; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload