2011-05-02 3 views
1

내 IDE (TextPad를) 나에게이 오류주고있다 : java.lang.ArrayIndexOutOfBoundsException : I 라인 (38)에 배열 쳐다 보면서 문제가 무엇인지 볼 수 없습니다 9배열 색인이 "범위를 벗어남"입니다. 그러나 나는 무엇을 볼 수없는 잘못된

을 . 배열을 바꾸면 프로그램이 완전히 엉망이됩니다.

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

+0

@Bozho : 38 행 설명. 다행히도 문제의 라인 인 것처럼 보입니다 :) –

+0

예,하지만 저는 셀 카운트를해야만했습니다 :). 내 대답은 느려졌습니다. :) – Bozho

답변

12

배열은 1 기반 인 것처럼 취급합니다 ... 배열은 Java 기반으로 항상 0 기반입니다. 그래서이 :

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

이 같아야합니다

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

당신은 너무이 설명하기 위해 프로그램의 나머지 부분을 조정해야합니다. ( 일 수 있습니다. 배열 하나를 더 크게 만들고 요소 0은 무시하지만 꽤 비 관용적입니다.)

+2

Jon Skeet, 초보자의 고귀한 도우미 ...) – Cephron

+0

덕분에, 나는 내 대학에서 동시에 4 개의 다른 언어를 사용하고 있습니다. 따라서 규칙은 때때로 약간 흐려집니다. –

관련 문제