TicTacToe mit Array

Zitrus

Bekanntes Mitglied
Hi
Habe mir ein TicTacToe-Spiel programmier:

Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.URL;
import java.awt.Font;
import java.util.Random;

public class Spiel extends JFrame
{
    URL UFenster;
    ImageIcon IFenster;
    
    public Spiel()
    {
        super("TicTacToe");

        setSize(300,325);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        UFenster = getClass().getResource("TicTacToe.png");
        IFenster = new ImageIcon(UFenster);
        setIconImage(IFenster.getImage());

        MyPanel panel = new MyPanel();

        add(panel);

        setVisible(true);
    }

    class MyPanel extends JPanel implements ActionListener {
        JButton button1;
        JButton button2;
        JButton button3;
        JButton button4;
        JButton button5;
        JButton button6;
        JButton button7;
        JButton button8;
        JButton button9;

        JOptionPane gewonnen;

        String Spieler1;
        String Spieler2;
        String aktuellerSpieler;
        String show;

        public MyPanel() {
            setSize(300,325);
            setLayout(null);

            Spieler1 = "Spieler X";
            Spieler2 = "Spieler O";
            aktuellerSpieler = StartwertFuerAktuellenSpieler();

            button1 = new JButton();
            button1.setFont(new Font("Verdana",0,72));
            button1.addActionListener(this);   
            button1.setBounds(0,0,100,100);

            button2 = new JButton();
            button2.setFont(new Font("Verdana",0,72));
            button2.setBounds(100,0,100,100);
            button2.addActionListener(this);

            button3 = new JButton();
            button3.setFont(new Font("Verdana",0,72));
            button3.setBounds(200,0,100,100);
            button3.addActionListener(this);

            button4 = new JButton();
            button4.setFont(new Font("Verdana",0,72));
            button4.setBounds(0,100,100,100);
            button4.addActionListener(this);

            button5 = new JButton();
            button5.setFont(new Font("Verdana",0,72));
            button5.setBounds(100,100,100,100);
            button5.addActionListener(this);

            button6 = new JButton();
            button6.setFont(new Font("Verdana",0,72));
            button6.setBounds(200,100,100,100);
            button6.addActionListener(this);

            button7 = new JButton();
            button7.setFont(new Font("Verdana",0,72));
            button7.setBounds(0,200,100,100);
            button7.addActionListener(this);

            button8 = new JButton();
            button8.setFont(new Font("Verdana",0,72));
            button8.setBounds(100,200,100,100);
            button8.addActionListener(this);

            button9 = new JButton();
            button9.setFont(new Font("Verdana",0,72));
            button9.setBounds(200,200,100,100);
            button9.addActionListener(this);

            gewonnen = new JOptionPane();

            add(button1);
            add(button2);
            add(button3);
            add(button4);
            add(button5);
            add(button6);
            add(button7);
            add(button8);
            add(button9);
        }

        public void actionPerformed(ActionEvent e) {
            if(gewonnen() == false) {  
                if(e.getSource() == button1) {
                    if(button1.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button1.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button1.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button2) {
                    if(button2.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button2.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button2.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button3) {
                    if(button3.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button3.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button3.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button4) {
                    if(button4.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button4.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button4.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button5) {
                    if(button5.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button5.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button5.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button6) {
                    if(button6.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button6.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button6.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button7) {
                    if(button7.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button7.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button7.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button8) {
                    if(button8.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button8.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button8.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
                else if(e.getSource() == button9) {
                    if(button9.getText().equals("")) {
                        if(aktuellerSpieler.equals(Spieler1)) {
                            button9.setText("X");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                        else {
                            button9.setText("O");
                            druckeGewinner();
                            setzeNeuenSpieler();
                        }
                    }
                }
            }
            else {
                option();
            }
        }

        private void setzeNeuenSpieler() {
            if(aktuellerSpieler.equals(Spieler1)) {
                aktuellerSpieler = Spieler2;
            }
            else if(aktuellerSpieler.equals(Spieler2)) {
                aktuellerSpieler = Spieler1;
            }
        }

        private String StartwertFuerAktuellenSpieler() {
            Random r = new Random();
            int zufall = r.nextInt(2) + 1;

            String aktuell = "";

            if(zufall == 1) {
                aktuell = Spieler1;
            }
            else if(zufall == 2) {
                aktuell = Spieler2;
            }
            return aktuell;
        }

        private boolean gewonnen() {
            if(button1.getText().equals("X") && button2.getText().equals("X") && button3.getText().equals("X")|| 
            button4.getText().equals("X") && button5.getText().equals("X") && button6.getText().equals("X")||
            button7.getText().equals("X") && button8.getText().equals("X") && button9.getText().equals("X")||
                // Horizontale Abfragen "X"
            button1.getText().equals("X") && button4.getText().equals("X") && button7.getText().equals("X")||
            button2.getText().equals("X") && button5.getText().equals("X") && button8.getText().equals("X")||
            button3.getText().equals("X") && button6.getText().equals("X") && button9.getText().equals("X")||
                // Vertikale Abfragen "X"
            button1.getText().equals("X") && button5.getText().equals("X") && button9.getText().equals("X")|| 
            button7.getText().equals("X") && button5.getText().equals("X") && button3.getText().equals("X")||
                // Diagonale Abfragen "X"
            button1.getText().equals("O") && button2.getText().equals("O") && button3.getText().equals("O")|| 
            button4.getText().equals("O") && button5.getText().equals("O") && button6.getText().equals("O")||
            button7.getText().equals("O") && button8.getText().equals("O") && button9.getText().equals("O")||
                // Horizontale Abfragen "O"
            button1.getText().equals("O") && button4.getText().equals("O") && button7.getText().equals("O")||
            button2.getText().equals("O") && button5.getText().equals("O") && button8.getText().equals("O")||
            button3.getText().equals("O") && button6.getText().equals("O") && button9.getText().equals("O")||
                // Vertikale Abfragen  "O"
            button1.getText().equals("O") && button5.getText().equals("O") && button9.getText().equals("O")|| 
            button7.getText().equals("O") && button5.getText().equals("O") && button3.getText().equals("O")
                // Diagonale Abfragen  "O"
            )            
            {
                return true;
            }
            else {
                return false;
            }
        }

        private boolean unentschieden() {
            if(!button1.getText().equals("") &&  !button2.getText().equals("") &&
            !button3.getText().equals("") && !button4.getText().equals("") &&
            !button5.getText().equals("") && !button6.getText().equals("") &&
            !button7.getText().equals("") && !button8.getText().equals("") &&
            !button9.getText().equals("")
            ) 
            {
                return true;
            }
            else {
                return false;
            }
        }

        private void druckeGewinner() {
            if(unentschieden() == true && gewonnen() == false) {
                show = "Unentschieden!";
                option();      
            }

            if(gewonnen() == true) {
                show = aktuellerSpieler + " hat gewonnen!";
                option();
            }
        }

        private void option() {
            if(gewonnen() || unentschieden()) {
                int eingabe = JOptionPane.showConfirmDialog(null, 
                        "Möchtest du nochmal spielen?",
                        show,
                        JOptionPane.YES_NO_CANCEL_OPTION,
                        JOptionPane.PLAIN_MESSAGE);
                if(eingabe == 0) {
                    button1.setText("");
                    button2.setText("");
                    button3.setText("");
                    button4.setText("");
                    button5.setText("");
                    button6.setText("");
                    button7.setText("");
                    button8.setText("");
                    button9.setText("");                  
                }
                else if(eingabe == 1) {
                    System.exit(0);
                }
                else if(eingabe == 2) {
                }
            }
        }
    }
}

Ich finde jedoch, dass man (vorallem die gewonnen()-Methode) auch leichter schreiben könnte undzwar mit Arrays. Jedoch kommt mir einfach nicht in den Sinn wie ich das anstellen soll^^
Hab mir Arrays bestimmt noch zehn mal durchgelesen aber wie ich die einzelnen Abfragen verkürzen soll weiß ich nicht ^-^

Mfg, Zitrus
 

JeromeC

Aktives Mitglied
Tutorial / Java Grundlagen / Schleifen

Du packst die Buttons in ein JButtonArray...

[Java]JButton[] buttonArray = new JButton[9];
for(int i=0; i < buttonArray.length; i++) {
buttonArray = new JButton();
buttonArray.setFont(new Font("Verdana",0,72));
buttonArray.addActionListener(this);
buttonArray.setBounds(0,0,100,100);
}[/Java]

und liest es aus, wann du magst...

Java:
public void actionPerformed(ActionEvent e) {
            if(gewonnen() == false) { 
                for(JButton button : buttonArray) {
                   if(e.getSource() == button) {
                                //do smth
                   }
                }
            }
}

Die gewonnen-Methode musst du jetzt auf dieser Grundlage selber bauen :)
 
Zuletzt bearbeitet:

Zitrus

Bekanntes Mitglied
Vielen Dank! Werde es gleich ausprobieren :) Mein Problem war, dass ich den : Operator eigentlich nur in ? : kannte und mich deshalb gefragt habe wieso man den hier ohne das Fragezeichen benutzen kann.
Wenn ich richtig verstanden habe ist das eine for-each Schleife die sagt:
Java:
for (each JButton button in buttonArray) {
    //do smth
}

Oder?
 
Zuletzt bearbeitet:

JeromeC

Aktives Mitglied
For-Each Schleifen funktionieren ganz ähnlich wie die gewöhnlichen For-Schleifen und sind quasi eine Weiterentwicklung. Im Gegensatz zu den normalen, verwenden ForEach Schleifen aber keine nach außen sichtbare Laufvariable oder Iterator-Objekt, sondern gibt in jeder Iteration immer direkt den Wert zurück. Das heißt aber auch, dass immer über eine entsprechende Datenstruktur iteriert werden muss die das ermöglicht.

Falls dich die ForEach-Schleife stört, kannst du sie auch als normale For-Schleife schreiben:

Java:
public void actionPerformed(ActionEvent e) {
            if(gewonnen() == false) { 
                for(int i = 0; i < buttonArray.length; i++) {
                   if(e.getSource() == buttonArray[i]) {
                                //do smth
                   }
                }
            }
}

Bzw. hättest du den ersten Code-Block auch bereits als ForEach-Schleife schreiben können.
 

Zitrus

Bekanntes Mitglied
Zwei Fragen:
1. Wieso muss ich
Java:
buttonArray = new JButton[9];
das hier machen? Ich dachte bei Arrays fängt man ab [0] an was ja bedeuten würde, dass ich bei [8] schon 9 Buttons hätte.

2. Habe ich wirklich keine gute Idee wie ich das mit der gewonnen Methode anstellen soll.. Vielleicht so?
Java:
JButton wincombo[][] = {{buttonArray[0],buttonArray[1],buttonArray[2]},{buttonArray[3],buttonArray[4],buttonArray[5]},{usw.},
                    {usw.},{usw.},{usw.},
                    {usw.},{usw.}};

//Dann abfragen
 

JeromeC

Aktives Mitglied
Zwei Fragen:
1. Wieso muss ich
Java:
buttonArray = new JButton[9];
das hier machen? Ich dachte bei Arrays fängt man ab [0] an was ja bedeuten würde, dass ich bei [8] schon 9 Buttons hätte.

Wenn du 9 Buttons hast, machst du [9], wenn du 10 Buttons hast machst du [10]. Für 9 Buttons hättest du die Indizes 0,1,2....,7,8.

Bei 2.: Dein Problem ist, dass du ein 1-Dimensionales Array hast und dir aber in deinem Kopf ein 2D-Array vorstelltst.
Entweder ordnest du deine Button gleich in ein 2D-Array an:
Java:
JButton buttonArray[][] = new JButton[3][3][code=Java]
oder du denkst dir einen Mechanismus aus, das 1-Dimensionale Array auf ein 2D-Array zu mappen. Ich würde dir aber die erste Lösung vorschlagen.
 

Zitrus

Bekanntes Mitglied
Ich finde deine Methode mit dem 2D-Array gut, jedoch
Java:
JButton wincombo[][] = {{buttonArray[0],buttonArray[1],buttonArray[2]},{buttonArray[3],buttonArray[4],buttonArray[5]},{usw.},
                    {usw.},{usw.},{usw.},
                    {usw.},{usw.}};

ist das was ich dann schreiben muss nicht unbedingt weniger Schreibarbeit als vorher. Es muss doch einen leichteren Weg geben, oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
TicTacToe Java Basics - Anfänger-Themen 6
C TicTacToe Java Basics - Anfänger-Themen 2
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
A Überprüfung in TicTacToe Java Basics - Anfänger-Themen 5
A TicTacToe Java Basics - Anfänger-Themen 8
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J TicTacToe Java Basics - Anfänger-Themen 2
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
shiroX Input/Output TicTacToe-Savegame Java Basics - Anfänger-Themen 1
shiroX Methoden Mögliche Spielstände bei TicTacToe Java Basics - Anfänger-Themen 14
P TicTacToe Problem mit Win Methode Java Basics - Anfänger-Themen 4
T TicTacToe Spielfeld Java Basics - Anfänger-Themen 7
B TicTacToe Java Basics - Anfänger-Themen 2
S TicTacToe Java Basics - Anfänger-Themen 4
I TicTacToe blöde KI Java Basics - Anfänger-Themen 2
I Fehler bei TicTacToe Java Basics - Anfänger-Themen 108
G TicTacToe KI Java Basics - Anfänger-Themen 15
C Problem TicTacToe Java Basics - Anfänger-Themen 6
P 3D TicTacToe - Unentschieden Java Basics - Anfänger-Themen 5
G Tictactoe Java Basics - Anfänger-Themen 9
B TicTacToe Programmieren Java Basics - Anfänger-Themen 2
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
cizzo TicTacToe Java Basics - Anfänger-Themen 6
W TicTacToe - Porblem mit dem Code.. Java Basics - Anfänger-Themen 5
H Hilfe bei TicTacToe mit jEdit Java Basics - Anfänger-Themen 7
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
N brauche hilfe zu tictactoe Java Basics - Anfänger-Themen 2
kulturfenster Problem bei TicTacToe Java Basics - Anfänger-Themen 11
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
H TicTacToe: Zeit zwischen Zügen lassen Java Basics - Anfänger-Themen 9
M TicTacToe Java Basics - Anfänger-Themen 7
H TicTacToe-geeignete Klassenhierarchie Java Basics - Anfänger-Themen 3
G Hilfe bei TicTacToe Java Basics - Anfänger-Themen 2
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen


Oben