TicTacToe赢得了条件问题

时间:2013-07-11 20:23:31

标签: java nullpointerexception tic-tac-toe

这里的新程序员,在Eclipse上使用Java编写Tictactoe游戏。

我认为我的胜利条件有问题。它出现了错误:     线程“main”java.lang.NullPointerException中的异常         在Game.NoughtsCrosses。(NoughtsCrosses.java:106)         在Game.Main.main(Main.java:5)

这是我的胜利条件位。这不是很好的imo,但我在编译时遇到了问题。谁能发现原因? TY !!

我在3x3网格中设置了正方形,0 - > 8.每个按钮都有自己的文本,每个玩家点击时都会设置为X或O.

winconditions代码:

if (square[0].getText().equals(square[1].getText()) && square[1].getText().equals(square[2].getText()) != square[0].getText().isEmpty()) {
    win = true;
}

Full Pastebin of code

再次感谢:)任何问题,我可以详细说明:D

6 个答案:

答案 0 :(得分:3)

看起来其中一个正方形文本为空。要记住的一件事是,空字符串与null不同。在java中,如果没有专门为String赋值,那么它将为null。要解决此问题,您需要在设置游戏板时将每个方块文本显式设置为""(空字符串)。

答案 1 :(得分:0)

如果您要实施此类解决方案,请自行简化工作。基于我上面看到的一小段代码,看起来你真的过分复杂了你必须做的工作。

char cell0 = //get that char, be it X or O
char cell1 = //
...
char cell8 = //

现在,您可以逐个比较单元格以确定胜利。您的棋盘游戏设置如下:

0 1 2
3 4 5
6 7 8

所以你可以按顺序排列:

Horizontal Solutions:
(cell0 == cell1 && cell0 == cell2)
(cell3 == cell4 && cell3 == cell5)
(cell6 == cell7 && cell6 == cell8)

Vertical Solutions
(cell0 == cell3 && cell0 == cell6)
//And so on

Cross Solutions:
(cell0 == cell4 && cell0 == cell8)
(cell2 == cell4 && cell2 == cell6)

这将检查你的胜利条件。

答案 2 :(得分:0)

问题是您的代码中有大量的大括号,因此问题中的语句实际出现在类NoughtsCrosses的实例初始化程序块中,但JButton组件都没有初始化但实例初始化器在构造函数之前调用,这是JButton实例化存在(但从未调用)的地方。当您尝试在数组getText的第一个元素上调用square时,a NullPointerException被抛出。

要修复删除其他大括号,请将代码包含在前面的ActionListener

class Action implements ActionListener {
    public void actionPerformed(ActionEvent e) {
       // existing code here
/// }    remove
//}      remove
// {     remove

    // win conditions. if true, set win==true; else set win
    // here is where the compilation error is, next line
    if (square[0].getText() == square[1].getText() ...) { 
      win = true;
    } //etc
} <-- add this

答案 3 :(得分:0)

您的胜利条件检查似乎不在您的actionPerformed代码中,而是在类级别,因此可能会在您的按钮填充窗口之前调用它。

尝试将支票放在actionPerformed内,如下所示:http://pastebin.com/xRViSUzy

答案 4 :(得分:0)

什么是范围(最简单,哪些花括号)是?

中有问题的一行

根据你的缩进判断它有点棘手,但在我看来你的“if”不在方法内(例如构造函数)。我猜你想要这条线以及它们周围的那条线在构造函数体中初始化方块的线之后执行。相反,这些行是预先运行的,因此对“new”的调用还没有运行。

我认为如果你进行一些重组以将这些条件移动到构造函数中,或者转换为构建之后调用的另一种方法,那么事情看起来会好很多。

希望有所帮助。

答案 5 :(得分:0)

好吧,我拿了你提供的代码,经过重大的探索,能够制作出功能齐全的Tic-Tac-Toe游戏。你大部分时间都处于正确的轨道上,你需要先完成一项设计。

在我的NoughtsCrosses课程中,我有以下内容:

  • class Action实现ActionListener
    • 这有一个JButton属性,我通过构造函数传递
    • 在actionPerformed中
      • 设置文字
      • 禁用按钮
      • 递增计数器
      • 检查某人是否获胜
        • 如果有胜利者或抽奖游戏结束,请设置“再次播放?”文本
        • else调用changeTurn函数
  • class Reset实现ActionListenter
    • 这有一个JButton属性,我通过构造函数传递
    • 在actionPerformed中
      • 我调用resetGame函数
  • function changeTurn
  • function resetGame
  • function checkForWinners

作为提示,这是我对Action类的实现以及我提到的构造函数的一个例子

class Action implements ActionListener{ 
 private JButton button;
 public Action(JButton button){ 
  this.button = button; 
 } 
 public void actionPerformed(ActionEvent e) { 
   button.setText(letter); 
   button.setEnabled(false); 
   counter++; 
   boolean gameOver = checkForWinners(); 
   if(!gameOver) 
    changeTurn(); 
   else{ 
    newgame.setText("Play again?"); 
    newgame.addActionListener(resetButton); 
   } 
 } 
}

new Action(square[i])这样的调用就是你需要做的工作。 注意:resetButton属于我上面提到的Reset类,就像Action类一样,它具有与newgame相同的构造。