2013-07-11 43 views
0

這裏的新程序員,在Eclipse上使用Java編寫Tictactoe遊戲。TicTacToe贏條件問題

我覺得我的獲勝條件有問題。它有錯誤出現。 異常線程 「main」 顯示java.lang.NullPointerException 在Game.NoughtsCrosses(NoughtsCrosses.java:106) 在Game.Main.main(Main.java:5)

這是我的勝利條件。這不是很好的做法,但編譯時遇到問題。任何人都可以發現原因泰!

我在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

+0

1)沒有必要增加的主要標籤的稱號。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+1

僅供參考,這實際上是_run-time error_而不是_compile-time error_。 – DaoWen

+0

只是想讓你知道我在下面更新了我的答案。 – Legion

回答

0

那麼我拿了你提供的代碼,並在顯着的finagling之後才能夠完成一個功能齊全的井字遊戲。你大部分時間都處於正確的軌道上,你剛剛需要做什麼才能開始設計。

在我NoughtsCrosses類我有以下幾點:

  • 集體訴訟實現的ActionListener
    • 這有一個JButton屬性中,我通過一個構造
    • 傳遞在actionPerformed
      • 集文字
      • 禁用按鈕
      • 增加計數器
      • 檢查是否有人贏
        • 如果有贏家或抽獎遊戲結束設置「再次播放?「文本
        • 其他調用changeTurn功能
  • 類重置工具ActionListenter
    • 這有一個JButton屬性中,我通過一個構造
    • 傳遞在actionPerformed
      • 我稱之爲resetGame功能
  • 功能changeTurn
  • 功能resetGame
  • 功能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])一個電話是你需要做這算什麼工作。 注:resetButtonReset類我上面提到很像Action類它有我通過newgame到同一構造的。

+0

這裏是你想要的程序的基本設計。正如我所說,我有一個完整的工作版本,所以問我,如果你有問題實施 – Legion

+0

非常感謝你,你是一個拯救生命的人:D你有很多關於GUI的變化,或者看起來一切都好嗎?你把按鈕放在一個一維數組中還是將它改爲兩個多維數組? – Sphyxx

+0

我將它們保存在一維數組中。我在GUI上改變的唯一東西是添加了缺少的ActionListener來重置遊戲,剩下的就好了! – Legion

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) 

這將檢查你的勝利conditon。

3

它看起來像一個正方形文本是空的。有一件重要的事情要記住,一個空字符串與null不是一回事。在java中,如果你沒有專門爲String賦值,那麼它將爲null。爲了解決這個問題,當你設置你的遊戲板時,你需要明確地設置每個方塊文字爲""(一個空字符串)。

+0

OP說:「每個按鈕都有自己的文本,每個玩家點擊時文本會被設置爲X或O.」這可能意味着你是正確的,而且它是導致問題的未點擊的按鈕之一。 – rossum

+0

@rossum是啊,這與'java.lang.NullPointerException'結合使我相當有信心,這是問題 – nick

0

問題是您的代碼中有大量花括號,因此該問題中的語句實際上出現在NoughtsCrosses類的實例初始化程序塊中,但JButton組件尚未初始化,因爲實例初始化程序被調用之前的構造函數,其中JButton實例化存在(但從未調用)。當您嘗試在數組square的第一個元素上調用getText時,會引發一個 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 
+0

謝謝!剛剛擺脫那些。現在它加載得很好,得到了另外一個或兩個錯誤,但至少我可以看到現在發生了什麼,並開始照顧它。再次感謝你:) – Sphyxx

0

好像你的勝利條件檢查一下是不是你的actionPerformed代碼中,而是在類級別,因此它可能會在窗口填充按鈕之前被調用。

試着將支票上的actionPerformed像這裏面:http://pastebin.com/xRViSUzy

0

範圍是什麼(最簡單地說,這花括號)是內部問題的行?

根據您的縮進來判斷有點棘手,但在我看來,您的「if」不在方法內(例如構造函數)。我猜想你希望這行以及它們周圍的行要在正方形初始化的構造函數體中的行之後執行。相反,這些線路正在預先運行,因此「新」的調用尚未運行。

我認爲,如果你做一些調整,以這些條件進入你的構造函數或到您撥打建設那麼事情就會看起來好多了另一種方法。

希望有所幫助。