Tic Tac Toe Gracz vs.Computer

0

Witam, chce zrobic gre Tic Tac Toe Gracz vs. Computer. Probowalem z Math.random ale nic nie wyszlo.Wiec mam Pytanie jak to zrobic ?

0

Pokaż ten Twój kod na którym próbowałeś.

0
public class TTTCOMP implements ActionListener {
    // JButton b1 = new JButton("");
    // JButton b2 = new JButton("");
    // JButton b3 = new JButton("");
    // JButton b4 = new JButton("");
    // JButton b5 = new JButton("");
    // JButton b6 = new JButton("");
    // JButton b7 = new JButton("");
    // JButton b8 = new JButton("");
    // JButton b9 = new JButton("");
    JButton b[] = new JButton[9];
    JFrame frame;
    int count = 0;
    String s = "";
    int a;
    boolean win = false;

    public TTTCOMP() {
        frame = new JFrame();
        frame.setLayout(new GridLayout(3, 3));
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        // frame.add(b1);
        // frame.add(b2);
        // frame.add(b3);
        // frame.add(b4);
        // frame.add(b5);
        // frame.add(b6);
        // frame.add(b7);
        // frame.add(b8);
        // frame.add(b9);

        for (int i = 0; i < 9; i++) {
            b[i] = new JButton();
            b[i].addActionListener(this);
            frame.add(b[i]);
        }

        // b1.addActionListener(this);
        // b2.addActionListener(this);
        // b3.addActionListener(this);
        // b4.addActionListener(this);
        // b5.addActionListener(this);
        // b6.addActionListener(this);
        // b7.addActionListener(this);
        // b8.addActionListener(this);
        // b9.addActionListener(this);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        count++;
        if (count == 1 || count == 3 || count == 5 || count == 7 || count == 9) {
            s = "X";
        } else {
            if (count == 2 || count == 4 || count == 6 || count == 8 || count == 10) {

            }
        }

        if (e.getSource() == b[0]) {
            b[0].setText(s);
            a = (int) ((Math.random() * 10));
            b[a].setText("O");
            b[0].setEnabled(false);
            b[a].setEnabled(false);
        } else if (e.getSource() == b[1]) {
            b[1].setText(s);
            a = (int) ((Math.random() * 10) + 1);
            if (a == 0 || a == 2) {
                a = (int) ((Math.random() * 10) + 1);
            } 
            b[a].setText("O");
            b[1].setEnabled(false);
            b[a].setEnabled(false);
        } else if (e.getSource() == b[2]) {
            b[2].setText(s);
            b[2].setEnabled(false);
            // b4.setText("O");
            // b4.setEnabled(false);
        } else if (e.getSource() == b[3]) {
            b[3].setText(s);
            b[3].setEnabled(false);
            // b3.setText("O");
            // b3.setEnabled(false);
        } else if (e.getSource() == b[4]) {
            b[4].setText(s);
            b[4].setEnabled(false);
            // b6.setText("O");
            // b6.setEnabled(false);
        } else if (e.getSource() == b[5]) {
            b[5].setText(s);
            b[5].setEnabled(false);
            // b5.setText("O");
            // b5.setEnabled(false);
        } else if (e.getSource() == b[6]) {
            b[6].setText(s);
            b[6].setEnabled(false);
            // b8.setText("O");
            // b8.setEnabled(false);
        } else if (e.getSource() == b[7]) {
            b[7].setText(s);
            b[7].setEnabled(false);
            // b7.setText("O");
            // b7.setEnabled(false);
        } else if (e.getSource() == b[8]) {
            b[8].setText(s);
            b[8].setEnabled(false);
            // b8.setText("O");
            // b8.setEnabled(false);
        }
        if (b[0].getText() == b[1].getText() && b[1].getText() == b[2].getText() && b[0].getText() != "") {
            win = true;
        } else if (b[3].getText() == b[4].getText() && b[4].getText() == b[5].getText() && b[3].getText() != "") {
            win = true;
        } else if (b[6].getText() == b[7].getText() && b[7].getText() == b[8].getText() && b[6].getText() != "") {
            win = true;
        } else if (b[0].getText() == b[3].getText() && b[3].getText() == b[6].getText() && b[0].getText() != "") {
            win = true;
        } else if (b[1].getText() == b[4].getText() && b[4].getText() == b[7].getText() && b[1].getText() != "") {
            win = true;
        } else if (b[2].getText() == b[5].getText() && b[5].getText() == b[8].getText() && b[2].getText() != "") {
            win = true;
        } else if (b[0].getText() == b[4].getText() && b[4].getText() == b[8].getText() && b[0].getText() != "") {
            win = true;
        } else if (b[2].getText() == b[4].getText() && b[4].getText() == b[6].getText() && b[2].getText() != "") {
            win = true;
        } else {
            win = false;
        }

        if (win == true) {
            if (s.equals("X")) {
                JFrame frame1 = new JFrame();
                JLabel label1 = new JLabel(new ImageIcon(getClass().getResource("/Images/winx.png")));
                frame1.setVisible(true);
                frame1.setSize(230, 290);
                frame1.setLocationRelativeTo(null);
                frame1.setResizable(false);
                frame1.add(label1);
            } else {
                if (s.equals("O")) {
                    JFrame frame1 = new JFrame();
                    JLabel label1 = new JLabel(new ImageIcon(getClass().getResource("/Images/wino.png")));
                    frame1.setVisible(true);
                    frame1.setSize(230, 290);
                    frame1.setLocationRelativeTo(null);
                    frame1.setResizable(false);
                    frame1.add(label1);
                }
            }
        } else if (count == 5 && win == false) {
            JFrame frame1 = new JFrame();
            JLabel label1 = new JLabel(new ImageIcon(getClass().getResource("/Images/un.jpg")));
            frame1.setVisible(true);
            frame1.setSize(230, 290);
            frame1.setLocationRelativeTo(null);
            frame1.setResizable(false);
            frame1.add(label1);
        }
    }

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

}
0

Nie widzę, żebyś próbował z Math.random . Nie ma tego w twoim kodzie.

0

Uzyj algorytmu "mini-max" :)

0

Weź rozplanuj sobie jakoś aplikację - podziel wszystko na klasy, metody, ponieważ nie trudno się pogubić w tym. Każda klasa z małą odpowiedzialnością. Np. po każdym ruchu uruchamiaj metodę sprawdzającą czy wynik został zrealizowany w jakiejś klasie etc. Wracając do algorytmu grania z komputerem. Możesz do tablicy jednowymiarowej wprowadzać pola, które są wolne i tam losować indeks tej tablicy to będzie ruch komputera. Takie losowa gra komputera. Możesz skorzystać z prostego algorytmu komputera - http://www.algorytm.org/prakt[...]-krzyzyk/kolko-krzyzyk-j.html . Możesz również wykorzystać nieco bardziej rozbudowane algorytmy jak min-max jak to kolega wyżej ujął czy jego rozwinięcie alfa-beta - jednakże są to algorytmy trochę bardziej skomplikowane i odnoszą się do gier dwuosobowych.

0

Można też wprowadzić szczątkową "inteligencję" komputera. Jeśli komputer ma ruch wygrywający, to go wykonuje, jeśli nie ma ruchu wygrywającego ale człowiek ma ruch wygrywający, to komputer blokuje człowieka. Dopiero w trzeciej kolejności losowane jest posunięcie.

0

Dzieki za odpowiedzi, jak by wygladal ten "mini-max" algorythm w tym przypadku ?

0

https://pl.wikipedia.org/wiki/Algorytm_min-max
Algorytm min-max

http://neverstopbuilding.com/minimax
Tic Tac Toe Understanding The MiniMax Algorithm

http://eduinf.waw.pl/inf/utils/002_roz/p012.php
gra kolko i krzyzyk z uzyciem algortymu minimax (komentarze po polsku)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0