TicTacToe

Hi ich bin gerade dabei TicTacToe in Java zu programmieren. Der Code ist noch nicht ansatzweise fertig funktioniert allerdings jetzt schon nicht. Ich sitze nun seit mehreren Stunden dran und versuche den Fehler zu finden. Ich denke er ist offensichtlich ich weiß nur nicht wo. Also hier das Problem: Man soll eine Zahl eingeben können und daraufhin soll einem das aktuelle Feld angezeigt werden. Was allerdings passiert ist das nach dem ersten eingeben einer Zahl neunmal das Feld angezeigt wird und das Spiel somit beendet ist. Hier der Aktuelle Code. (Nicht alle print Anweisungen müssen beachtet werden manche waren nur zum testen)
Java:
package tiktactoe;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Tictactoe {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String field = "_|_|_\n_|_|_\n | | ";
        String[][] changefield = {{"_|", "_|", "_"}, {"_|", "_|", "_"}, {" |", " |", " "}};
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(field);
        String input = null;
        int number = 0;
        int count = 0;
        while (!(count > 9)) {
            while (number <= 0 && !(number > 9)) {
                try{
                    number = Integer.parseInt(input);
                    System.out.println(number);
                }
                catch(Exception e) {
                    System.out.println("Enter a number between 1 and 9!!");
                    try {
                        input = reader.readLine();
                        System.out.println("Number enterd");
                    } catch (IOException f) {

                        System.out.print("No number enterd");;
                    }
                   
                }
            }
            if (number == 1&& !(changefield[0][0].equals("O"))) {
                changefield[0][0] = "X";
            }
            else if (number == 2&& !(changefield[0][1].equals("O"))) {
                changefield[0][1] = "X";
            }
            else if (number == 3&& !(changefield[0][2].equals("O"))) {
                changefield[0][2] = "X";
            }
            else if (number == 4&& !(changefield[1][0].equals("O"))) {
                changefield[1][0] = "X";
            }
            else if (number == 5&& !(changefield[1][1].equals("O"))) {
                changefield[1][1] = "X";
            }
            else if (number == 6&& !(changefield[1][2].equals("O"))) {
                changefield[1][2] = "X";
            }
            else if (number == 7&& !(changefield[2][0].equals("O"))) {
                changefield[2][0] = "X";
            }
            else if (number == 8&& !(changefield[2][1].equals("O"))) {
                changefield[2][1] = "X";
            }
            else if (number == 9&& !(changefield[2][2].equals("O"))) {
                changefield[2][2] = "X";
            }


        System.out.println(String.join("", changefield[0]) + "\n" + String.join("", changefield[1]) + "\n" + String.join("", changefield[2]));
        count++;
        number = 0;
       
       
    }
    System.out.println("Process finished");
    }

}

Vielen Dank schon mal für alle Antworten.
 

Jw456

Top Contributor
Dein input ist ja immer null also kann nichts geparst werden und du kommst in catch Zweig.

Du musst natürlich auch eine Eingabe Abfrage machen die Du nicht hast.
Deinen Reader musst du schon auch benutzen nicht nur erstellen.
Den input erst in catch abholen macht keinen sinn.
 
Dein input ist ja immer null also kann nichts geparst werden und du kommst in catch Zweig.

Du musst natürlich auch eine Eingabe Abfrage machen die Du nicht hast.
Deinen Reader musst du schon auch benutzen nicht nur erstellen.
Den input erst in catch abholen macht keinen sinn.
Das macht Sinn. Ich dachte ich könnte den auch so abfangen, aber jetzt sehe ich das Problem. Danke
 

mihe7

Top Contributor
Ein paar Anmerkungen zum Code: negiere nicht zu viel in den Bedingungen. Z. B. in Zeile 18:
Java:
 while (!(count > 9)) {
// besser:
 while (count <= 9) {
// in manchen Fällen bietet sich auch an:
 while (count < 10) {


Dann hättest Du nämlich auch das Problem in Zeile 19 gleich erkannt:
Java:
while (number <= 0 && !(number > 9)) {
// ist nichts anderes als 
while (number <= 0 && number <= 9) {
// ist nichts anderes als
while (number <= 0) {

Die Zeilen 36 bis 62 lassen sich mit etwas Mathematik stark vereinfachen. Wenn Du weißt, dass 1 <= number <= 9 gilt, dann kannst Du erstmal einen 0-basierten Index berechnen, indem Du eins abziehst: index = number - 1. Dann gilt 0 <= index <= 8.

Per ganzzahliger Division durch 3 (Spielfeldbreite) erhältst Du den Zeilenindex. Der Rest der Division ergibt den Spaltenindex. Ganz ausführlich:
Java:
int index = number - 1;
int rowIx = index / 3;
int colIx = index % 3;
if (!(changefield[rowIx][colIx].equals("O"))) {
    changefield[rowIx][colIx] = "X";
}
 
Kannst du mal dein fertigen Code hier nochmal posten?
Java:
package tiktactoe;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;

import java.util.concurrent.ThreadLocalRandom;

public class Tictactoe {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader answer = new BufferedReader(new InputStreamReader(System.in));
        String asw = "Play";
        while (!(asw.equals("no"))) {
            System.out.println("Do you want to play TicTacToe?(yes/no)");
            asw = answer.readLine().toLowerCase();
    
            if (asw.equals("yes")) {
                game();
            }
            else {
                System.out.println("Goodbye");
                break;
            }
        }
    }
    public static void game() {
        String field = "1|2|3\n4|5|6\n7|8|9";
        String[][] changefield = {{"_|", "_|", "_"}, {"_|", "_|", "_"}, {" |", " |", " "}};
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(field);
        String input = null;
        int number = 0;
        int count = 0;
        while (count <= 9) {
                while (!(number > 0 && number < 10)) {
                    try{
                        System.out.println("Enter a Number between 1 and 9!");
                        input = reader.readLine();
                        number = Integer.parseInt(input);
                        if (!(number > 0 && number < 10)) {
                            throw new NumberFormatException();
                        }
                    }
                    catch(Exception e) {
                        System.out.println("Enter a number between 1 and 9!!");

                        
                    }
                }

            int index = number -1;
            int rowIx = index / 3;
            int colIx = index % 3;
            if (!(changefield[rowIx][colIx].equals("O ")|| changefield[rowIx][colIx].equals("X "))) {
                changefield[rowIx][colIx] = "X ";
            }


        boolean winner = won(changefield);
        if (winner == true) {
            System.out.println(String.join("", changefield[0]) + "\n" + String.join("", changefield[1]) + "\n" + String.join("", changefield[2]));
            System.out.print("Winner!\n");
            break;
        }
        computerchoice(changefield, count);
        if (won(changefield) == true) {
            System.out.println(String.join("", changefield[0]) + "\n" + String.join("", changefield[1]) + "\n" + String.join("", changefield[2]));
            System.out.print("Winner!\n");
            break;
        }
        System.out.println(String.join("", changefield[0]) + "\n" + String.join("", changefield[1]) + "\n" + String.join("", changefield[2]));
        count++;
        number = 0;
        
        
    }
    boolean winner = won(changefield);
    if (winner == false) {
        System.out.print("Tie");
    }
    }
    
    public static void computerchoice(String[][] changefield, int count) {
        int randomNum = ThreadLocalRandom.current().nextInt(1, 10);
        boolean choose = false;
        count++;
        while (!(choose == true)) {
            randomNum = ThreadLocalRandom.current().nextInt(1, 10);
            int index = randomNum -1;
            int rowIx = index / 3;
            int colIx = index % 3;
            if (!(changefield[rowIx][colIx].equals("O ")|| changefield[rowIx][colIx].equals("X "))) {
                changefield[rowIx][colIx] = "O ";
                choose = true;
            }}
        }
    public static boolean won(String[][] changefield) {
        int row = 0;
        int col = 0;
        boolean winner = false;
        if (changefield[row][col].equals("X ")&&changefield[row][col+1].equals("X ")&&changefield[row][col+2].equals("X ")||changefield[row][col].equals("O ")&&changefield[row][col+1].equals("O ")&&changefield[row][col+2].equals("O ") ) {
            winner = true;
        }
        else if (changefield[row+ 1][col].equals("X ")&&changefield[row+1][col+1].equals("X ")&&changefield[row+1][col+2].equals("X ")|| changefield[row+ 1][col].equals("O ")&&changefield[row+1][col+1].equals("O ")&&changefield[row+1][col+2].equals("O ")) {
            winner = true;
        }       
        else if (changefield[row+ 2][col].equals("X ")&&changefield[row+2][col+1].equals("X ")&&changefield[row+2][col+2].equals("X ")||changefield[row+ 2][col].equals("O ")&&changefield[row+2][col+1].equals("O ")&&changefield[row+2][col+2].equals("O ")) {
            winner = true;
        }
        else if (changefield[row][col].equals("X ")&&changefield[row+1][col].equals("X ")&&changefield[row+2][col].equals("X ")||changefield[row][col].equals("O ")&&changefield[row+1][col].equals("O ")&&changefield[row+2][col].equals("O ")) {
            winner = true;
        }
        else if (changefield[row][col+1].equals("X ")&&changefield[row+1][col+1].equals("X ")&&changefield[row+2][col+1].equals("X ")||changefield[row][col+1].equals("O ")&&changefield[row+1][col+1].equals("O ")&&changefield[row+2][col+1].equals("O ")) {
            winner = true;
        }
        else if (changefield[row][col+2].equals("X ")&&changefield[row+1][col+2].equals("X ")&&changefield[row+2][col+2].equals("X ")||changefield[row][col+2].equals("O ")&&changefield[row+1][col+2].equals("O ")&&changefield[row+2][col+2].equals("O ")) {
            winner = true;
        }
        else if (changefield[row][col].equals("X ")&&changefield[row+1][col+1].equals("X ")&&changefield[row+2][col+2].equals("X ")||changefield[row][col].equals("O ")&&changefield[row+1][col+1].equals("O ")&&changefield[row+2][col+2].equals("O ")) {
            winner = true;
        }
        else if (changefield[row][col+2].equals("X ")&&changefield[row+1][col+1].equals("X ")&&changefield[row+2][col].equals("X ")||changefield[row][col+2].equals("O ")&&changefield[row+1][col+1].equals("O ")&&changefield[row+2][col].equals("O ")) {
            winner = true;
        }
        
        return winner;
    }

}

Ich bin mir sicher es geht kürzer und unkomplizierter, aber dass ist er.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
C TicTacToe Java Basics - Anfänger-Themen 2
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
A Überprüfung in TicTacToe Java Basics - Anfänger-Themen 5
A TicTacToe Java Basics - Anfänger-Themen 8
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J TicTacToe Java Basics - Anfänger-Themen 2
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
shiroX Input/Output TicTacToe-Savegame Java Basics - Anfänger-Themen 1
shiroX Methoden Mögliche Spielstände bei TicTacToe Java Basics - Anfänger-Themen 14
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
P TicTacToe Problem mit Win Methode Java Basics - Anfänger-Themen 4
Z TicTacToe mit Array Java Basics - Anfänger-Themen 6
T TicTacToe Spielfeld Java Basics - Anfänger-Themen 7
B TicTacToe Java Basics - Anfänger-Themen 2
S TicTacToe Java Basics - Anfänger-Themen 4
I TicTacToe blöde KI Java Basics - Anfänger-Themen 2
I Fehler bei TicTacToe Java Basics - Anfänger-Themen 108
G TicTacToe KI Java Basics - Anfänger-Themen 15
C Problem TicTacToe Java Basics - Anfänger-Themen 6
P 3D TicTacToe - Unentschieden Java Basics - Anfänger-Themen 5
G Tictactoe Java Basics - Anfänger-Themen 9
B TicTacToe Programmieren Java Basics - Anfänger-Themen 2
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
cizzo TicTacToe Java Basics - Anfänger-Themen 6
W TicTacToe - Porblem mit dem Code.. Java Basics - Anfänger-Themen 5
H Hilfe bei TicTacToe mit jEdit Java Basics - Anfänger-Themen 7
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
N brauche hilfe zu tictactoe Java Basics - Anfänger-Themen 2
kulturfenster Problem bei TicTacToe Java Basics - Anfänger-Themen 11
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
H TicTacToe: Zeit zwischen Zügen lassen Java Basics - Anfänger-Themen 9
M TicTacToe Java Basics - Anfänger-Themen 7
H TicTacToe-geeignete Klassenhierarchie Java Basics - Anfänger-Themen 3
G Hilfe bei TicTacToe Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben