2013-07-17 169 views
0

我是新手Java学生,谁被分配了tic tac脚趾游戏。当我尝试编译并运行程序,我得到以下错误:tic tac toe游戏java

run: 
Exception in thread "main" java.lang.NullPointerException 

at tictactoegame.TicTacToeGame.displayBoard(TicTacToeGame.java:55) 

at tictactoegame.TicTacToeGame.main(TicTacToeGame.java:23) 

Java Result: 1 
BUILD SUCCESSFUL (total time: 0 seconds) 

我也是在说"Local variable hides a field"

下面是我的项目代码到目前为止我createBoard方法得到一个警告。大多数代码是由学校提供给我的,我想在createBoard方法中初始化数组,并确定winOrTie方法中的优胜者。有没有人有任何想法如何让这个运行?我在数组的初始化中做错了什么?感谢任何能够帮助我的人。

package tictactoegame; 

import static tictactoegame.TicTacToeGame.gameboard; 

public class TicTacToeGame { 

    static int[][] gameboard; 
    static final int EMPTY = 0; 
    static final int NOUGHT = -1;  //this is an 'O' 
    static final int CROSS = 1;   //this is an 'X' 

    public static void main(String[] args) { 
     createBoard(3,3); 
     int turn =0; 
     int playerVal; 
     int outcome; 

     java.util.Scanner scan = new java.util.Scanner(System.in); 

     do { 
     displayBoard(); 
     playerVal = (turn % 2 == 0)? NOUGHT : CROSS; 
     if (playerVal == NOUGHT) System.out.println("\n--O's turn--"); 
     else System.out.println("\n--X's turn--"); 
     System.out.print("Enter row and column"); 

     try { 
      set(playerVal, scan.nextInt(), scan.nextInt()); 
     } catch (Exception ex) {System.err.println(ex);} 
     turn++; 
     outcome = winOrTie(); 
     } while (outcome == -2); 
     displayBoard(); 
     switch (outcome){ 
     case NOUGHT: 
      System.out.println("O wins!"); 
      break; 
     case CROSS: 
      System.out.println("X wins!"); 
      break; 
     case 0: 
      System.out.println("Tie."); 
      break; 
     } 
    } 

    static void set(int val, int row, int col) throws 
     IllegalArgumentException { 
     if (gameboard[row][col] == EMPTY) gameboard[row][col] = val; 
     else throw new IllegalArgumentException("Player already there!"); 
    } 



    static void displayBoard() { 
     for(int r=0; r < gameboard.length; r++) { 
     System.out.print("|"); 
     for(int c=0; c < gameboard[r].length; c++) { 
      switch(gameboard [r][c]) { 
       case NOUGHT: 
        System.out.print("O"); 
        break; 
       case CROSS: 
        System.out.print("X"); 
        break; 
       default:   //Empty 
        System.out.print(" "); 
      } 

      System.out.print("|"); 

     } 

     System.out.println("\n-----\n");    

     } 

    } 



    static void createBoard(int rows, int cols) { 
     int gameboard[][]= new int[3][3]; 
    } 



    static int winOrTie() {   

     //NOUGHT wins horizontal 

     if (gameboard[0][0] == NOUGHT && gameboard[0][1] == NOUGHT && gameboard[0][2] == NOUGHT) 
     return NOUGHT; 
     else if (gameboard[1][0] == NOUGHT && gameboard[1][1] == NOUGHT && gameboard[1][2] == NOUGHT) 
     return NOUGHT; 
     else if (gameboard[2][0] == NOUGHT && gameboard[2][1] == NOUGHT && gameboard[2][2] == NOUGHT) 
     return NOUGHT; 

     //NOUGHT wins veritcal 

     else if (gameboard[0][0] == NOUGHT && gameboard[1][0] == NOUGHT && gameboard[2][0] == NOUGHT) 
     return NOUGHT; 
     else if (gameboard[0][1] == NOUGHT && gameboard[1][1] == NOUGHT && gameboard[2][1] == NOUGHT) 
     return NOUGHT; 
     else if (gameboard[0][2] == NOUGHT && gameboard[1][2] == NOUGHT && gameboard[2][2] == NOUGHT) 
     return NOUGHT; 

     //NOUGHT wins diagonal 

     else if (gameboard[0][0] == NOUGHT && gameboard[1][1] == NOUGHT && gameboard[2][2] == NOUGHT) 
     return NOUGHT; 
     else if (gameboard[0][2] == NOUGHT && gameboard[1][1] == NOUGHT && gameboard[2][0] == NOUGHT) 
     return NOUGHT; 

     //CROSS wins horizontal 

     else if (gameboard[0][0] == CROSS && gameboard[0][1] == CROSS && gameboard[0][2] == CROSS) 
     return CROSS; 
     else if (gameboard[1][0] == CROSS && gameboard[1][1] == CROSS && gameboard[1][2] == CROSS) 
     return CROSS; 
     else if (gameboard[2][0] == CROSS && gameboard[2][1] == CROSS && gameboard[2][2] == CROSS) 
     return CROSS; 

     //CROSS wins veritcal 

     else if (gameboard[0][0] == CROSS && gameboard[1][0] == CROSS && gameboard[2][0] == CROSS) 
     return CROSS; 
     else if (gameboard[0][1] == CROSS && gameboard[1][1] == CROSS && gameboard[2][1] == CROSS) 
     return CROSS; 
     else if (gameboard[0][2] == CROSS && gameboard[1][2] == CROSS && gameboard[2][2] == CROSS) 
     return CROSS; 

     //CROSS wins diagonal 

     else if (gameboard [0][0] == CROSS && gameboard[1][1] == CROSS && gameboard[2][2] == CROSS) 
     return CROSS; 
     else if (gameboard [0][2] == CROSS && gameboard[1][1] == CROSS && gameboard[2][0] == CROSS) 
     return CROSS;    
     else 
     return -2; 
    } 
} 
+3

您需要使用一个调试器。 – SLaks

+2

密切关注编译器提供的警告。 Java很好,仅仅因为很好的理由而警告。在这种情况下,它直接指出你的问题。 – NoUserException

回答

2

您正在影响gameboard变量。当您致电createBoard时,您正在创建一个新的局部变量并将其初始化,这会使其他createBoard变量未初始化。

static void createBoard(int rows, int cols) { 
    int gameboard[][]= new int[3][3]; 
} 

尝试....

static void createBoard(int rows, int cols) { 
    gameboard = new int[3][3]; 
} 

相反

+0

那么解决了一个问题,但又带来了另一个问题。现在我在这些行上发现错误,说';'预计不是一个声明']'预计不是一个声明。任何想法呢?谢谢你的帮助。 –

+0

对不起,我的坏,检查更新 – MadProgrammer

+0

现在它的工作!万分感谢! –