# [JAVA] TicTacToe Spiel mit Schleife machen



## Wincenty (23. Dezember 2012)

Hallo,
ich muss das TicTacToe Spiel was wir vom Prof bekamen, mit einer Schleife ausstatten.

Ich habe bereits das Soweit gemacht das das Programm mit Abbrechen sich schließt und mit OK sollte das Programm eine neue Partie machen, nur weiß ich nicht so recht wo ich die Schleife einbauen muss


```
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;

    public class TicTacToe implements ActionListener {
        final int SEITE=3;
        private JFrame fenster = new JFrame("Tic-Tac-Toe");
        JButton[] button = new JButton[SEITE*SEITE];
        private String buchstabe = "";
        private int zaehler = 0;
        private boolean gewonn = false;
        JButton j = new JButton("Nei Speel");
        JButton n = new JButton("Offhaalen");
    

    public TicTacToe(){
        //Fenster kreeieren
        fenster.setSize(350,350);
        fenster.setLayout(new GridLayout(SEITE,SEITE));
        fenster.setVisible(true);
            fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Font font = new Font("Courier New",Font.BOLD,80);
            for(int i=0;i<SEITE*SEITE;i++){
                button[i] = new JButton("");
                fenster.add(button[i]);
                if (i%2==0) {button[i].setBackground(Color.green);}
                else {button[i].setBackground(Color.red);}
            button[i].setFont(font);
            button[i].addActionListener(this);
            }
           }
    public void actionPerformed(ActionEvent eingabe) {
        zaehler++;
        if(zaehler %2==1) {buchstabe = "X";}
        else {buchstabe = "O";}
        JButton gewielteButton = (JButton)eingabe.getSource();
            gewielteButton.setText(buchstabe);
            gewielteButton.setEnabled(false);
            
            for(int i=0;i<SEITE;i++) {
                if(button[SEITE*i].getText() == buchstabe && button[SEITE*i+1].getText() == buchstabe && button[SEITE*i+2].getText() == buchstabe) gewonn = true;
                if(button[i].getText() == buchstabe && button[i+SEITE].getText() == buchstabe && button[i+SEITE+SEITE].getText() == buchstabe) gewonn = true;
            }
            if(button[0].getText() == buchstabe && button[4].getText() == buchstabe && button[8].getText() == buchstabe) gewonn = true;
            if(button[6].getText() == buchstabe && button[4].getText() == buchstabe && button[2].getText() == buchstabe) gewonn = true;
            
            if(gewonn == true){
                int endeingabe = JOptionPane.showConfirmDialog(null,"Gewonn!" + "\nWolld er noch eng keier spellen?","Nei Spiel", JOptionPane.OK_CANCEL_OPTION);
                if (endeingabe != 0) {System.exit(0);}
            } else if(zaehler == SEITE*SEITE && gewonn == false){
                int endeingabe = JOptionPane.showConfirmDialog(null,"Onentscheed!" + "\nWolld er noch eng keier spellen?","Nei Spiel", JOptionPane.OK_CANCEL_OPTION);
                if (endeingabe != 0) {System.exit(0);}
            }
            
        }
        
        public static void main(String[] args){
            new TicTacToe();
        }
}
```

Falls sowas bei euch kommen sollte: 
Die Dialoge sind aus Luxemburgisch, wenn es euch Probleme machen sollte kann ich es gern übersetzen.


----------



## DarkMo (23. Dezember 2012)

wad soll die schleife denn bewirken? btw: nich umsonst macht man kommentare auf englisch


----------



## Wincenty (23. Dezember 2012)

Wenn man die Parte mit allen Feldern ausgefüllt hat und es unentschieden ist, oder wenn man gewinnt kommt ein Fenster mit der Benachrichtigung wie das Spiel ausgegangen ist und es wird gefragt ob man ein neues Spiel starten will.
Mit OK soll das Spiel neu Starten, mit Abbrechen soll das Programm beenden was ich schon mit einem Break geschafft hab.

Ich habe versuchte das einam so zu machen: 
	
	



```
public static void main(String[] args){ do {
            new TicTacToe();
    } while (true);
}
```
aber dann startet eine partie nach der anderen und keines wird beendet -> Also falsch
und wenn ich das so mache: 
	
	



```
public void actionPerformed(ActionEvent eingabe) { do {
        zaehler++;
        if(zaehler %2==1) {buchstabe = "X";}
        else {buchstabe = "O";}
        JButton gewielteButton = (JButton)eingabe.getSource();
            gewielteButton.setText(buchstabe);
            gewielteButton.setEnabled(false);
            
            for(int i=0;i<SEITE;i++) {
                if(button[SEITE*i].getText() == buchstabe && button[SEITE*i+1].getText() == buchstabe && button[SEITE*i+2].getText() == buchstabe) gewonn = true;
                if(button[i].getText() == buchstabe && button[i+SEITE].getText() == buchstabe && button[i+SEITE+SEITE].getText() == buchstabe) gewonn = true;
            }
            if(button[0].getText() == buchstabe && button[4].getText() == buchstabe && button[8].getText() == buchstabe) gewonn = true;
            if(button[6].getText() == buchstabe && button[4].getText() == buchstabe && button[2].getText() == buchstabe) gewonn = true;
            
            if(gewonn == true){
                int endeingabe = JOptionPane.showConfirmDialog(null,"Gewonn!" + "\nWolld er noch eng keier spellen?","Nei Spiel", JOptionPane.OK_CANCEL_OPTION);
                if (endeingabe != 0) {System.exit(0);}
            } else if(zaehler == SEITE*SEITE && gewonn == false){
                int endeingabe = JOptionPane.showConfirmDialog(null,"Onentscheed!" + "\nWolld er noch eng keier spellen?","Nei Spiel", JOptionPane.OK_CANCEL_OPTION);
                if (endeingabe != 0) {System.exit(0);}
            }
            
    }

        public static void main(String[] args){
            new TicTacToe();
    
} while (true);}
}
```
dann aber nach der ersten Eingabe wird direkt unentschieden angegeben, was ja nicht sein soll man will ja spielen

Also wenn man abbrechen drückt beendet das Programm, das habe ich schon, aber wenn ich ok drücke soll entweder das ganze geschlossen und ein neues spiel starten oder die felder geleert werden, mir egal wie hauptsache jemand kann mir seine Vorgehensweise erklären, dass ich das dann auch selber später machen kann.


----------



## DarkMo (23. Dezember 2012)

aha, es soll also das "programm global" umfasen ma blöde gesagt. mehr wollt ich ja ned wissen ^^

while(true) is schonmal ein ansatz. das is halt ne endlosschleife. du musst dann am ende quasi die frage stellen und die antwort auswerten. if(antwort = abbruch) break; <- pseude code freilich, aber so wäre das grundprinzip davon. abgewandelt könnte mans natürlich auch so machen:

```
bool go = true;
while(go) {
  tictactoe();
  abfrage();
  if(abbruch) go = false;
}
```


----------



## Wincenty (23. Dezember 2012)

Ich habe das jetzt so gemacht:

```
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;

    public class TicTacToe implements ActionListener {
        final int SEITE=3;
        private JFrame fenster = new JFrame("Tic-Tac-Toe");
        JButton[] button = new JButton[SEITE*SEITE];
        private String buchstabe = "";
        private int zaehler = 0;
        private boolean gewonn = false;
        JButton j = new JButton("Nei Speel");
        JButton n = new JButton("Offhaalen");
        [B]boolean go = true;[/B]
        

    public TicTacToe(){
        //Fenster kreeieren
        fenster.setSize(350,350);
        fenster.setLayout(new GridLayout(SEITE,SEITE));
        fenster.setVisible(true);
            fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Font font = new Font("Courier New",Font.BOLD,80);
            for(int i=0;i<SEITE*SEITE;i++){
                button[i] = new JButton("");
                fenster.add(button[i]);
                if (i%2==0) {button[i].setBackground(Color.green);}
                else {button[i].setBackground(Color.red);}
            button[i].setFont(font);
            button[i].addActionListener(this);
            }
           }
    public void actionPerformed(ActionEvent eingabe) {
        zaehler++;
        if(zaehler %2==1) {buchstabe = "X";}
        else {buchstabe = "O";}
        JButton gewielteButton = (JButton)eingabe.getSource();
            gewielteButton.setText(buchstabe);
            gewielteButton.setEnabled(false);
            
            for(int i=0;i<SEITE;i++) {
                if(button[SEITE*i].getText() == buchstabe && button[SEITE*i+1].getText() == buchstabe && button[SEITE*i+2].getText() == buchstabe) gewonn = true;
                if(button[i].getText() == buchstabe && button[i+SEITE].getText() == buchstabe && button[i+SEITE+SEITE].getText() == buchstabe) gewonn = true;
            }
            if(button[0].getText() == buchstabe && button[4].getText() == buchstabe && button[8].getText() == buchstabe) gewonn = true;
            if(button[6].getText() == buchstabe && button[4].getText() == buchstabe && button[2].getText() == buchstabe) gewonn = true;
            
            if(gewonn == true){
                int endeingabe = JOptionPane.showConfirmDialog(null,"Gewonn!" + "\nWolld er noch eng keier spellen?","Nei Spiel", JOptionPane.OK_CANCEL_OPTION);
                if (endeingabe != 0) {[B]go = false;[/B]}
            } else if(zaehler == SEITE*SEITE && gewonn == false){
                int endeingabe = JOptionPane.showConfirmDialog(null,"Onentscheed!" + "\nWolld er noch eng keier spellen?","Nei Spiel", JOptionPane.OK_CANCEL_OPTION);
                if (endeingabe != 0) {[B]go = false;[/B]}
            }
            
    }

        public static void main(String[] args){
           [B] while ([COLOR=red]go) {[/B]
            new TicTacToe();
    }}
}
```
Aber bei mir wird das go als Fehler gemeldet und als Verbesserungsversuch macht er aus bool eine static bool und das programm startet mir endlos viele neue Spiele


----------



## sepei (24. Dezember 2012)

Warum machst du die Main nicht einfach so:

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

Und die Buttonauswertung so:

```
if (endeingabe == 0)new TicTacToe();
fenster.dispose();
```


----------



## DarkMo (24. Dezember 2012)

ich erwähnte bereits, das das auf die schnelle pseudocode war. wie du das nu genau in java umsetzen musst, musste halt ma schauen ^^ ich hab grad keinen blassen, wie das bei java war


----------

