# Einfaches TicTacToe Programm



## Morris (23. Feb 2011)

Ich bin gerade dabei ein sehr einfaches TicTacToe Spiel zu programmieren und wenn ich eine Eingabe mache, dann ändert er das Feld nicht, obwohl ich ihm sage, dass er dem Feld einen neuen Wert zuweist. Eine Abbruchbedingung habe ich auch nicht und es wäre cool wenn mir jemand eine einfache Lösung dafür verraten würde. Hier ist der Code:



```
import java.io.*;

public class TicTacToe {
    public static void main(String[] args){
        int limit=2;
        int Feld [] []= new int [limit+1][limit+1];
        int spielerzaehler=0;
        int i1=0;
        int i2=0;
        
        while(spielerzaehler<=8){
            if(spielerzaehler%2==0){
                System.out.println("Spieler 1 setze ein X :");
                try { 
                    BufferedReader in =new BufferedReader( new InputStreamReader( System.in ) );
                    String s1 = in.readLine();
                    i1 = Integer.parseInt( s1 );
                    System.out.println( "Der eingelesene Text lautet: " + s1 ); }
                catch( IOException ex ) { System.out.println( ex.getMessage() );  }
            }
            if(spielerzaehler%2==1){
                System.out.println("Spieler 2 setze ein O :");
                try {
                    BufferedReader in =new BufferedReader( new InputStreamReader( System.in ) );
                    String s2 = in.readLine();
                    i2 = Integer.parseInt( s2 );
                    System.out.println( "Der eingelesene Text lautet: " + s2 ); }
                catch( IOException ex ) { System.out.println( ex.getMessage() );  }
            }
            if(i1==0){
                Feld[0][0]=1;
            }
            if(i1==1){
                Feld[0][1]=1;
            }
            if(i1==2){
                Feld[0][2]=1;
            }
            if(i1==3){
                Feld[1][0]=1;
            }
            if(i1==4){
                Feld[1][1]=1;
            }
            if(i1==5){
                Feld[1][2]=1;
            }
            if(i1==6){
                Feld[2][0]=1;
            }
            if(i1==7){
                Feld[2][1]=1;
            }
            if(i1==8){
                Feld[2][2]=1;
            }
            if(i2==0){
                Feld[0][0]=2;
            }
            if(i2==1){
                Feld[0][1]=2;
            }
            if(i2==2){
                Feld[0][2]=2;
            }
            if(i2==3){
                Feld[1][0]=2;
            }
            if(i2==4){
                Feld[1][1]=2;
            }
            if(i2==5){
                Feld[1][2]=2;
            }
            if(i2==6){
                Feld[2][0]=2;
            }
            if(i2==7){
                Feld[2][1]=2;
            }
            if(i2==8){
                Feld[2][2]=2;
            }
            spielerzaehler++;
            for (int zeile=0; zeile<=limit; zeile++){
                for (int spalte=0; spalte<=limit; spalte++){
                    Feld [zeile][spalte]=0;
                    if(Feld[zeile][spalte]==0)
                    {
                        System.out.print("-");
                    }
                    if(Feld[zeile][spalte]==1)
                    {
                        System.out.print("X");
                    }
                    if(Feld[zeile][spalte]==2)
                    {
                        System.out.print("O");
                    }
                }
                System.out.println("");
            }
        }
    }
}
```


----------



## xerberuz (23. Feb 2011)

Der Inhalt der Arrays verändert sich. Du überschreibst das allerdings jedesmal wieder:

Die Zeile ist das Problem: Feld[zeile][spalte] = 0; in der inneren for Schleife.


----------



## Morris (23. Feb 2011)

Klar danke. Ich weiß, dass das Programm ziemlich schlecht ist, das ist aber auch erst mein erstes Jahr Informatik und wir fangen auch gerade erst an mit mehrdimensionalen Arrays.


----------



## xerberuz (23. Feb 2011)

Noch ein Tip: Von der Konsole lesen ist mit der Klasse Console (Java Platform SE 6) viel angenehmer.


----------



## Morris (23. Feb 2011)

So und wenn mir jetzt noch jemand eine Lösung für den "Sieg" eines Spielers, also den Abbruch der while-Schleife sagen und auch erklären könnte wäre das perfekt^^


----------



## Blindxantos (23. Feb 2011)

ich hab das früher auch irgent wann mal programmiert, und bei der Siegbedingung einfach die Felder (also die Arraywerte) auf gleichheit überprüft.

also wenn das Feld links oben, links mitte, links unten den gleichen wert haben, dann win
oder wenn feld mitte oben, mitte mitte, mitte unten, dann win
usw.

wahrscheinlich nicht die beste lösung, aber was solls :rtfm:


----------



## Simon_Flagg (23. Feb 2011)

für siegkontrolle würd ich sagen:
1 For-Schleife (3x durchlaufen), die erste/zweite/dritte Zeile/Spalte kontrolliert und dann zwei if für die zwei schrägen

lg


----------



## Morris (23. Feb 2011)

Das Versteh ich gerade nicht ganz tut mir Leid ^^


----------



## Blindxantos (23. Feb 2011)

Du hast glück, ich hatte mein altes Tic-Tac-Toe noch. Wie du siehst, ist das weder Java (sonder ruby) noch ein zweidimmensionaler Array, aber den Sinn dahinter kann man verstehen.

p.s.: stelle dir das Feld folgendermaßen vor:

1|2|3
-+-+-
4|5|6
-+-+-
7|8|9


```
def siegcheck(zielarray, siegzaehler)
  if (zielarray[1] == zielarray[2] && zielarray[2] == zielarray[3] ) ||
      (zielarray[4] == zielarray[5] && zielarray[5] == zielarray[6] ) ||
      (zielarray[7] == zielarray[8] && zielarray[8] == zielarray[9] ) ||
      (zielarray[1] == zielarray[4] && zielarray[4] == zielarray[7] ) ||
      (zielarray[2] == zielarray[5] && zielarray[5] == zielarray[8] ) ||
      (zielarray[3] == zielarray[6] && zielarray[6] == zielarray[9] ) ||
      (zielarray[3] == zielarray[5] && zielarray[5] == zielarray[7] ) ||
      (zielarray[1] == zielarray[5] && zielarray[5] == zielarray[9] )
    siegzaehler += 1
  end
  return siegzaehler
end
```

um dich nicht zu verwirren, dieser siegzähler müsste eigentlich ein boolean sein, kein zähler


----------



## Morris (26. Feb 2011)

Mei fertiges Programm lautet wie folgt:


```
//Feld = Num-Block   also:
//---   789
//---   456
//---   123

import java.io.*;

public class TicTacToe {
    public static void main(String[] args){
        int limit=2;
        int Feld [] []= new int [limit+1][limit+1];
        int spielerzaehler=0;
        int i1=0;
        int i2=0;

        while(spielerzaehler<=8){
            if(spielerzaehler%2==0){
                System.out.println("Spieler 1 setze ein X :");
                try { 
                    BufferedReader in =new BufferedReader( new InputStreamReader( System.in ) );
                    String s1 = in.readLine();
                    i1 = Integer.parseInt( s1 );}
                catch( IOException ex ) { System.out.println( ex.getMessage() );  }
            }
            if(spielerzaehler%2==1){
                System.out.println("Spieler 2 setze ein O :");
                try {
                    BufferedReader in =new BufferedReader( new InputStreamReader( System.in ) );
                    String s2 = in.readLine();
                    i2 = Integer.parseInt( s2 );}
                catch( IOException ex ) { System.out.println( ex.getMessage() );  }
            }
            if(i1==7){
                Feld[0][0]=1;
            }
            if(i1==8){
                Feld[0][1]=1;
            }
            if(i1==9){
                Feld[0][2]=1;
            }
            if(i1==4){
                Feld[1][0]=1;
            }
            if(i1==5){
                Feld[1][1]=1;
            }
            if(i1==6){
                Feld[1][2]=1;
            }
            if(i1==1){
                Feld[2][0]=1;
            }
            if(i1==2){
                Feld[2][1]=1;
            }
            if(i1==3){
                Feld[2][2]=1;
            }
            if(i2==7){
                Feld[0][0]=2;
            }
            if(i2==8){
                Feld[0][1]=2;
            }
            if(i2==9){
                Feld[0][2]=2;
            }
            if(i2==4){
                Feld[1][0]=2;
            }
            if(i2==5){
                Feld[1][1]=2;
            }
            if(i2==6){
                Feld[1][2]=2;
            }
            if(i2==1){
                Feld[2][0]=2;
            }
            if(i2==2){
                Feld[2][1]=2;
            }
            if(i2==3){
                Feld[2][2]=2;
            }
            spielerzaehler++;
            for (int zeile=0; zeile<=limit; zeile++){
                for (int spalte=0; spalte<=limit; spalte++){
                    if(Feld[zeile][spalte]==0)
                    {
                        System.out.print("-");
                    }
                    if(Feld[zeile][spalte]==1)
                    {
                        System.out.print("X");
                    }
                    if(Feld[zeile][spalte]==2)
                    {
                        System.out.print("O");
                    }
                }
                System.out.println("");
            }
            if(Feld [0][0]==1 && Feld [0][1]==1 && Feld [0][2]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [1][0]==1 && Feld [1][1]==1 && Feld [1][2]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [2][0]==1 && Feld [2][1]==1 && Feld [2][2]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][0]==1 && Feld [1][0]==1 && Feld [2][0]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][1]==1 && Feld [1][1]==1 && Feld [2][1]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][2]==1 && Feld [1][2]==1 && Feld [2][2]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][0]==1 && Feld [1][1]==1 && Feld [2][2]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][2]==1 && Feld [1][1]==1 && Feld [2][0]==1){
                System.out.println("SPIELER 1 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][0]==2 && Feld [0][1]==2 && Feld [0][2]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [1][0]==2 && Feld [1][1]==2 && Feld [1][2]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [2][0]==2 && Feld [2][1]==2 && Feld [2][2]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][0]==2 && Feld [1][0]==2 && Feld [2][0]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][1]==2 && Feld [1][1]==2 && Feld [2][1]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][2]==2 && Feld [1][2]==2 && Feld [2][2]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][0]==2 && Feld [1][1]==2 && Feld [2][2]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
            if(Feld [0][2]==2 && Feld [1][1]==2 && Feld [2][0]==2){
                System.out.println("SPIELER 2 SIEGT!!!");
                spielerzaehler=10;
            }
        }
        if(spielerzaehler==9){
        System.out.println("UNENTSCHIEDEN!!!");
        }
    }
}
```


----------



## Simon_Flagg (27. Feb 2011)

meineserachtens gehts kürzer und auch schöner (sry wenn ich vorher unverständlich war):

ist jetzt leider delphi-code --> ersetze spielfeld[1,i] durch spielfeld[1]_
for i:=1 to 3 do --> for (int i=1; i<=3;i++)
begin end --> {}
checkIfWon = hat jemand gewonnen
exit = return;



		Code:In die Zwischenablage kopieren


for i :=1 to 3 do begin
    if (spielFeld[1,i] = spielFeld[2,i]) and (spielFeld[1,i] > 0) and (spielFeld[1,i] = spielFeld[3,i]) then begin
      showMessage('Gewonnen hat Spieler: ' + intToStr(spielFeld[1,i]));
      checkIfWon := true;
      exit;
    end;
    if (spielFeld[i,1] = spielFeld[i,2]) and (spielFeld[i,1] > 0) and (spielFeld[i,1] = spielFeld[i,3]) then begin
      showMessage('Gewonnen hat Spieler: ' + intToStr(spielFeld[i,1]));
      checkIfWon := true;
      exit;
    end;
  end;
  if (spielFeld[1,1] = spielFeld[2,2]) and (spielFeld[1,1] > 0) and (spielFeld[1,1] = spielFeld[3,3]) then begin
    showMessage('Gewonnen hat Spieler: ' + intToStr(spielFeld[1,1]));
    checkIfWon := true;
    exit;
  end;
  if (spielFeld[3,1] = spielFeld[2,2]) and (spielFeld[3,1] > 0) and (spielFeld[1,3] = spielFeld[2,2]) then begin
    showMessage('Gewonnen hat Spieler: ' + intToStr(spielFeld[1,3]));
    checkIfWon := true;
    exit;
  end;


lg_


----------



## Blindxantos (27. Feb 2011)

Hi.
Ja natürlich geht das mit der for-schleife kürzer, ich wollte auch nicht das er das einfach so "abtippt" bzw sogar noch umständlicher macht (zu viele ifabfragen), ich wollte nur das er versteht wie man den sieger rausfindet.

Ich schrieb das damals als anfänger, und ich glaube der Threadstarter ist auch noch recht frisch. Die momentane Lösung ist zwar nicht sehr elegant, aber besser als garkeine


----------



## Simon_Flagg (27. Feb 2011)

das elegantere würd mich auch interessieren....

lg


----------



## Volvagia (27. Feb 2011)

Ich würde das ganze ganz anderst machen, und zwar per rekursive Methode.
Ist jetzt auch nicht unbedingt schön, aber finde es besser als so viele if-Abfragen. Ich habe schon öfters gehört, dass zu viele ifs immer auf einen Design-Fehler hindeuten.  Aber wer weiß schon, was zu viele sind.
Testet der Einfachheit halber das ganze Feld, ist nur Psydocode und ist nicht von dem Programmcode oben abgebildet. Ich denke aber, dass das nach kurzer Überarbeitung auch brauchbar wäre.


```
private byte HORENTIONAL = 0;
private byte VERTIKAL = 1;
private byte DIAGIONAL_RECHTS_RUNTER = 2;
private byte DIAGIONAL_LINKS_RUNTER = 3;

public boolean start(Feld[] felder, byte spieler)
{
	boolean gewonnen = false;
	
	gewonnen = start(0, 0, felder, spieler, HORENTIONAL);
	gewonnen = (!gewonnen ? start(0, 0, felder, spieler, VERTIKAL, 0) : gewonnen);
	gewonnen = (!gewonnen ? start(0, 0, felder, spieler, DIAGIONAL_RECHTS_RUNTER, 0) : gewonnen);
	gewonnen = (!gewonnen ? start(1, 0, felder, spieler, VERTIKAL, 0) : gewonnen);
	gewonnen = (!gewonnen ? start(2, 0, felder, spieler, VERTIKAL, 0) : gewonnen);
	gewonnen = (!gewonnen ? start(2, 0, felder, spieler, DIAGIONAL_LINKS_RUNTER, 0) : gewonnen);
	gewonnen = (!gewonnen ? start(0, 1, felder, spieler, HORENTIONAL, 0) : gewonnen);
	gewonnen = (!gewonnen ? start(0, 2, felder, spieler, HORENTIONAL, 0) : gewonnen);

	return(gewonnen);
}
public void start(byte x, byte y, Feld[] felder, byte spieler, byte richtung, byte zähler)
{
	boolean gewonnen = false;
	
	if(!istImFeld(x, y))
		return(false);

	Feld feld = felder[x][y];
	if(spieler != feld.gesetzterSpieler())
		return(false);	

	zähler++;
	if(zähler == 3)
		return(true);

	if(richtung == HORENTIONAL)
		gewonnen = start(x + 1, y, felder, spieler, richtung, zähler);
	else if(richtung == VERTIKAL)
		gewonnen = start(x, y + 1, felder, spieler, richtung, zähler);
	else if(richtung == DIAGIONAL_RECHTS_RUNTER)
		gewonnen = start(x + 1, y + 1, felder, spieler, richtung, zähler);
	else if(richtung == DIAGIONAL_LINKS_RUNTER)
		gewonnen = start(x - 1, y + 1, felder, spieler, richtung, zähler);
	return(gewonnen);
}
public void istImFeld(byte x, byte y)
{
	return(istImFeld(x) && istImFeld(y));
}
public void istImFeld(byte b)
{
	return(b >= 0 && b < 3);
}
```

Die Byte-Casts habe ich der Übersichtlichkeit wegen weggelassen. Hoffe, ich hab jetzt nicht zu viele Fehler gemacht.


----------



## Blindxantos (27. Feb 2011)

```
private void siegPrüfung() {
	boolean sieg = siegBedingung(1);
	if (sieg == true) {
		System.out.println("Spieler 1 hat gewonnen!");
	}
	else {
		sieg = siegBedingung(2);
		if (sieg == true) {
			System.out.println("Spieler 2 hat gewonnen!");
		}
	}
	if (spielerzaehler == 8 && sieg == false) { // evtl ist die 8 hier nicht
												// richtig, das kommt drauf
												// an ob du erst
												// spielerzähler++; machst
												// oder erst siegPrüfung()
												// aufrufst
		System.out.println("Unentschieden!");
	}
}

private boolean siegBedingung(int spieler) {
	for (int i = 0; i < 3; i++) {
		if (Feld[0][i] == spieler && Feld[1][i] == spieler
				&& Feld[2][i] == spieler) {
			return true;
			//Spalten
		}
	}
	for (int j = 0; j < 3; j++) {
		if (Feld[j][0] == spieler && Feld[j][1] == spieler
				&& Feld[j][2] == spieler) {
			return true;
			//Zeilen
		}
	}
	if ((Feld[0][0] == spieler && Feld[1][1] == spieler && Feld[2][2] == spieler)
			|| (Feld[0][2] == spieler && Feld[1][1] == spieler && Feld[2][0] == spieler)) {
		return true;
		//Diagonale
	}
	return false;
}
```

ich hoffe das funktioniert so, hab mir grad echt schwer getan das zu codieren, mein hirn ist heute nich so fit :gaen:


----------



## Simon_Flagg (27. Feb 2011)

wenn wir jetzt von der eleganz absehen, dann ist wahrscheinlich immer noch die mit den vielen ifs die imho die, die man am schnellsten versteht, und wahrscheinlich auch die performanteste, oder?

lg


----------



## Blindxantos (27. Feb 2011)

nicht die eleganzeste lösung, aber am leichtesten nachvollziehbar. ich hätte das allerdings wie in meinem früheren Beitrag in eine einzige bedingung gepackt, dann hätte man sich acht mal den true-fall (das sysout und variable setzen) gespart


----------



## SystemCrasher28 (23. Jun 2014)

Hallo Leute

Ich fange gerade erst an Java zu lernen und würde mich auch gerne an das TicTacToe-Spiel versuchen.
Leider habe ich nur geringe Kenntnisse über Jave und hoffe, dass jemand so freundlich wäre und mir die einzelnen Elemente des Quellcodes genauer erklären könnte.
 Vor allem interessiert mich welche Funktionen die einzelnen Befehle haben und was sie bedeuten.

Würde mich sehr über eine Antwort freuen


----------



## balu36378291 (1. Feb 2021)

Hallo, ich habe das Programm Notepad++ und wollte fragen wie ich mein gecodetes spiel wirklich spielen kann, brauche ich noch irgenwelche anderen Programme oder bin ich einfach zu dumm?


----------



## kneitzel (1. Feb 2021)

Also erst einmal ist der Thread von 2014 - da wäre es besser, wenn Du einen eigenen Thread starten würdest.

Dann ist die Frage, was Du da denn genau geschrieben hast. Sollte es ein Java Programm sein, so musst du den Code noch übersetzen. Das kannst Du z.B. unter http://openbook.rheinwerk-verlag.de/javainsel/01_005.html#u1.5 finden.

Ansonsten noch der gute Ratschlag: Schau dir direkt eine richtige Entwicklungsumgebung an. Das macht vieles deutlich einfacher. Meine Empfehlung wäre IntelliJ IDEA in der Community Edition. Netbeans soll auch relativ gut sein. Eclipse ist zwar sehr weit verbreitet, aber meiner Meinung nach eher nichts für Anfänger...


----------

