2011-05-02 55 views
1

我的IDE(TextPad)是給我這個錯誤: java.lang.ArrayIndexOutOfBoundsException:9數組索引是「超出界限」。但我看不出有什麼不對

我看着陣列上線38並不能看到是什麼問題。改變數組將完全搞砸了這個程序。

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(); 
    } 
} 
+0

呃..這是巨大的..你能告訴我們確切的行棧點跟蹤? (不要讓我們數) – Bozho 2011-05-02 18:21:15

+0

@Bozho:第38行,根據描述。幸運的是,似乎是有問題的線:) – 2011-05-02 18:22:01

+0

是的,但我不得不數:),這減慢了我的答案:) – Bozho 2011-05-02 18:23:27

回答

12

您正在將數組視爲基於1的數組...... Java中的數組始終是基於0的數組。所以這個:

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

應該是這樣的:

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

你需要調整你的程序的其他部分考慮到這一點。 (你可能只是創建一個更大的陣列和忽略元素0,但這將是相當非慣用。)

+2

Jon Skeet,SO的高手,初學者的崇高幫手......;) – Cephron 2011-05-02 18:22:37

+0

謝謝,我在大學裏同時學習了四種不同的語言。所以這些規則有時候會變得有些模糊。 – 2011-05-02 18:30:03