Witam, chce zrobic gre Tic Tac Toe Gracz vs. Computer. Probowalem z Math.random ale nic nie wyszlo.Wiec mam Pytanie jak to zrobic ?
Pokaż ten Twój kod na którym próbowałeś.
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();
}
}
Nie widzę, żebyś próbował z Math.random . Nie ma tego w twoim kodzie.
Uzyj algorytmu "mini-max" :)
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/praktyka/kolko-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.
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.
Dzieki za odpowiedzi, jak by wygladal ten "mini-max" algorythm w tym przypadku ?
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)