简体   繁体   中英

Array Index is “Out of Bounds”. But I can't see what's wrong

My IDE (TextPad) is giving me this error: java.lang.ArrayIndexOutOfBoundsException: 9

I looked at the array on line 38 and can't see what the problem is. changing the array would totally screw up the program.

   import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;


public class TicTacToeGame implements ActionListener {
    /*Define Buttons, Variables Etc*/
      int[][] winCombinations = new int[][] {
                    {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, //horizontal wins
                    {1, 4, 7}, {2, 5, 8}, {3, 6, 9}, //virticle wins
                    {1, 5, 9}, {3, 5, 7}
                };//diagonal wins

     JFrame window = new JFrame("Tic-Tac-Toe Game");
     JButton btn[] = new JButton[9];
     int count = 0;
     JLabel lblTitle = new JLabel("Tic Tac Toe Game");
     JLabel lblBlank = new JLabel(" ");
     String letter = "";
     boolean win = false;





    public TicTacToeGame(){
    /*Creates Window*/
    window.setSize(400,300);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLayout(new GridLayout(3,3));


    /*Adds Buttons To The Window& adds ActionListener to them*/
    for(int i = 1; i<=9; i++){
            btn[i] = new JButton();
            window.add(btn[i]);
            btn[i].addActionListener(this);
        }


    /*Make The Window Visible*/
    window.setVisible(true);
    }

    public void actionPerformed(ActionEvent a) {


      /*Write the letter to the button and deactivate it*/
            for(int i = 1; i<= 9; i++){
                if(a.getSource() == btn[i]){
                    btn[i].setText("X");
                    btn[i].setEnabled(false);
                }
            }

            count++;
            AI();

        }


          public void AI(){
              count++;
              if(btn[1].getText().equals("O") && btn[2].getText().equals("O") && btn[3].getText().equals("")){
                  btn[3].setText("O");
                  btn[3].setEnabled(false);
              } else if(btn[4].getText().equals("O") && btn[5].getText().equals("O") && btn[6].getText().equals("")){
                  btn[6].setText("O");
                  btn[6].setEnabled(false);
              } else if(btn[7].getText().equals("O") && btn[8].getText().equals("O") && btn[9].getText().equals("")){
                  btn[9].setText("O");
                  btn[9].setEnabled(false);
              }

              else if(btn[2].getText().equals("O") && btn[3].getText().equals("O") && btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              } else if(btn[5].getText().equals("O") && btn[6].getText().equals("O") && btn[4].getText().equals("")){
                  btn[4].setText("O");
                  btn[4].setEnabled(false);
              } else if(btn[8].getText().equals("O") && btn[9].getText().equals("O") && btn[7].getText().equals("")){
                  btn[7].setText("O");
                  btn[7].setEnabled(false);
              }

              else if(btn[1].getText().equals("O") && btn[3].getText().equals("O") && btn[2].getText().equals("")){
                  btn[2].setText("O");
                  btn[2].setEnabled(false);
              } else if(btn[4].getText().equals("O") && btn[6].getText().equals("O") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              } else if(btn[7].getText().equals("O") && btn[9].getText().equals("O") && btn[8].getText().equals("")){
                  btn[8].setText("O");
                  btn[8].setEnabled(false);
              }

              else if(btn[1].getText().equals("O") && btn[4].getText().equals("O") && btn[7].getText().equals("")){
                  btn[7].setText("O");
                  btn[7].setEnabled(false);
              } else if(btn[2].getText().equals("O") && btn[5].getText().equals("O") && btn[8].getText().equals("")){
                  btn[4].setText("O");
                  btn[4].setEnabled(false);
              } else if(btn[3].getText().equals("O") && btn[6].getText().equals("O") && btn[9].getText().equals("")){
                  btn[9].setText("O");
                  btn[9].setEnabled(false);
              }

              else if(btn[4].getText().equals("O") && btn[7].getText().equals("O") && btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              } else if(btn[5].getText().equals("O") && btn[8].getText().equals("O") && btn[2].getText().equals("")){
                  btn[2].setText("O");
                  btn[2].setEnabled(false);
              } else if(btn[6].getText().equals("O") && btn[9].getText().equals("O") && btn[3].getText().equals("")){
                  btn[3].setText("O");
                  btn[3].setEnabled(false);
              }

              else if(btn[1].getText().equals("O") && btn[7].getText().equals("O") && btn[4].getText().equals("")){
                  btn[4].setText("O");
                  btn[4].setEnabled(false);
              } else if(btn[2].getText().equals("O") && btn[8].getText().equals("O") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              } else if(btn[3].getText().equals("O") && btn[9].getText().equals("O") && btn[6].getText().equals("")){
                  btn[6].setText("O");
                  btn[6].setEnabled(false);
              }

              else if(btn[1].getText().equals("O") && btn[5].getText().equals("O") && btn[9].getText().equals("")){
                  btn[9].setText("O");
                  btn[9].setEnabled(false);
              } else if(btn[5].getText().equals("O") && btn[9].getText().equals("O") && btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              } else if(btn[1].getText().equals("O") && btn[9].getText().equals("O") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              }

              else if(btn[3].getText().equals("O") && btn[5].getText().equals("O") && btn[7].getText().equals("")){
                  btn[7].setText("O");
                  btn[7].setEnabled(false);
              } else if(btn[7].getText().equals("O") && btn[5].getText().equals("O") && btn[3].getText().equals("")){
                  btn[3].setText("O");
                  btn[3].setEnabled(false);
              } else if(btn[7].getText().equals("O") && btn[3].getText().equals("O") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              }

              else if(btn[1].getText().equals("X") && btn[2].getText().equals("X") && btn[3].getText().equals("")){
                  btn[3].setText("O");
                  btn[3].setEnabled(false);
              } else if(btn[4].getText().equals("X") && btn[5].getText().equals("X") && btn[6].getText().equals("")){
                  btn[6].setText("O");
                  btn[6].setEnabled(false);
              } else if(btn[7].getText().equals("X") && btn[8].getText().equals("X") && btn[9].getText().equals("")){
                  btn[9].setText("O");
                  btn[9].setEnabled(false);
              }

              else if(btn[2].getText().equals("X") && btn[3].getText().equals("X") && btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              } else if(btn[5].getText().equals("X") && btn[6].getText().equals("X") && btn[4].getText().equals("")){
                  btn[4].setText("O");
                  btn[4].setEnabled(false);
              } else if(btn[8].getText().equals("X") && btn[9].getText().equals("X") && btn[7].getText().equals("")){
                  btn[7].setText("O");
                  btn[7].setEnabled(false);
              }

              else if(btn[1].getText().equals("X") && btn[3].getText().equals("X") && btn[2].getText().equals("")){
                  btn[2].setText("O");
                  btn[2].setEnabled(false);
              } else if(btn[4].getText().equals("X") && btn[6].getText().equals("X") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              } else if(btn[7].getText().equals("X") && btn[9].getText().equals("X") && btn[8].getText().equals("")){
                  btn[8].setText("O");
                  btn[8].setEnabled(false);
              }

              else if(btn[1].getText().equals("X") && btn[4].getText().equals("X") && btn[7].getText().equals("")){
                  btn[7].setText("O");
                  btn[7].setEnabled(false);
              } else if(btn[2].getText().equals("X") && btn[5].getText().equals("X") && btn[8].getText().equals("")){
                  btn[8].setText("O");
                  btn[8].setEnabled(false);
              } else if(btn[3].getText().equals("X") && btn[6].getText().equals("X") && btn[9].getText().equals("")){
                  btn[9].setText("O");
                  btn[9].setEnabled(false);
              }

              else if(btn[4].getText().equals("X") && btn[7].getText().equals("X") && btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              } else if(btn[5].getText().equals("X") && btn[8].getText().equals("X") && btn[2].getText().equals("")){
                  btn[2].setText("O");
                  btn[2].setEnabled(false);
              } else if(btn[6].getText().equals("X") && btn[9].getText().equals("X") && btn[3].getText().equals("")){
                  btn[3].setText("O");
                  btn[3].setEnabled(false);
              }

              else if(btn[1].getText().equals("X") && btn[7].getText().equals("X") && btn[4].getText().equals("")){
                  btn[4].setText("O");
                  btn[4].setEnabled(false);
              } else if(btn[2].getText().equals("X") && btn[8].getText().equals("X") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              } else if(btn[3].getText().equals("X") && btn[9].getText().equals("X") && btn[6].getText().equals("")){
                  btn[6].setText("O");
                  btn[6].setEnabled(false);
              }

              else if(btn[1].getText().equals("X") && btn[5].getText().equals("X") && btn[9].getText().equals("")){
                  btn[9].setText("O");
                  btn[9].setEnabled(false);
              } else if(btn[5].getText().equals("X") && btn[9].getText().equals("X") && btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              } else if(btn[1].getText().equals("X") && btn[9].getText().equals("X") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              }

              else if(btn[3].getText().equals("X") && btn[5].getText().equals("X") && btn[7].getText().equals("")){
                  btn[7].setText("O");
                  btn[7].setEnabled(false);
              } else if(btn[7].getText().equals("X") && btn[5].getText().equals("X") && btn[3].getText().equals("")){
                  btn[3].setText("O");
                  btn[3].setEnabled(false);
              } else if(btn[7].getText().equals("X") && btn[3].getText().equals("X") && btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              }

              else if(btn[1].getText().equals("X") && btn[5].getText().equals("O") && btn[9].getText().equals("X")) {
                  btn[6].setText("O");
                  btn[6].setEnabled(false);
              }

              else if(btn[3].getText().equals("X") && btn[5].getText().equals("O") && btn[7].getText().equals("X")) {
                  btn[4].setText("O");
                  btn[4].setEnabled(false);
              }

              else if(btn[5].getText().equals("")){
                  btn[5].setText("O");
                  btn[5].setEnabled(false);
              }

              else if(btn[1].getText().equals("")){
                  btn[1].setText("O");
                  btn[1].setEnabled(false);
              }
              else {
                  if(count >= 9)
                      checkWin();
                  else
                      RandomMove();
              }

              checkWin();

          }

          public void RandomMove(){
              Random x = new Random();
              int y = 1 + x.nextInt(9);
              if(btn[y].getText().equals("O") || btn[y].getText().equals("X") ){
                  RandomMove();
              } else {
                  btn[y].setText("O");
                  btn[y].setEnabled(false);
              }
          }

 public void checkWin(){

        /*Determine who won*/
        for(int i=0; i<=7; i++){
            if( btn[winCombinations[i][0]].getText().equals(btn[winCombinations[i][1]].getText()) &&
                btn[winCombinations[i][1]].getText().equals(btn[winCombinations[i][2]].getText()) &&
                !btn[winCombinations[i][0]].getText().equals("")) {
                win = true;
            }
        }

        if(count % 2 == 0)
            letter = "<font color='blue'>O";
        else
            letter = "<font color='red'>X";



        /*Shows Win & Tie Status Message*/
        if(win == true){
            JOptionPane.showMessageDialog(null, letter + " WINS!</font></html>");
        } else if(count == 9 && win == false){
            JOptionPane.showMessageDialog(null, "Tie Game!");
        }

}
    public static void main(String[] args){
        new TicTacToeGame();
    }
}

You're treating the array as if it were 1-based... arrays are always 0-based in Java. So this:

for (int i = 1; i <= 9; i++) {

should be this:

for (int i = 0; i < 9; i++) {

You'll need to adjust the rest of your program to account for this too. (You could just create the array one bigger and ignore element 0, but that would be pretty non-idiomatic.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM