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.
 
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
 
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.
 

Zurück
Oben