TicTacToe bauen

lisali

Erfahrenes Mitglied
Hallo,

ich wollte meine Java Kenntnisse erweitern und TicTacToe nachbauen.

Jetzt hänge ich fest, dass ich mit einer Schleife alle 9 Buttons erstellt habe, aber nicht weiß wie ich das actionPerformed hineinkriege:

Code:
	    JPanel p = new JPanel();
	    p.setLayout(new GridLayout(3,3));
	    
	    // adding buttons to play
	    JButton[] b = new JButton[9];
	    for (int i=0; i<9;i++)
	    {
	    b[i] = new JButton("");     
	    p.add(b[i]);
	    

	    }

Wie mache ich das? Ich möchte nämlich, dass ein Button nach dem Klick disabled wird.
 
Ohne etwas mit Java am Hut zu haben würde ich so rein intuitiv den ActionListener und die Methode addActionListener verwenden.
 
Diese solltest du natürlich in der Schleife hineinfügen ;)
Um den Button nach einem Klick zu disablen, musst du im Listener die entsprechende Funktion aufrufen (hab ich grad nicht mehr im Kopf, aber google hilft da ja bestimmt ;) )
 
Ja, das ist mir klar... habe ich ja auch probiert, aber das geht nicht so einfach. Ich habe jetzt nur den Code geposted, der keine Fehler meldet. Ich kriege dieses actionPerformed eben nicht in die Schleife rein.

Und ich hatte schon gegoogelt und bin nicht fündig geworden, was das Ganze bezogen auf eine Array-Schleife angeht.
 
Mal rein inuitiv würde ich es so versuchen:

Java:
JPanel p = new JPanel();
p.setLayout(new GridLayout(3,3));
	    
// adding buttons to play
JButton[] b = new JButton[9];
for (int i=0; i<9;i++)
{
	b[i] = new JButton("");
	b[i].addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0)
		{
			System.out.println("Button gedrückt");
		}
	};
	p.add(b[i]);
}

Ich würde aber eher ein 2D-Array verwenden.
 
Zuletzt bearbeitet:
Wieso ein zweidim. Array und wie würde sowas in dem Fall aussehen?

Ich weiß ehrlich gesagt nicht mal wie ich den Code fortführen soll. Eigentlich wollte ich alles so laufen lassen, dass ich eine Klasse nur für's GUI schreibe und dann noch eine für die Spielfunktion an sich und die Methoden in einem Interface definiere. Aber so rein logisch bin ich da noch nicht hinterhergekommen...
 
Ein 2D-Array bietet sich an, da TicTacToe ja ein 2-D spiel ist ;)

Würde dann so aussehen:
Code:
|0,0|0,1|0,2|
|1,0|1,1|1,2|
|2,0|2,1|2,2|

So kannst du dann auch leicht überprüfen was n einer Reihe liegt, da du jetzt die Spielfeldkoordinaten als Arrayindex verwendest ;)
 
evtl. eine kleine Hilfe:
ich bin ein Freund von Auslagern der ActionListener...aber jeder so wie er/sie es mag:
Für die GUI würde ich es ungefähr so implementieren:

Java:
import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;

public class TicTacToe {

	private JFrame frame;
	private JButton[] buttons;
	private boolean xOrO;

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

	public TicTacToe() {
		xOrO = true;
		initFrame();
		initButtons();

	}

	private void initButtons() {
		buttons = new JButton[9];
		int i;
		for (i = 0; i < 9; i++) {
			buttons[i]= new JButton();
			frame.add(buttons[i]);
			buttons[i].addActionListener(new TicTacToeListener(this ,buttons[i]));

		}

	}

	private void initFrame() {
		frame = new JFrame("Tic Tac Toe");

		frame.setSize(250, 250);
		frame.setLayout(new GridLayout(3, 3));
		frame.setLocation(
				(Toolkit.getDefaultToolkit().getScreenSize().width - 250) / 2,
				(Toolkit.getDefaultToolkit().getScreenSize().height - 250) / 2);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}



	public boolean isxOrO() {
		return xOrO;
	}

	public void setxOrO(boolean xOrO) {
		this.xOrO = xOrO;
	}

}

und der ActionListener, wobei dann noch die Logik des Spiels fehlt!

Java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class TicTacToeListener implements ActionListener {

	private TicTacToe ticTacToe;
	private JButton button;

	public TicTacToeListener(TicTacToe ticTacToe, JButton button) {
		this.ticTacToe = ticTacToe;
		this.button = button;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == button){
			if (ticTacToe.isxOrO()){
				button.setBackground(Color.RED);
			}else{
				button.setBackground(Color.BLUE);
			}
			button.setEnabled(false);
			changeXorO();
		}

	}

	private void changeXorO() {
		if (ticTacToe.isxOrO()) {
			ticTacToe.setxOrO(false);
		} else {
			ticTacToe.setxOrO(true);
		}
	}
}
 
Um mal deine eigentliche Frage zu beantworten, ohne sonst irgendwie auf die Logik des Spiels einzugehen, wenn du einen Button der gedrückt wird deaktivieren willst, würd ich das folgendermaßen machen:

Java:
JPanel p = new JPanel();
p.setLayout(new GridLayout(3,3));

// adding buttons to play
JButton[] b = new JButton[9];
for (int i=0; i<9;i++)
{
  b[i] = new JButton("");     
  b[i].addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    e.getSource().setEnabled(false);
    //Hier evtl noch weitere Code, z.B. Funktionsaufruf
   });
}
p.add(b[i]);
 
Hallo,

ich bräuchte eigentlich nur noch eine Rekursion für die KI. Könnte mir da jemand behilflich sein?
 

Neue Beiträge

Zurück