Do/While Probleme

phreeak

Mitglied
Hello,

ich glaub ich seh vor lauter Bäumen den Wald nicht.
Soll als Aufgabe ein Tic Tac Toe spiel machen, nun hab ich 2. Fehler

- Er wechselt nicht den Spieler
- Wenn eine Reihe voll ist gibt der den sieger nicht aus

Code:
import java.io.*;

class TicTacToe
{
     char[][] spielfeld;
    
     
public TicTacToe() {
     spielfeld = new char [3][3];
     spielfeld[0][0]=' ';
     spielfeld[0][1]=' ';
     spielfeld[0][2]=' ';
     spielfeld[1][0]=' ';
     spielfeld[1][1]=' ';
     spielfeld[1][2]=' ';
     spielfeld[2][0]=' ';
     spielfeld[2][1]=' ';
     spielfeld[2][2]=' ';
}
    
    
public static void main(String args[]) {
     char sieger;
     char Spieler;
     TicTacToe spiel = new TicTacToe();
     System.out.println("Willkommen bei Tic Tac Toe");
     spiel.zeigeSpielfeld();
        do {
            spiel.dasSpiel();
            spiel.zeigeSpielfeld();
    }
   
     while (spiel.Sieger() == ' ');
     
  }

public void zeigeSpielfeld() {

     System.out.println(spielfeld[0][0]+"|"+spielfeld[0][1]+"|"+spielfeld[0][2]);
     System.out.println("-----");
     System.out.println(spielfeld[1][0]+"|"+spielfeld[1][1]+"|"+spielfeld[1][2]);
     System.out.println("-----");
     System.out.println(spielfeld[2][0]+"|"+spielfeld[2][1]+"|"+spielfeld[2][2]);
     System.out.println("");
  }
  
public char Sieger() {
char sieger = ' ';
        for (int i = 0; i < 3; i++)
      {
         if ((spielfeld[0][i] == spielfeld[1][i]) && (spielfeld[1][i] == spielfeld[2][i]))
         {
            sieger = spielfeld[0][i];
         }
      }

      for (int j = 0; j < 3; j++)
      {
         if ((spielfeld[j][0] == spielfeld[j][1]) && (spielfeld[j][1] == spielfeld[j][2]))
         {
            sieger = spielfeld[j][0];
         }
      }
      return sieger;
}

public void dasSpiel()  {
int reihe;
int spalte;
int EingabeCheck = 1;
char Spieler = 'x';
String Eingabe;
int Umwandlung;
do {
System.out.println("Bitte geben sie ein Feld ein mit Zahl,Zahl.. z.B 0,2");
System.out.println("0,2 ist z.B oben Rechts, 0,1 ist oben in der Mitte und 0,0 oben Links");
System.out.println("Spieler "+Spieler+" ist am Zug");
Eingabe = getLine();
reihe = Integer.parseInt(Eingabe.substring(0,1));
spalte = Integer.parseInt(Eingabe.substring(2,3));

    if (( reihe < 0  ||  reihe > 2 ) && ( spalte < 0 || spalte > 2 )) {
    EingabeCheck = 0;
        System.out.println("ungültige Eingabe, versuch es erneut");
    }
    if (spielfeld[reihe][spalte]!=' ' ) {
        EingabeCheck = 0;
        System.out.println("Spielfeld ist schon belegt");
    }
  
        }
        while (EingabeCheck == 0);
        
        spielfeld[reihe][spalte] = Spieler;
       
      if (Spieler == 'x')
           Spieler = 'o';

         else
           Spieler = 'x';
}

/** ******************************************
* Diese Hilfsmethode liest eine Zeile von der Konsole ein
* @return eingelesene Zeile (mit Return am Schluss!) als String
* Aufruf z.B.: String s; s = getLine(); // in s steht die Eingabe
*
************************************************/
static String getLine() {
String line ="";
try{ BufferedReader Tast = new BufferedReader(new
InputStreamReader(System.in));
line = Tast.readLine();
} catch(Exception e) { }
return line;
}   

}



Das Programm ist noch nicht fertig, aber wollte schonmal die einfachen Sachen testen.

Was übersehe ich? Mehere Augen sehen mehr als 2... :p


Der Sieger wird mit

Code:
public char Sieger() {
char sieger = ' ';
        for (int i = 0; i < 3; i++)
      {
         if ((spielfeld[0][i] == spielfeld[1][i]) && (spielfeld[1][i] == spielfeld[2][i]))
         {
            sieger = spielfeld[0][i];
         }
      }

      for (int j = 0; j < 3; j++)
      {
         if ((spielfeld[j][0] == spielfeld[j][1]) && (spielfeld[j][1] == spielfeld[j][2]))
         {
            sieger = spielfeld[j][0];
         }
      }
      return sieger;
}

Ermittelt und gehört zum while in main()


Der spieler soll eigentlich gewechselt werden, nach dem while in dasSpiel()

Code:
      if (Spieler == 'x')
           Spieler = 'o';

         else
           Spieler = 'x';

das

Code:
spielfeld[reihe][spalte] = Spieler;

führt er ja aus, nach dem while... un übergibt X an die Position die man gewählt hat.
 
Zuletzt bearbeitet:
Hi

Also, manche Sachen kann man mit Schleifen kürzer lösen...
Einrückungen wären für die Übersicht von Vorteil.
Bei Sieger fehlt die Diagonal-Überprüfung.
Bei dasSpiel muss die Variable Spieler raus aus der Methode in die Klasse.
 
also Spieler als "globale variable" ?! Naja das Problem ist irgendwie er will keine globale variablen, das array nun global gemacht, weil ich kb habe, immer den wert an eine andere funktion zu übergeben.

Wird sollen die werte immer übergeben.
 
Habs mit der globalen Variablen nun gemacht, mir egal wenn er Probleme damit hat.
Wenn ich es anders mache kommt immer ein fehler..


Allerdings nun nen Problem,

Code:
public char Sieger() {
char sieger = ' ';
        for (int i = 0; i < 3; i++)
      {
         // z.B wenn 0,0 = 1,0 und 1,0 = 2,0 dann 
         // z.B wenn 0,1 = 1,1 und 1,1 = 2,1 dann 
         // z.B wenn 0,2 = 1,2 und 1,2 = 2,2 dann 
        if ((spielfeld[0][i] == spielfeld[1][i]) && (spielfeld[1][i] == spielfeld[2][i]))
         {
            sieger = spielfeld[0][i];
         }
             
      }

      for (int j = 0; j < 3; j++)
      {
          // z.B wenn 0,0 = 0,1 und 0,1 = 0,2 dann 
          // z.B wenn 1,0 = 1,1 und 1,1 = 1,2 dann 
          // z.B wenn 2,0 = 2,1 und 2,1 = 2,2 dann 
         if ((spielfeld[j][0] == spielfeld[j][1]) && (spielfeld[j][1] == spielfeld[j][2]))
         {
            sieger = spielfeld[j][0];
         }
      }
      System.out.println("sieger return "+sieger);
      return sieger;
}

klappt.
Aber wie soll ich das anstellen, dass wenn alle felder belegt sind, er zurück gibt, das es keinen sieger gibt..

ein weiteres if erstellen in Sieger oder ne schleife in dasSpiel bei der eingabe, wenn nach 9 zügen kein Sieger ist, er Sieger = z.B 0 setzt und zurück gibt?!
 
Welcher Fehler kommt, wenn du es anders machst?

Netiquette §15 beachten.

Zum neuen "Problem": Beide Möglichkeiten gehen.
Die zweite ist einfacher.
 
hab das Problem schon gelöst, allerdings wollte er, dass ich die Eingabe anders mache.

mit

Code:
/** ******************************************
* Diese Hilfsmethode wandelt einen String in eine ganze Zahl um
* @return Zahlenwert des Strings, wenn gültig, sonst -1111
*
* Wenn der String keine ganze Zahl ist,
* z.B. „12a“ oder „12,2“ oder „12.2“
* wird der Zahlenwert -1111 zurückgegeben
*
* Aufruf z.B.: int i; i = asInteger(“12”); // i hat den Wert 12
************************************************/
static int asInteger(String s) {
int i;
try { i = Integer.parseInt(s);
} catch (Exception e) {
i = -1111;
}
return i;
}

also das er den String in ein Int umwandelt..

so allerdings, muss ich ja, wenn ich nen feld angebe 2 zahlen angeben, also z.B 12 (2 reihe, letztes Feld)

Das klappt auch soweit,

mit

Code:
Eingabe = getLine();
Umwandlung = asInteger(Eingabe);
reihe = Integer.parseInt(Integer.toString(Umwandlung).substring(0,1));
spalte = Integer.parseInt(Integer.toString(Umwandlung).substring(1,2));

allerdings ergibt sich das Problem,wenn ich z.B die 1 spalt (0) ansprechen will mit dem ersten oder zweiten oder dritten kästen. also 01, 02, 03 liefert der asInteger ja nur 1, 2, 3 zurück und lässt die 0 verschwinden und dann springt das Programm ausm spiel, da er für:

Code:
reihe = Integer.parseInt(Integer.toString(Umwandlung).substring(0,1));
spalte = Integer.parseInt(Integer.toString(Umwandlung).substring(1,2));

keine weitere Zahl für Spalte hat.

wie kann man das lösen?!
 
Math. ist 000123 eben das Gleiche wie 123.

Ud liest die Einage per String ein,
wandelst sie i int um, wandelst das int wieder in String um,
nur um die Substrings wieder in int umzuwandeln?

Warum nicht einfach so:
Java:
eingabe = getLine();
reihe = Integer.parseInt(e.substring(0,1));
spalte = Integer.parseInt(e.substring(1,2));
Für die Strennstelle suchst du besser nach Leerzeichen oder so...
dort dann mit substring trennen.

Gruß
 
Das hab ich auch noch zurzeit und klappt wunderbar

Code:
 Eingabe = getLine();
 reihe = Integer.parseInt(Eingabe.substring(0,1));
 spalte = Integer.parseInt(Eingabe.substring(2,3));

Allerdings steht auf dem Aufgaben Blatt (pdf)

Für das Einlesen des Spieler-Inputs von der Tastatur und die Umwandlung eines String in ein int verwenden Sie die gleichen Funktionen wie im Termin 6.

Code:
3.3 Einen String in ein int umwandeln
/** ******************************************
* Diese Hilfsmethode wandelt einen String in eine ganze Zahl um
* @return Zahlenwert des Strings, wenn gültig, sonst -1111
*
* Wenn der String keine ganze Zahl ist,
* z.B. „12a“ oder „12,2“ oder „12.2“
* wird der Zahlenwert -1111 zurückgegeben
*
* Aufruf z.B.: int i; i = asInteger(“12”); // i hat den Wert 12
************************************************/
static int asInteger(String s) {
int i;
try { i = Integer.parseInt(s);
} catch (Exception e) {
i = -1111;
}
return i;
}


mit

Code:
/** ******************************************
* Diese Hilfsmethode liest eine Zeile von der Konsole ein
* @return eingelesene Zeile (mit Return am Schluss!) als String
* Aufruf z.B.: String s; s = getLine(); // in s steht die Eingabe
*
************************************************/
static String getLine() {
String line =””;
try{ BufferedReader Tast = new BufferedReader(new
InputStreamReader(System.in));
line = Tast.readLine();
} catch(Exception e) { }
return line;
}

Ka wieso er das so will. Letzteres benutz ich zur Eingabe, das wars dann aber auch.

so wie ich es gerade habe, ist das so, das ich Spalte, Zahl eingebe in der Konsole. Also 0,1 z.B


btw.. 2 kleine Fragen. wie kann ich ein Array überprüfen ob alle Felder belegt sind, also nen 2 dimensionales... meins heisst,

Code:
spielfeld[reihe][spalte]

dachte ja an einer for schleife die bis 3 geht und dann

Code:
spielfeld[i][0]!=' '

aber find zu dem Thema auch nix.. ;P
 
Zuletzt bearbeitet:
Zu der Einabe:
Vllt. sollst du die Zwei Zahlen ja auch komplett getrennt einlesen, nicht in der gleiche Zeile?

Zu Überprüfen des kompletten Arrays:
Java:
bool voll = true;
for(int i = spielfeld.length - 1; i >= 0; i--) {
    for(int j = spielfeld[i].length - 1; j >= 0; j--) {
         if(spielfeld[i][j] == ' ')
             voll = false;
    }
}
...
if(voll)
    //Alles besetzt
else
    //Noch was frei
 
Zurück