Вопрос по java – Крестики-нолики Ява

1

Я новичок в изучении программирования на Java и играю в крестики-нолики.

Когда я закончу свою игру, я не смогу продолжать играть в нее, потому что программа завершится. Что я должен добавить к этому коду. Поскольку я не использую метод рисования, repaint () не может быть использован.

import java.awt.*;  
import java.awt.event.*;
import javax.swing.*;

public class TicTacToeV1 implements ActionListener {
    /*Instance Variables*/
    private JFrame window = new JFrame("Tic-Tac-Toe");
    private JButton button1 = new JButton("");
    private JButton button2 = new JButton("");
    private JButton button3 = new JButton("");
    private JButton button4 = new JButton("");
    private JButton button5 = new JButton("");
    private JButton button6 = new JButton("");
    private JButton button7 = new JButton("");
    private JButton button8 = new JButton("");
    private JButton button9 = new JButton("");

    private String letter = "";
    public static int count = 0;
    public TicTacToeV1(){           
        /*Create Window*/
        window.setSize(300,300);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(new GridLayout(3,3));

        /*Add Buttons To The Window*/
        window.add(button1);
        window.add(button2);
        window.add(button3);
        window.add(button4);
        window.add(button5);
        window.add(button6);
        window.add(button7);
        window.add(button8);
        window.add(button9);

        /*Add The Action Listener To The Buttons*/
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);
        button4.addActionListener(this);
        button5.addActionListener(this);
        button6.addActionListener(this);
        button7.addActionListener(this);
        button8.addActionListener(this);
        button9.addActionListener(this);

        /*Make The Window Visible*/
        window.setVisible(true);

        String input = JOptionPane.showInputDialog("Please select ur pawn: \n1) X\n2) O");
        int pawn = Integer.parseInt(input);
        if ( input.equals("2")){
              setCount(1);
        }
    }

    public static void setCount (int co){
        count = co;            
    }

    public void actionPerformed(ActionEvent a) {    
        count++;

        /*Calculate Who's Turn It Is*/
        if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9|| count == 11){
            letter = "X";

        } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){
            letter = "O";
        }

        /*Display X's or O's on the buttons*/
        if(a.getSource() == button1){
            button1.setText(letter);
            button1.setEnabled(false);
        } else if(a.getSource() == button2){
            button2.setText(letter);
            button2.setEnabled(false);
        } else if(a.getSource() == button3){
            button3.setText(letter);
            button3.setEnabled(false);
        } else if(a.getSource() == button4){
             button4.setText(letter);
             button4.setEnabled(false);
        } else if(a.getSource() == button5){
             button5.setText(letter);
             button5.setEnabled(false);
        } else if(a.getSource() == button6){
             button6.setText(letter);
             button6.setEnabled(false);
        } else if(a.getSource() == button7){
             button7.setText(letter);
             button7.setEnabled(false);
        } else if(a.getSource() == button8){
             button8.setText(letter);
             button8.setEnabled(false);
        } else if(a.getSource() == button9){
             button9.setText(letter);
             button9.setEnabled(false);
        }       
    }

    public static void main(String[] args){           
            new TicTacToeV1();
    }
}
Мой браузер она прокручивает ... Dave Newton
Дать емуreset() метод, в котором вы сбрасываете состояние своей программы и вызываете его из ActionListener resetButton. Hovercraft Full Of Eels
Вы действительно должны посмотреть на двухмерные массивы - это значительно упростит код, а также сделаетreset Метод на воздушной подушке предлагает проще. Кроме того, хотя некоторое пространство обычно считается хорошей идеей, его можно переусердствовать. Voo
Примечания 1 + 2: если вы ставите пустую строку после каждой строки, это не помогает структурировать вывод. 2: если вы называете переменные jb1, jb2 и т. Д., Вы используете искаженные массивы без всех их преимуществ. user unknown

Ваш Ответ

2   ответа
1

лать следующее:

Reset each text value. Reset count to 0.

Возможно, вы захотите создать массив [] (или двумерный массив, если вы знаете, как & gt; & gt; [] []) для кнопок, а также как им легче управлять. Это позволяет лучше управлять многими кнопками и устраняет множество бесполезных повторений, которые есть у вашего текущего кода.

Пример кода:

public static void reset() {
    button1.setText("");
    button1.setEnabled(true);
    //etc...
    count = 0;
}

Затем просто вызовите reset (), когда игра закончится (вы также можете проверить, кто выиграл).

Надеюсь, это поможет и DFTBA. :)

1

б) У вас нет способа определить победителя или законченную игру, поэтому я просто добавил код после счетчика == 9.

import java.awt.*;  
import java.awt.event.*;
import javax.swing.*;

public class TicTacToeV1 extends JFrame implements ActionListener {
    private JButton [] button  = new JButton [9];
    private int count = 0;

    public TicTacToeV1 () {           
        super ("Tic-Tac-Toe");
        setSize (300, 300);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setLayout (new GridLayout (3, 3));
        init ();
    }

    private void init () {           
        count = 0;
        for (int i = 0; i < 9; ++i) {
            button [i] = new JButton ("");
            button [i].addActionListener (this);
            add (button [i]);
        }
        setVisible (true);
    }

    public void actionPerformed (ActionEvent a) {    
        String letter = (++count % 2 == 1) ? "X" : "O";
        /*Display X's or O's on the buttons*/
        for (JButton jb : button) 
        if (a.getSource () == jb) {
            jb.setText (letter);
            jb.setEnabled (false);
        }
        if (count == 9) {
            for (JButton jb : button) 
                remove (jb) ;
            init ();
        }
    }

    public static void main (String [] args) {           
        new TicTacToeV1 ();
    }
}

Я помещаю переменную часть в собственный метод (init) и вызываю ее из Ctor или из метода конца игры.

Конечно, вы могли бы также вызвать новый Ctor оттуда. Или просто сбросьте состояние кнопки и счетчика. Есть много способов добраться до Рима. Хотя это не должно играть роли, избегание 100 завершенных игр в памяти со всеми их кнопками может сэкономить 10 КБ памяти или около того.

@MadBurn: Да, но у новичков обычно возникают проблемы при инициализации массивов не примитивов, они путают массив для 9 кнопок с самими 9 кнопками, поэтому получают NPE, поэтому я сделал рабочее решение без значимого обнаружения новых игр. user1403675 может посмотреть на него и попытаться написать то же самое, не глядя снова, или вырезать и вставить; это его выбор. У него есть какой-то неиспользуемый код для выбора символа, который использует первый игрок, и ему нужно что-то сделать, чтобы он работал.
Это очень распространенная проблема курса CS (это, вероятно, домашнее задание). Исправление всего его метода так, чтобы он мог просто копировать и вставлять, не сделает его лучшим программистом.

Похожие вопросы