2016-03-05 97 views
-1

我得到一个空指针异常,不知道为什么。这里是代码:

这是一个井字游戏,但是当我尝试设置onClickListener为我的游戏的按钮它抛出一个异常。

Mainactivity:

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.util.Random; 

public class MainActivity extends AppCompatActivity { 

    int board[][]; 

    // button map 
    Button buttons[][]; 


    int i, j; 


    TextView textView; 


    AI ai; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     init(); 
    } 

    private boolean checkBoard() { 

     // is the game over? 
     boolean gameOver = false; 

     // first check all possible combinations to see if the user has won. 
     if ((board[1][1] == 0 && board[2][2] == 0 && board[3][3] == 0) 
       || (board[1][3] == 0 && board[2][2] == 0 && board[3][1] == 0) 
       || (board[1][2] == 0 && board[2][2] == 0 && board[3][2] == 0) 
       || (board[1][3] == 0 && board[2][3] == 0 && board[3][3] == 0) 
       || (board[1][1] == 0 && board[1][2] == 0 && board[1][3] == 0) 
       || (board[2][1] == 0 && board[2][2] == 0 && board[2][3] == 0) 
       || (board[3][1] == 0 && board[3][2] == 0 && board[3][3] == 0) 
       || (board[1][1] == 0 && board[2][1] == 0 && board[3][1] == 0)) { 

      // user has won 
      textView.setText("You win!"); 
      gameOver = true; 

     } else if ((board[1][1] == 1 && board[2][2] == 1 && board[3][3] == 1) 
       || (board[1][3] == 1 && board[2][2] == 1 && board[3][1] == 1) 
       || (board[1][2] == 1 && board[2][2] == 1 && board[3][2] == 1) 
       || (board[1][3] == 1 && board[2][3] == 1 && board[3][3] == 1) 
       || (board[1][1] == 1 && board[1][2] == 1 && board[1][3] == 1) 
       || (board[2][1] == 1 && board[2][2] == 1 && board[2][3] == 1) 
       || (board[3][1] == 1 && board[3][2] == 1 && board[3][3] == 1) 
       || (board[1][1] == 1 && board[2][1] == 1 && board[3][1] == 1)) { 

      // computer has won 
      textView.setText("You lost!"); 
      gameOver = true; 

     } 
     // Nobody has won but we still need to make sure that we have empty spaces 
     else { 
      boolean isEmpty = true; 
      for(i=1; i<=3; i++) { 
       for(j=1; j<=3; j++) { 
        if(board[i][j] == 2) { 
         isEmpty = false; 
         break; 
        } 
       } 
      } 

      if(isEmpty) { 
       gameOver = true; 
       textView.setText("It's a draw!"); 
      } 
     } 

     return gameOver; 
    } 

    private class AI { 
     // the computer checks the board and takes its turn 
     public void takeTurn() { 
      try { 
       if (board[1][1] == 2 && 
         ((board[1][2] == 0 && board[1][3] == 0) || 
           (board[2][2] == 0 && board[3][3] == 0) || 
           (board[2][1] == 0 && board[3][1] == 0))) { 
        markSquare(1, 1); 
       } else if (board[1][2] == 2 && 
         ((board[2][2] == 0 && board[3][2] == 0) || 
           (board[1][1] == 0 && board[1][3] == 0))) { 
        markSquare(1, 2); 
       } else if (board[1][3] == 2 && 
         ((board[1][1] == 0 && board[1][2] == 0) || 
           (board[3][1] == 0 && board[2][2] == 0) || 
           (board[2][3] == 0 && board[3][3] == 0))) { 
        markSquare(1, 3); 
       } else if (board[2][1] == 2 && 
         ((board[2][2] == 0 && board[2][3] == 0) || 
           (board[1][1] == 0 && board[3][1] == 0))) { 
        markSquare(2, 1); 
       } else if (board[2][2] == 2 && 
         ((board[1][1] == 0 && board[3][3] == 0) || 
           (board[1][2] == 0 && board[3][2] == 0) || 
           (board[3][1] == 0 && board[1][3] == 0) || 
           (board[2][1] == 0 && board[2][3] == 0))) { 
        markSquare(2, 2); 
       } else if (board[2][3] == 2 && 
         ((board[2][1] == 0 && board[2][2] == 0) || 
           (board[1][3] == 0 && board[3][3] == 0))) { 
        markSquare(2, 3); 
       } else if (board[3][1] == 2 && 
         ((board[1][1] == 0 && board[2][1] == 0) || 
           (board[3][2] == 0 && board[3][3] == 0) || 
           (board[2][2] == 0 && board[1][3] == 0))) { 
        markSquare(3, 1); 
       } else if (board[3][2] == 2 && 
         ((board[1][2] == 0 && board[2][2] == 0) || 
           (board[3][1] == 0 && board[3][3] == 0))) { 
        markSquare(3, 2); 
       } else if (board[3][3] == 2 && 
         ((board[1][1] == 0 && board[2][2] == 0) || 
           (board[1][3] == 0 && board[2][3] == 0) || 
           (board[3][1] == 0 && board[3][2] == 0))) { 
        markSquare(3, 3); 
       } 
       // There is nothing to block so choose a random square 
       else { 
        Random rand = new Random(); 
        int a = rand.nextInt(4); 
        int b = rand.nextInt(4); 
        while (a == 0 || b == 0 || board[a][b] != 2) { 
         a = rand.nextInt(4); 
         b = rand.nextInt(4); 
        } 
        markSquare(a, b); 
       } 
      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     // Mark the selected square 
     private void markSquare(int x, int y) { 
      buttons[x][y].setEnabled(false); 
      buttons[x][y].setText("X"); 
      board[x][y] = 1; 
      checkBoard(); 
     } 
    } 
    class ClickListener implements View.OnClickListener { 
     // this buttons position in the arrays 
     int x; 
     int y; 

     public ClickListener(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     // handle the click event 
     public void onClick(View view) { 
      // check to see if the button is enabled 
      if(buttons[x][y].isEnabled()) { 
       buttons[x][y].setEnabled(false); 
       // mark it as belonging to the user 
       buttons[x][y].setText("O"); 
       board[x][y] = 0; 

       // check to see if the user has won, if not let AI take turn 
       if(!checkBoard()) { 
        ai.takeTurn(); 
       } 
      } 
     } 
    } 
    private void init() { 
     ai = new AI(); 
     buttons = new Button[4][4]; 
     board = new int[4][4]; 

     // get the objects defined in main.xml 
     textView = (TextView) findViewById(R.id.dialogue); 

     buttons[1][3] = (Button) findViewById(R.id.one); 
     buttons[1][2] = (Button) findViewById(R.id.two); 
     buttons[1][1] = (Button) findViewById(R.id.three); 
     buttons[2][3] = (Button) findViewById(R.id.four); 
     buttons[2][2] = (Button) findViewById(R.id.five); 
     buttons[2][1] = (Button) findViewById(R.id.six); 
     buttons[3][3] = (Button) findViewById(R.id.seven); 
     buttons[3][2] = (Button) findViewById(R.id.eight); 
     buttons[3][1] = (Button) findViewById(R.id.nine); 

     // set the values of the board to 2 (empty) 
     for (i = 1; i <= 3; i++) { 
      for (j = 1; j <= 3; j++) 
       board[i][j] = 2; 
     } 

     // add the click listeners for each button 
     for (i = 1; i <= 3; i++) { 
      for (j = 1; j <= 3; j++) { 
       buttons[i][j].setOnClickListener(new ClickListener(i, j)); 
       if(!buttons[i][j].isEnabled()) { 
        buttons[i][j].setText(" "); 
        buttons[i][j].setEnabled(true); 
       } 
      } 
     } 
    } 

} 

布局

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="azval.tictactoe.MainActivity"> 

    <Button android:id="@+id/one" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_alignParentTop="true" android:layout_toRightOf="@+id/two" android:layout_toEndOf="@+id/two"/> 

    <Button android:id="@+id/two" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_alignParentTop="true" android:layout_toRightOf="@+id/three" 
     android:layout_toEndOf="@+id/three"/> 

    <Button android:id="@+id/three" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:padding="0px" 
     android:layout_alignTop="@+id/two" 
     android:layout_alignStart="@+id/six" /> 

    <Button android:id="@+id/four" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_below="@+id/one" android:layout_toRightOf="@+id/two"/> 

    <Button android:id="@+id/five" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_below="@+id/two" android:layout_toRightOf="@+id/three"/> 

    <Button android:id="@+id/six" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_below="@+id/three" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="61dp" /> 

    <Button android:id="@+id/seven" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_below="@+id/four" android:layout_toRightOf="@+id/two"/> 

    <Button android:id="@+id/eight" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_below="@+id/five" android:layout_toRightOf="@+id/three"/> 

    <Button android:id="@+id/nine" 
     android:layout_width="75dp" 
     android:layout_height="75dp" 
     android:text=" " 
     android:textSize="70px" 
     android:layout_below="@+id/six" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="61dp" /> 

    <TextView android:id="@+id/dialogue" 
     android:layout_width="fill_parent" 
     android:layout_below="@id/nine" 
     android:layout_height="wrap_content" 
     android:text="Click a button to start" 
     android:gravity="center_horizontal" 
     android:layout_marginTop="10dp" 
     android:textSize="15sp"/> 
</RelativeLayout> 
+1

发布你的'异常StackTrace'。指定究竟是什么行号引发异常。 –

+0

布局不是必需的。对于这个只有'StackTrace'已经绰绰有余了.. –

+0

使用调试器并在'//为每个按钮添加点击监听器时添加一个断点'并且您应该看到哪个数组条目为空 –

回答

0

之前,你可以找到你的活动的视图层次的意见,你的实际需要传递一些内容到活动中。在init()之前致电setContentView(R.layout.your_activity_layout)

相关问题