2013-07-11 2 views
0

Новый программист здесь, написав игру Tictactoe, используя Java на Eclipse.TicTacToe win условия проблемы

У меня проблемы с условиями выигрыша, я думаю. Он приходит с ошибкой:. Исключение в потоке "главный" 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

+0

1) Нет необходимости добавлять основной тег в заголовок. 2) Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). –

+1

FYI это на самом деле ошибка _run-time__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – DaoWen

+0

просто хотел сообщить, что я обновил свой ответ ниже. – Legion

ответ

0

Ну, я взял код, который вы предоставили, и после того, как значительная фиалка смогла создать полноценную игру Tic-Tac-Toe. Вы были в основном на правильном пути с тем, что вы делали, вам просто нужно сначала начать с дизайна.

В моем классе NoughtsCrosses я следующее:

  • класса действий реализует ActionListener
    • Это имеет JButton атрибут, который я прохожу через конструктор
    • В наборе actionPerformed
      • текст
      • отключить кнопку
      • приратить счетчик
      • проверить, выиграл ли кто-нибудь
        • Если есть победитель или ничья, заканчивается игра «Играть снова?"Текст
        • еще вызвать функцию changeTurn
  • класса Заново орудия ActionListenter
    • Это имеет JButton атрибут, который я прохожу через конструктор
    • В actionPerformed
      • Я вызываю функцию resetGame
  • функция changeTurn
  • функция resetGame
  • функция checkForWinners

как намек, это моя реализация класса действий и пример конструктора я упомянул

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.

+0

вот базовый дизайн для программы, которую вы хотите. Как я уже сказал, у меня есть полностью работающая версия, так что спросите меня, есть ли у вас вопросы по ее реализации. – Legion

+0

Большое вам спасибо, вы спасатель жизни: D Вы много изменили о графическом интерфейсе или все это выглядит нормально? Вы сохранили кнопки в 1-мерном массиве или изменили его на два многомерных массива? – Sphyxx

+0

Я сохранил их в одномерном массиве. Единственное, что я изменил в графическом интерфейсе, добавляет отсутствующий 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 (но никогда не называемый). Когда вы пытаетесь вызвать getText на первый элемент массива square, то забрасывается 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

Какова область (наиболее просто, что фигурные скобки) является проблематичной линия внутри?

Было немного сложно определить, основываясь на вашем отступе, но мне кажется, что ваш «если» не был внутри метода (например, конструктор). Я предполагаю, что вы задумали эту линию, а те, что вокруг них, выполнялись после строк в теле вашего конструктора, где инициализируются квадраты. Вместо этого эти строки запускаются заранее, и поэтому вызов «нового» еще не запущен.

Я думаю, что если вы выполните некоторую реструктуризацию, чтобы переместить эти условия в свой конструктор или в другой метод, который вы вызываете после, тогда все будет выглядеть намного лучше.

Надеюсь, что это поможет.

Смежные вопросы