# Tic Tac Toe



## HABB23 (19. Jan 2010)

Hiho,
Ich arbeite grade an einem Tic Tac Toe spiel.
Ich bin noch ein ziemlicher anfänger und wollte mal fragen ob es irgendwie möglich ist alle Arrays mit einem bestimmten wert abzufragen ? es geht darum den Sieg zu bestimmen und ich wollte es eigentlich so machen das einfach alle arrays abgefragt werden in dem ein X oder O steht und wenn alle arrays in einer kooardinate also X oder Y übereinstimmen halt der spieler gewonnen hat. 


```
public class TICTACTOE
{
    private int x;
    private int y;
    private char spieler;
    private boolean sieg;
    private char[][] spielfeld = new char[3][3]; 
    private int zaehler;
    


    public TICTACTOE()
    {
        zaehler= 9;
        
    }

  
    public void Zug(int x, int y , char spieler)
    {    
        
        if(zaehler==0)
        {
            System.out.print("Unentschieden");
        }
        else
        {
            spielfeld[x][y]= spieler;
            zaehler=zaehler-1;
            


    }
    
}
}
```
ist was ich bisher habe. Ist bestimmt alles nicht ideal aber ich würde ganz gerne mein code so simpel behalten damit ich da auch noch durch steige ! Also ist meine idee überhaupt umsetztbar oder geht das garnicht so wie ich das gerne hätte? Achja ich habe natürlich auch schon dran gedacht immer alles mit IF IF IF IF IF abzufragen aber das kanns ja nicht sein oder ?


Danke und entschuldigung für meine vielen Rechtschreibfehler


----------



## Landei (19. Jan 2010)

Du brauchst zwei verschachtelte Schleifen für Zeilen und Spalten, und zwei einfache für die Diagonalen: 
(ungetestet)

```
boolean gewonnen = false;
boolean test = true;

//Spalten
for(int x = 0; x < 3; x++) {
  test = true;
  for(int y = 0; y < 3; y++) { 
    test &= (spielfeld[x][y] == spieler);
  }
  gewonnen |= test;
}
//Zeilen
for(int y = 0; y < 3; y++) {
  test = true;
  for(int x = 0; x < 3; x++) { 
    test &= (spielfeld[x][y] == spieler);
  }
  gewonnen |= test;
}
//Hauptdiagonale
test = true;
for(int d = 0; d < 3; d++) {
   test &= (spielfeld[d][d] == spieler);
}
gewonnen |= test;
//Nebendiagonale
test = true;
for(int d = 0; d < 3; d++) {
   test &= (spielfeld[d][2-d] == spieler);
}
gewonnen |= test;
if (gewonnen) {
   //tu was
}
```

Man kann das noch ein wenig zusammenfassen:

```
boolean gewonnen = false;
boolean test1 = true;
boolean test2 = true;

//Spalten und Zeilen
for(int x = 0; x < 3; x++) {
  test1 = true;
  test2 = true;
  for(int y = 0; y < 3; y++) { 
    test1 &= (spielfeld[x][y] == spieler);
    test2 &= (spielfeld[y][x] == spieler);
  }
  gewonnen |= test1 || test2;
}
//Diagonalen
test1 = true;
test2 = true;
for(int d = 0; d < 3; d++) {
   test1 &= (spielfeld[d][d] == spieler);
   test2 &= (spielfeld[d][2-d] == spieler);
}
gewonnen |= test1 || test2;
```


----------



## HABB23 (19. Jan 2010)

hey vielen dank für deine Antwort nur habe ich jetzt noch ein paar fragen wie gesagt bin nochn anfänger :x

was ist das |= ? und verstehe nicht ganz diese test varible


----------



## Landei (19. Jan 2010)

Statt a = a + b kann man a += b schreiben. Das geht mit den meisten Operatoren, und aus x = x || y wird dann x |= y und aus x = x && y wird x &= y.

Test bestimmt, ob eine bestimmte Zeile, Spalte u.s.w. komplett gefüllt ist, z.B. Ist [0][0] OK und [0][1] OK und [0][2] OK, dann ist das entsprechede test true. gewonnen fügt alle tests zusammen: Ist einer der Zeilentests true oder ist einer der Spaltentests true u.s.w., dann ist gewonnen true.


----------



## eRaaaa (19. Jan 2010)

Sun hatte ein TicTacToe als Applet-Demo mal veröffentlicht, das könnte man sich auch mal anschauen : http://java.sun.com/applets/jdk/1.4/demo/applets/TicTacToe/TicTacToe.java

So muss man nicht alle Kombinationen nach jedem Setzen testen, sondern einfach immer nur eine Stelle im Array abfragen [c]black |= 1 << move;[/c]


----------

