Kółko i krzyżyk – sprawdzanie wygranej i resetowanie gry

0

Cześć witam,

Ogólnie sytuacja jest taka, że jestem bardzo zielony w javie, a mam napisać grę kółko i krzyżyk, które na dzień dzisiejszy wygląda tak:

import java.awt.EventQueue;
import java.awt.GridLayout; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;


public class Main extends JFrame{
	int counter = 0;
	
	public Main(){
/// Określa rozmiar, widoczność, nazwa wyświetlanego programu itp
		setSize(450,450);
		setVisible(true);
		setTitle("TicTacToe");
		/// Określa tablice? 3x3
		setLayout(new GridLayout(3,3));
		/// funkcja okresla zeby do kazdej komorki byl przypisany przycisk
		for (int i=1;i<=9;i++){
		JButton button = new JButton("");
		add(button);
		button.addActionListener(new ActionListener(){
            @Override
			public void actionPerformed(ActionEvent e) {
            	JButton button = (JButton) e.getSource();
            	if ( counter % 2 ==0){
            		button.setText("X");
			    System.out.println("X");
            	}
                else{
                	button.setText("O");
            	System.out.println("O");
              }
            	/// Zapobiega drugiemu kliknieciu na komorkę zeby z kolka nie zrobil sie krzyzyk
            	button.setEnabled(false);
            	counter++;
            }
		});
	    }
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable(){
			@Override
			public void run(){
				new Main();
			}
		});	
	}
}

Nie wiem zrobić żeby sprawdzał wygraną + do tego żeby restartowało grę? Chciałbym aby ktoś mi pomógł najlepiej napisał ten kawałek kodu i gdzie to wkleić. Proszę bardzo o pomoc. Pozdrawiam

0

Musisz gdzieś przechowywać wartości jakie ustawiasz w odpowiednich polach, stwórz sobie do tego np. jakoś tablice. Stwórz metodę korzystająca z tych wartości i sprawdzaj wygrana przy każdym kliknięciu przycisku jeśli wygrana=true wyzeruj wartości tablicy oraz teksty przycisków.

0

Dziękuje za odpowiedź. Na zajęciach profesor wspomniał coś o arraylist. Tylko tak jak pisałem wcześniej jestem strasznie zielony jeśli chodzi o jave :D. Wytłumaczył by ktoś o co chodzi? Albo podesłał jakiś odnośnik? Pozdrawiam.

0

Masz GridLayout 3x3, który zawiera Buttony. To jest element GUI, do tego potrzebujesz również wiadomości w kodzie, gdzie jest X i gdzie O i po każdym ruchu (lub po najmniejszej ilości ruchów w których można osiągnąć zwycięstwo) sprawdzać czy znajdują się 3 w takiej samej linii.
Jak to zrobić?
Popatrz, masz 9 Buttonów. Nie nasuwa Ci się nic? Podpowiadam - zrób sobie tablicę 9-elementową, w której będziesz trzymał stany wszystkich przycisków (ewentualnie sprawdzaj bezpośrednio na Buttonach korzystając z getText()) i napisz odpowiednie metody, które będą sprawdzać, czy istnieje linia zapełniona tylko X lub O
Spróbuj coś napisać, wklej kod i będziemy działać dalej ;)

0

Dziękuje za odpowiedź 😊 Jak wrócę do domu to zacznę kombinować powolutku i będę starał się wklejać postępy 👍.

0

Bazując na Twoim kodzie można to zrobić mnie więcej tak:

public class Main extends JFrame{
	
	private List<JButton> list = new ArrayList<>();
	private int counter = 0;
	
	public Main() {
		this.setLayout(new GridLayout(3, 3));
		this.setSize(400, 450);
		init();
		this.setVisible(true);
	}
	
	private void init() {
		for (int i = 1; i <= 9; i++) {
			JButton tmpButton = new JButton();
			tmpButton.addActionListener(e -> {
				if (counter % 2 ==0){
                    tmpButton.setText("X");
                }
                else{
                    tmpButton.setText("O");
                }
				counter++;
				tmpButton.setEnabled(false);
				checkWin();
			});
			list.add(tmpButton);
		}

		for (JButton element : list) {
			this.add(element);
		}
	}

	private void checkWin() {
		//Tutaj sprawdzaj wszystkie możliwości wygrania (chyba jest ich 8)
	}

	public static void main(String[] args) {
		EventQueue.invokeLater(() -> {
			new Main();
		});
	}
}
0
import java.awt.EventQueue;
import java.awt.GridLayout; 
import javax.swing.JButton;
import javax.swing.JFrame;


public class Main extends JFrame
{
	
	//false = krzyzyk, true kolko
	public static boolean type = false;
	//tablica z przyciskami
	public static JButton[][] buttons = new JButton[3][3];
	
	public Main()
	{
		/// Określa rozmiar, widoczność, nazwa wyświetlanego programu itp
		setSize(450,450);
		setVisible(true);
		setTitle("TicTacToe");
		/// Określa tablice? 3x3
		setLayout(new GridLayout(3,3));
		/// funkcja okresla zeby do kazdej komorki byl przypisany przycisk
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j <3; j++)
			{
				myButton button = new myButton("", i, j);
				buttons[i][j] = button;
				button.addActionListener(new buttonHandler());
				add(button);
			}
		}
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable(){
			@Override
			public void run(){
				new Main();
			}
		});	
	}
}

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;


public class buttonHandler implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent e)
	{
		myButton button = (myButton) e.getSource();
		if(Main.type)
		{
			button.setText("O");
			Main.type = false;
		}
		else
		{
			button.setText("X");
			Main.type = true;
		}
		button.setEnabled(false);
		checkIfEnded(button);
	}

	
	private void checkIfEnded(myButton button)
	{
		int indexI = button.indexI;
		int indexJ = button.indexJ;
		String sign = button.getText();
		
		if(indexI == 0)
		{	
			if(indexJ == 0)
			{
				if((Main.buttons[0][1].getText() == sign && Main.buttons[0][2].getText() == sign) ||
					(Main.buttons[1][0].getText() == sign && Main.buttons[2][0].getText() == sign) ||
					(Main.buttons[1][1].getText() == sign && Main.buttons[2][2].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}
			}
			else if(indexJ == 1)
			{
				if((Main.buttons[0][0].getText() == sign && Main.buttons[0][2].getText() == sign) ||
					(Main.buttons[1][1].getText() == sign && Main.buttons[2][1].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}
			}
			else
			{
				if((Main.buttons[0][0].getText() == sign && Main.buttons[0][1].getText() == sign) ||
					(Main.buttons[1][2].getText() == sign && Main.buttons[2][2].getText() == sign) ||
					(Main.buttons[1][1].getText() == sign && Main.buttons[2][0].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}
			}
		}
		else if(indexI == 1)
		{
			if(indexJ == 0)
			{
				if((Main.buttons[0][0].getText() == sign && Main.buttons[2][0].getText() == sign) ||
					(Main.buttons[1][1].getText() == sign && Main.buttons[1][2].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}				
				
			}
			else if(indexJ == 1)
			{
				if((Main.buttons[1][0].getText() == sign && Main.buttons[1][2].getText() == sign) ||
					(Main.buttons[0][1].getText() == sign && Main.buttons[2][1].getText() == sign) ||
					(Main.buttons[0][0].getText() == sign && Main.buttons[2][2].getText() == sign) ||
					(Main.buttons[0][2].getText() == sign && Main.buttons[2][0].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}
			}
			else
			{
				if((Main.buttons[0][2].getText() == sign && Main.buttons[2][2].getText() == sign) ||
					(Main.buttons[1][0].getText() == sign && Main.buttons[1][1].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}
			}
			
		}
		else
		{
			if(indexJ == 0)
			{
				if((Main.buttons[2][1].getText() == sign && Main.buttons[2][2].getText() == sign) ||
					(Main.buttons[1][0].getText() == sign && Main.buttons[0][0].getText() == sign)||
					(Main.buttons[1][1].getText() == sign && Main.buttons[0][2].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}				
				
			}
			else if(indexJ == 1)
			{
				if((Main.buttons[2][0].getText() == sign && Main.buttons[2][2].getText() == sign) ||
					(Main.buttons[0][1].getText() == sign && Main.buttons[1][1].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}	
			}
			else
			{
				if((Main.buttons[2][0].getText() == sign && Main.buttons[2][1].getText() == sign) ||
					(Main.buttons[0][2].getText() == sign && Main.buttons[1][2].getText() == sign)||
					(Main.buttons[1][1].getText() == sign && Main.buttons[0][0].getText() == sign))
					{
						JOptionPane.showMessageDialog(null, sign + "- WINS", "WIN", JOptionPane.INFORMATION_MESSAGE);
					}	
			}
		}
		
	}
}


import javax.swing.JButton;

public class myButton extends JButton{
	
	public int indexI;
	public int indexJ;
	
	
	public myButton(String _text, int _indexI, int _indexJ)
	{
		super();
		this.setText(_text);
		this.indexI = _indexI;
		this.indexJ = _indexJ;
	}

}


Na razie tak to wygląda. Do końca nie wiem jeszcze jak zresetować całą grę.

0

Cześć to znowu ja :D. I kolejny problem, z którym już totalnie nie umiem sobie poradzić. Dotyczy oczywiście tego projektu. Profesor powiedział teraz żeby gra działa na dwóch komputerach, aby dwójka graczy mogła grać. Ogólnie jak zawsze zdawkowo powiedział o Clientserwerze, socketach, że powinniśmy użyć tego do stworzenia. Osobiście ja wymiękam i nie mam totalnie pojęcia jak to zacząć. Proszę pilnie o pomoc. Pozdrawiam.

0

Ogólnie facet powiedział, że to powinno działać jak skopiuję stąd server i clienta: http://cs.lmu.edu/~ray/notes/javanetexamples/

No okej ale co ja mam dalej zrobić zeby to odpaliło bo ni kija nie mam pojęcia.

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