Tic Tac Toe - Programm

BaylifeChico

Neues Mitglied
Hey ,
ich bin gerade dabei ein TicTacToe Programm zu schreiben. Mein Problem liegt im Moment darin, dass ich keine Lösung finde wie ich überprüfen kann ob ein Feld schon besetzt ist und dem Programm dann sage, dass es das Feld nicht ausfüllt und der Spieler die Eingabe wiederholen muss.
Schon mal Vielen Dank für jeden Tipp!
Java:
public class TicTacToe {
    private static java.util.Scanner in;

    public static void main(String[] args) {
        int limit=2;
        int Feld [] []= new int [limit+1][limit+1];
        int rundenzähler=0;
        int spielerX=0;
        int spielerO=0;

        while(rundenzähler<=8){
            if(rundenzähler%2==0){
                System.out.println("Spieler X setze ein X :");       
                in = new java.util.Scanner(System.in);
                String s1 = in.nextLine();
                spielerX = Integer.parseInt( s1 );
                if (spielerX == 0) {
                    System.out.println("Spieler X hat aufgegeben!");
                    break;
                }
                if(spielerX > 9 || spielerX < 0) {
                    System.out.println("Nur Zahlen von 1-9");
                    continue;
                }
            }
            if(rundenzähler%2==1){
                System.out.println("Spieler O setze ein O :");
                in = new java.util.Scanner(System.in);
                String s2 = in.nextLine();
                spielerO = Integer.parseInt( s2 );
                if (spielerO == 0) {
                    System.out.println("Spieler O hat aufgegeben!");
                    break;
                }
                if(spielerO > 9 || spielerO < 0) {
                    System.out.println("Nur Zahlen von 1-9");
                    continue;
                }
            }
            if(spielerX==1){
                Feld[0][0]=2;
            }
            if(spielerX==2){
                Feld[0][1]=2;
            }
            if(spielerX==3){
                Feld[0][2]=2;
            }
            if(spielerX==4){
                Feld[1][0]=2;
            }
            if(spielerX==5){
                Feld[1][1]=2;
            }
            if(spielerX==6){
                Feld[1][2]=2;
            }
            if(spielerX==7){
                Feld[2][0]=2;
            }
            if(spielerX==8){
                Feld[2][1]=2;
            }
            if(spielerX==9){
                Feld[2][2]=2;
            }
            if(spielerO==1){
                Feld[0][0]=3;
            }
            if(spielerO==2){
                Feld[0][1]=3;
            }
            if(spielerO==3){
                Feld[0][2]=3;
            }
            if(spielerO==4){
                Feld[1][0]=3;
            }
            if(spielerO==5){
                Feld[1][1]=3;
            }
            if(spielerO==6){
                Feld[1][2]=3;
            }
            if(spielerO==7){
                Feld[2][0]=3;
            }
            if(spielerO==8){
                Feld[2][1]=3;
            }
            if(spielerO==9){
                Feld[2][2]=3;
            }
            rundenzähler++;

            for (int zeile=0; zeile<=limit; zeile++){
                for (int spalte=0; spalte<=limit; spalte++){ //Spielfeld
                    if(Feld[zeile][spalte]==0)
                    {
                        System.out.print("-");
                    }
                    if(Feld[zeile][spalte]==2)
                    {
                        System.out.print("X");
                    }
                    if(Feld[zeile][spalte]==3)
                    {
                        System.out.print("O");
                    }
                }
                System.out.println("");
            }
            for(int i = 0; i < 3; i++) {
                if(Feld[0][i]==2 && Feld [1][i]==2 && Feld[2][i]==2) { //Spalten
                    System.out.println("Spieler X hat gewonnen!");
                    rundenzähler = 10;
                    break;
                }
                if(Feld[0][i]==3 && Feld [1][i]==3 && Feld[2][i]==3) {
                    System.out.println("Spieler O hat gewonnen!");
                    rundenzähler = 10;
                    break;
                }
            }
            for(int i = 0; i < 3; i++) {
                if (Feld [i][0]==2 && Feld [i][1]==2 && Feld [i][2]==2) { //Zeilen
                    System.out.println("Spieler X hat gewonnen!");
                    rundenzähler =10;
                    break;
                }
                if (Feld [i][0]==3 && Feld [i][1]==3 && Feld [i][2]==3) {
                    System.out.println("Spieler 0 hat gewonnen!");
                    rundenzähler =10;
                    break;
                }
            }
            if (Feld [0][0]==2 && Feld [1][1]==2 && Feld [2][2]==2) { //Diagonal
                System.out.println("Spieler X hat gewonnen!");
                rundenzähler =10;
                break;
            }
            if (Feld [0][0]==3 && Feld [1][1]==3 && Feld [2][2]==3) {
                System.out.println("Spieler O hat gewonnen!");
                rundenzähler =10;
                break;
            }
            if(rundenzähler==9){
                System.out.println("Das Spiel ist unentschieden");
            }
        }
    }
}
 
Ich habs mal ein wenig verbessert und kommentiert. Aber - ungetestet.

Java:
// brauchst du nicht immer neu instanzieren
    private static java.util.Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        // Bitte schreibe Variablen immer klein in Java
        // setze doch direkt das zeichen
        char feld[][] = { { '-', '-', '-' }, { '-', '-', '-' },
                { '-', '-', '-' } };
        boolean ende = false;

        // du soltlest dem Spieler das auch erklären :-)
        System.out.println("Setzen mit 1-9, aufgeben mit 0");

        // for-Schleife ist hier geeigneter
        // Bitte vermeide Umlaute, können Probleme machen
        for (int rundenzaehler = 0; rundenzaehler <= 8 && !ende; rundenzaehler++) {
            // so brauchst du deinen Code nicht verdoppeln
            char zeichen = rundenzaehler % 2 == 0 ? 'X' : 'O';

            System.out.println("Spieler " + zeichen + " setze ein " + zeichen
                    + " :");

            try {
                // eingabe ist sprechender
                int eingabe = Integer.parseInt(in.nextLine());

                // break und continue möglichst vermeiden. in den meisten Fällen
                // reicht ein gutes else aus..
                if (eingabe == 0) {
                    System.out.println("Spieler " + zeichen
                            + " hat aufgegeben!");
                    // .. oder ein gutes boolean
                    ende = true;
                } else if (eingabe > 9 || eingabe < 0) {
                    System.out.println("Nur Zahlen von 1-9");
                    // damit gehst du mit dem gleichen Zähler nochmal in die
                    // Runde, wiederholst sie also
                    rundenzaehler--;
                } else {
                    // 9 ifs sind unschön, du kannst es so generalisieren:
                    int zeile = (eingabe - 1) / 3;
                    int spalte = (eingabe - 1) % 3;

                    // hier Feldbelegung
                    if (feld[zeile][spalte] != '-') {
                        System.out.println("Feld schon belegt");
                        rundenzaehler--;
                    } else {
                        feld[zeile][spalte] = zeichen;

                        // die vorhergehenden Änderungen vereinfachen die
                        // Ausgabe stark
                        for (int i = 0; i < feld.length; i++) {
                            for (int j = 0; j < feld[i].length; j++) {
                                System.out.print(feld[i][j] + " ");
                            }
                            System.out.println();
                        }

                        // Diagonale 1
                        if (feld[0][0] != '-' && feld[0][0] == feld[1][1]
                                && feld[1][1] == feld[2][2]) {
                            System.out.println("Spieler " + feld[1][1]
                                    + " hat gewonnen!");
                            ende = true;
                            // Diagonale 2
                        } else if (feld[0][2] != '-'
                                && feld[0][2] == feld[1][1]
                                && feld[1][1] == feld[2][0]) {
                            System.out.println("Spieler " + feld[1][1]
                                    + " hat gewonnen!");
                            ende = true;
                        } else {
                            // eine schleife reicht
                            for (int i = 0; i < feld.length; i++) {
                                // Spalten
                                if (feld[0][i] != '-'
                                        && feld[0][i] == feld[1][i]
                                        && feld[1][i] == feld[2][i]) {
                                    System.out.println("Spieler " + feld[1][i]
                                            + " hat gewonnen!");
                                    ende = true;

                                    // Zeilen
                                } else if (feld[i][0] != '-'
                                        && feld[i][0] == feld[i][1]
                                        && feld[i][1] == feld[i][2]) {
                                    System.out.println("Spieler " + feld[i][1]
                                            + " hat gewonnen!");
                                    ende = true;
                                }
                            }
                        }
                    }
                }
                // Eingabe war keine Zahl
            } catch (NumberFormatException e) {
                System.out.println("Ungültige Eingabe");
                rundenzaehler--;
            }
        }

        // unentschieden
        if (!ende) {
            System.out.println("Das Spiel ist unentschieden");
        }
    }
 
Vielen vielen Dank!
Hab es mal kurz getestet und es funktioniert! Ich werde mir mal die Kommentare gut durchlesen und versuchen in der Zukunft zu berücksichtigen.
 

Zurück
Oben