Kółko i krzyżyk, tic tac toe

0

Witam,

Od czasu do czasu staram się uczyć Javy. Znalazłem na YouTubie tutorial jak zrobić w eclipse grę kółko i krzyżyk. Link tutaj: . Pisałem mniej więcej, a raczej tak samo jak ten gość, ale na koniec gra nie działa tak jak należy, nie wiem co mogło pójść nie tak. Kółka i krzyżyki się wstawiają, ale program nie widzi, że trzy kółka bądź krzyżyki są w jednej linii.
To mój kod:

package TicTacToe;

import java.awt.EventQueue;

import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;

public class TicTacToe {

	private JFrame frame;
	private String startGame = "X";
	private int xCount = 0;
	private int oCount = 0;
	private JLabel btn1;
	private JLabel btn2;
	private JLabel btn3;
	private JLabel btn4;
	private JLabel btn5;
	private JLabel btn6;
	private JLabel btn7;
	private JLabel btn8;
	private JLabel btn9;
	private JTextField txtCountX;
	private JTextField txtCountO;
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TicTacToe window = new TicTacToe();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public TicTacToe() {
		initialize();
		
	}
	
	private void gameScore()
	{
		txtCountX.setText(String.valueOf(xCount++));
		txtCountO.setText(String.valueOf(oCount++));
	}
	
	private void choosePlayer()
	{
		if(startGame.equalsIgnoreCase("X"))
		{
			startGame="O";
		}
		else
		{
			startGame="X";
		}
		
	}
private void WinningGame()
{
	String b1 = btn1.getText();
	String b2 = btn2.getText();
	String b3 = btn3.getText();
	String b4 = btn4.getText();
	String b5 = btn5.getText();a
	String b6 = btn6.getText();
	String b7 = btn7.getText();
	String b8 = btn8.getText();
	String b9 = btn9.getText();
	
	if (b1==("X") && b2==("X") && b3==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	
	if (b4==("X") && b5==("X") && b6==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	
	if (b7==("X") && b8==("X") && b9==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	if (b1==("X") && b4==("X") && b7==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	if (b2==("X") && b5==("X") && b8==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	if (b3==("X") && b6==("X") && b9==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	if (b1==("X") && b5==("X") && b9==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
	if (b7==("X") && b5==("X") && b3==("X") )
	{
		JOptionPane.showMessageDialog(null, "Player X wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		xCount++;
		gameScore();
	}
//////////////////////Playe 0 winnig Combination//////////
	if (b1==("O") && b2==("O") && b3==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	
	if (b4==("O") && b5==("O") && b6==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	
	if (b7==("O") && b8==("O") && b9==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	if (b1==("O") && b4==("O") && b7==("0") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	if (b2==("O") && b5==("O") && b8==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	if (b3==("O") && b6==("O") && b9==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	if (b1==("O") && b5==("O") && b9==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
	if (b7==("O") && b5==("O") && b3==("O") )
	{
		JOptionPane.showMessageDialog(null, "Player O wins" , "Tic Tac Toe", JOptionPane.INFORMATION_MESSAGE);
		oCount++;
		gameScore();
	}
}

	
	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 600, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(new BorderLayout(0, 0));
		
		JPanel panel = new JPanel();
		panel.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		frame.getContentPane().add(panel, BorderLayout.CENTER);
		panel.setLayout(new GridLayout(3, 5, 2, 2));
		
		JPanel panel_1 = new JPanel();
		panel_1.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_1);
		panel_1.setLayout(new BorderLayout(0, 0));
		
		final JButton btn1 = new JButton("");
		btn1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn1.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn1.setForeground(Color.RED);
				}
				else
				{
					btn1.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
				
			}
		});
		btn1.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_1.add(btn1, BorderLayout.CENTER);
		
		JPanel panel_2 = new JPanel();
		panel_2.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_2);
		panel_2.setLayout(new BorderLayout(0, 0));
		
		final JButton btn2 = new JButton("");
		btn2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn2.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn2.setForeground(Color.RED);
				}
				else
				{
					btn2.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn2.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_2.add(btn2, BorderLayout.CENTER);
		
		JPanel panel_3 = new JPanel();
		panel_3.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_3);
		panel_3.setLayout(new BorderLayout(0, 0));
		
		final JButton btn3 = new JButton("");
		btn3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn3.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn3.setForeground(Color.RED);
				}
				else
				{
					btn3.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn3.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_3.add(btn3, BorderLayout.CENTER);
		
		JPanel panel_4 = new JPanel();
		panel_4.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_4);
		panel_4.setLayout(new BorderLayout(0, 0));
		
		JLabel lblPlayerX = new JLabel("Player X:");
		lblPlayerX.setFont(new Font("Tahoma", Font.BOLD, 15));
		panel_4.add(lblPlayerX, BorderLayout.CENTER);
		
		JPanel panel_5 = new JPanel();
		panel_5.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_5);
		panel_5.setLayout(new BorderLayout(0, 0));
		
		txtCountX = new JTextField();
		txtCountX.setHorizontalAlignment(SwingConstants.CENTER);
		txtCountX.setFont(new Font("Tahoma", Font.BOLD, 20));
		txtCountX.setText("0");
		panel_5.add(txtCountX, BorderLayout.CENTER);
		txtCountX.setColumns(10);
		
		JPanel panel_6 = new JPanel();
		panel_6.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_6);
		panel_6.setLayout(new BorderLayout(0, 0));
		
		final JButton btn4 = new JButton("");
		btn4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn4.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn4.setForeground(Color.RED);
				}
				else
				{
					btn4.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn4.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_6.add(btn4, BorderLayout.CENTER);
		
		JPanel panel_7 = new JPanel();
		panel_7.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_7);
		panel_7.setLayout(new BorderLayout(0, 0));
		
		final JButton btn5 = new JButton("");
		btn5.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn5.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn5.setForeground(Color.RED);
				}
				else
				{
					btn5.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn5.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_7.add(btn5, BorderLayout.CENTER);
		
		JPanel panel_8 = new JPanel();
		panel_8.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_8);
		panel_8.setLayout(new BorderLayout(0, 0));
		
		final JButton btn6 = new JButton("");
		btn6.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn6.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn6.setForeground(Color.RED);
				}
				else
				{
					btn6.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn6.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_8.add(btn6, BorderLayout.CENTER);
		
		JPanel panel_9 = new JPanel();
		panel_9.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_9);
		panel_9.setLayout(new BorderLayout(0, 0));
		
		JLabel lblPlayerO = new JLabel("Player O:");
		lblPlayerO.setFont(new Font("Tahoma", Font.BOLD, 15));
		panel_9.add(lblPlayerO, BorderLayout.CENTER);
		
		JPanel panel_11 = new JPanel();
		panel_11.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_11);
		panel_11.setLayout(new BorderLayout(0, 0));
		
		txtCountO = new JTextField();
		txtCountO.setFont(new Font("Tahoma", Font.BOLD, 20));
		txtCountO.setHorizontalAlignment(SwingConstants.CENTER);
		txtCountO.setText("0");
		panel_11.add(txtCountO, BorderLayout.CENTER);
		txtCountO.setColumns(10);
		
		JPanel panel_10 = new JPanel();
		panel_10.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_10);
		panel_10.setLayout(new BorderLayout(0, 0));
		
		final JButton btn7 = new JButton("");
		btn7.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn7.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn7.setForeground(Color.RED);
				}
				else
				{
					btn7.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn7.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_10.add(btn7, BorderLayout.CENTER);
		
		JPanel panel_13 = new JPanel();
		panel_13.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_13);
		panel_13.setLayout(new BorderLayout(0, 0));
		
		final JButton btn8 = new JButton("");
		btn8.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn8.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn8.setForeground(Color.RED);
				}
				else
				{
					btn8.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn8.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_13.add(btn8, BorderLayout.CENTER);
		
		JPanel panel_12 = new JPanel();
		panel_12.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_12);
		panel_12.setLayout(new BorderLayout(0, 0));
		
		final JButton btn9 = new JButton("");
		btn9.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				btn9.setText(startGame);
				if (startGame.equalsIgnoreCase("X"))
				{
					btn9.setForeground(Color.RED);
				}
				else
				{
					btn9.setForeground(Color.BLUE);
				}	
				
				choosePlayer();
				WinningGame();
			}
		});
		btn9.setFont(new Font("Tahoma", Font.PLAIN, 30));
		panel_12.add(btn9, BorderLayout.CENTER);
		
		JPanel panel_14 = new JPanel();
		panel_14.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_14);
		panel_14.setLayout(new BorderLayout(0, 0));
		
		JButton btnReset = new JButton("Reset");
		btnReset.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				btn1.setText(null);
				btn2.setText(null);
				btn3.setText(null);
				btn4.setText(null);
				btn5.setText(null);
				btn6.setText(null);
				btn7.setText(null);
				btn8.setText(null);
				btn9.setText(null);
				
				
				
			}
		});
		btnReset.setFont(new Font("Tahoma", Font.BOLD, 18));
		panel_14.add(btnReset, BorderLayout.CENTER);
		
		JPanel panel_15 = new JPanel();
		panel_15.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		panel.add(panel_15);
		panel_15.setLayout(new BorderLayout(0, 0));
		
		JButton btnExit = new JButton("Exit");
		btnExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				frame = new JFrame("Exit");
				if (JOptionPane.showConfirmDialog(frame,"Confirm id you want to exit","Tic Tac Toe",
						JOptionPane.YES_NO_OPTION) == JOptionPane.YES_NO_OPTION){
							System.exit(0);
						}
			}
		});
		btnExit.setFont(new Font("Tahoma", Font.BOLD, 18));
		panel_15.add(btnExit, BorderLayout.CENTER);
		
		
	}

}

Jeszcze jest taki motyw, że Eclipse każe mi dodać final do JButtonów, a na filmiku tego nie ma :/ final JButton btn1 itd.

0

Znajdź inny filmik - jeżeli widzisz numerację zmiennych to znak, że dany kod do niczego się nie nadaję.

0

Działa? A kompiluje się? Masz literkę dodaną do kodu, nie wiem czy tak jest w kodzie, czy przypadkowo dodałeś jak go przeklejałeś.
Ogólnie to hardcore.

private void WinningGame()
{
String b1 = btn1.getText();
String b2 = btn2.getText();
String b3 = btn3.getText();
String b4 = btn4.getText();
String b5 = btn5.getText();a <-- co to za literka
String b6 = btn6.getText();
String b7 = btn7.getText();
String b8 = btn8.getText();
String b9 = btn9.getText();

Z nudów zacząłem debugować ten kod, nawala nullami na lewo i prawo

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sample.TicTacToe.WinningGame(TicTacToe.java:79)

Wina pewnie tego, że komunikat generowany przez metodę WinningGame() rzuca nulla, bo nie odwołujesz się do parent component. Typowe dla AWT.
Poza tym można klikać w jednego buttona w nieskończoność, co jest z punktu widzenia logiki po prostu głupie. Jak się raz napisze na kartce papieru X, to nie można go zmienić na O.
Dobrze byłoby jakby był sprawdzany stan gry - czyli np. jak się kliknie na buttona, to nie możne zmienić tego stanu.
Więcej wniosków na razie nie mam, piwo mi się grzeje.
No może poza jednym wnioskiem - poszukaj gotowego kodu, na githubie jest tego od czorta i go przeanalizuj.

0

Przy wklejaniu mi się dodała literka. Kod działa ogólnie. Grać w grę się da, lecz już program nie widzi, że X są w jednym rzędzie i nie kończy gry.

0
String b1 = btn1.getText();

NullPointerException, nigdzie nie inicjalizujesz pola btn1, deklarujesz je na początku i to wszystko. W wejściu do metody sprawdzającej przy pierwszej linijce po wystąpieniu błędu przerywane jest dalsze wykonywanie tej metody.

Nie jestem w stanie wskazać Tobie co dokładnie trzeba poprawić, ale jeżeli chcesz poćwiczyć, to możesz pomyśleć co można wyciągnąć do osobnych metod. Najłatwiejszym byłoby sprawdzanie warunku wygrywania, wyciągnąć sprawdzanie wartości do metody i w parametrze podawać X lub O, to aż krzyczy żeby tak to zrobić, nie wspominając że da się to o wiele lepiej zrobić, ale to już będą jakieś podstawy. Masz mnóstwo powtarzającego się kodu, pomyśl jak zrobić żeby najlepiej się nie powtarzał.

Każda operacja na przycisku która jest kopiowana do kolejnego to można napisać metodę która przyjmuje w parametrze przycisk i wykonuje na nim jakieś set itp, potem podajesz tylko wszystkie po kolei jako argument metody.

To takie szybkie tipy na przyszłość.

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