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/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.

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