Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden

J

johannes2308

Mitglied
Hallo,
ich bin grad dabei hier ein kleines TicTacToe Spiel zu schreiben, jedoch habe ich bei den Gewinnoptionen(ich denke jeder kennt diese bei TicTacToe) einen Fehler. Und zwar, wenn ich als Spieler x gewinne wird alles beendet(Zeile 23), bei Spieler o jedoch werde ich im Anschluss noch um einen Zug gefragt und erst danach beendet es ich weiß aber nicht wieso.
Meine weitere Frage ist, wie ich hierbei noch eine Unentschieden Abfrage erstelle, also wenn alle Felder belegt sind, aber kein xxx oder ooo vorhanden ist. Das habe ich bereits mit der Variable counter(auch gehighlighted im code), als Zugermittler versucht, jedoch ohne Erfolg.

Wäre nett, wenn mir jemand schnell helfen könnte :).
Grüße

TicTacToe:
import java.math.*;
import java.util.*;

public class TicTakToe {
   
    public static char board[] = new char[9]; // creating public char array board with 9 positions

    public static void main(String[] args) {
       
        Scanner sc = new Scanner(System.in);

        int count = 0; // declaring integer count
        int counter = 0;
        int pos; // initiating integer pos
        int player1; // initiating integer player1
        boolean finish = false; // declaring boolean finish
       
        init(); // output init method
       
        do // do as long as board got at least one ' ' spot and finish is false
        {
       
            if (board[0] == 'x' && board[1] == 'x' && board[2] == 'x' || board[0] == 'x' && board[3] == 'x' && board[6] == 'x' || board[0] == 'x' && board[4] == 'x' && board[8] == 'x' || board[3] == 'x' && board[4] == 'x' && board[5] == 'x' || board[6] == 'x' && board[7] == 'x' && board[8] == 'x' || board[1] == 'x' && board[4] == 'x' && board[7] == 'x' || board[2] == 'x' && board[5] == 'x' && board[8] == 'x' || board[6] == 'x' && board[4] == 'x' && board[2] == 'x')
            { // winning options for 'x'
                System.out.println("Spieler x hat gewonnen!"); // output in console
                finish = true; // set finish true
                break; // end
               
            }else if (board[0] == 'o' && board[1] == 'o' && board[2] == 'o' || board[0] == 'o' && board[3] == 'o' && board[6] == 'o' || board[0] == 'o' && board[4] == 'o' && board[8] == 'o' || board[3] == 'o' && board[4] == 'o' && board[5] == 'o' || board[6] == 'o' && board[7] == 'o' && board[8] == 'o' || board[1] == 'o' && board[4] == 'o' && board[7] == 'o' || board[2] == 'o' && board[5] == 'o' && board[8] == 'o' || board[6] == 'o' && board[4] == 'o' && board[2] == 'o')
            { // winning options for 'o'
                System.out.println("Spieler o hat gewonnen!"); // output in console
                finish = true; // set finish true
                break; // end
            }
           
            do
            { // creating random number in between 0 - 8
                pos = (int)(Math.random()*10) % 9;
                count++;
                counter++;
            }while (board[pos] != ' ' && count < 1000); //
           
            System.out.println("Spieler o wählt Position " + pos + "!"); // output in console
            board[pos] = 'o'; // setting random number(computers turn) as 'o'
           
            print(); // output print method (board)
           
                System.out.println("An welcher Stelle wollen Sie 'x' setzen (0 - 8)?"); // output turn question for player1
                player1 = sc.nextInt(); // sets player1 as keyboard input
               
                if (board[player1] != ' ') // new input if Position is already used
                {
                    System.out.println("Ungültige Eingabe! Entweder ihre gewählte Position ist bereits besetzt, oder ihre Eingabe ist falsch."); // output in console
                    System.out.println("Wählen Sie erneut eine Position 0 - 8!"); //output in console
                    player1 = sc.nextInt(); // sets player1 as keyboard input
                }
               
                if (board[player1] == ' ' ) // set player1 turn as 'x' if it is empty
                {
                    board[player1] = 'x';
                    System.out.println("Sie haben Position " + player1 + " gewählt!");
                    counter++;
                }
               
           
            print(); // output print method
           
               
        }while(board[0] == ' ' || board[1] == ' ' || board[2] == ' ' || board[3] == ' ' || board[4] == ' ' || board[5] == ' ' || board[6] == ' ' || board[7] == ' ' || board[8] == ' ' && finish == false && counter < 9);
       
    }
   
    public static void print() // output of playing board as method
    {
        System.out.println("[" + board[0] + "][" + board[1] + "][" + board[2] + "]");
        System.out.println("[" + board[3] + "][" + board[4] + "][" + board[5] + "]");
        System.out.println("[" + board[6] + "][" + board[7] + "][" + board[8] + "]");
    }
   
    public static void init() // initiating and declaring board values as own method
    {
        board[0] = ' ';
        board[1] = ' ';
        board[2] = ' ';
        board[3] = ' ';
        board[4] = ' ';
        board[5] = ' ';
        board[6] = ' ';
        board[7] = ' ';
        board[8] = ' ';
    }
   
}
 
Zuletzt bearbeitet:
D

DrPils

Bekanntes Mitglied
zwar, wenn ich als Spieler x gewinne wird alles beendet(Zeile 23), bei Spieler o jedoch werde ich im Anschluss noch um einen Zug gefragt und erst danach beendet es ich weiß aber nicht wieso.
Wenn ich es richtige sehe läuft es bei dir so ab.
Code:
Schleife
    Prüfe ob x gewonnen:
        wenn x gewonnen, dann ende
    Prüfe ob o gewonnen:
        wenn o gewonnen, dann ende
   
    Zug von Spieler O
    Zug von Spieler X
    wiederhole Schleife

Also X ist als letztes drann und danach wird direkt geprüft.
Aber wenn O schon gewonnen hatt, muss X trotztdem einen Zug machen
Du müsstest die Prüfung nach jedem Zug durchführen

Meine weitere Frage ist, wie ich hierbei noch eine Unentschieden Abfrage erstelle, also wenn alle Felder belegt sind, aber kein xxx oder ooo vorhanden ist. Das habe ich bereits mit der Variable counter(auch gehighlighted im code), als Zugermittler versucht, jedoch ohne Erfolg.

Das ist ja eigentlich die Lösung. Wenn alle Felder belegt sind und es keinen Gewinner gibt, dann ist es unentschieden. Das musst du also irgendwie prüfen.
 
J

johannes2308

Mitglied
Wenn ich es richtige sehe läuft es bei dir so ab.
Code:
Schleife
    Prüfe ob x gewonnen:
        wenn x gewonnen, dann ende
    Prüfe ob o gewonnen:
        wenn o gewonnen, dann ende
  
    Zug von Spieler O
    Zug von Spieler X
    wiederhole Schleife

Also X ist als letztes drann und danach wird direkt geprüft.
Aber wenn O schon gewonnen hatt, muss X trotztdem einen Zug machen
Du müsstest die Prüfung nach jedem Zug durchführen



Das ist ja eigentlich die Lösung. Wenn alle Felder belegt sind und es keinen Gewinner gibt, dann ist es unentschieden. Das musst du also irgendwie prüfen.
Ahh perfekt, danke dir! Das mit den Gewinnoptionen funktioniert jetzt, aber das Unentschieden verstehe ich noch nicht ganz.
Kann ich das irgendwie prüfen, ohne dass ich jede einzelne Möglichkeit wie o und x sein kann ohne, dass es ein Gewinn wäre, aufschreiben müsste, weil das wäre ja mega viel Arbeit.
 
mihe7

mihe7

Top Contributor
// creating random number in between 0 - 8
pos = (int)(Math.random()*10) % 9;
Dir ist klar, dass damit 0 mit einer doppelt so hohen Wahrscheinlichkeit ermittelt wird als die anderen Zahlen?

Kann ich das irgendwie prüfen, ohne dass ich jede einzelne Möglichkeit wie o und x sein kann ohne, dass es ein Gewinn wäre, aufschreiben müsste, weil das wäre ja mega viel Arbeit.
Naja, finish ist ja nur true, wenn es einen Gewinner gibt :) D. h. nach der Schleife weißt Du, ob es ein Unentschieden war.
 
D

DrPils

Bekanntes Mitglied
Kann ich das irgendwie prüfen, ohne dass ich jede einzelne Möglichkeit wie o und x sein kann ohne, dass es ein Gewinn wäre, aufschreiben müsste, weil das wäre ja mega viel Arbeit.
Hast du ja eigentlich schon gemacht, sonst könntest du ja keinen Gewinner ermitteln.
Du könntest jetzt den Code der ermittelt ob es einen Gewinner gibt in eine Methode packen boolean playerHasWon() (oder sowas).
Die Felder in deinem Array haben ja den Wert ' ' wenn kein 'X' oder 'O'.
Wenn jedes Feld 'X' oder 'O' enthält, also kein ' ' in deinem Array ist. Ist das spiel vorbei.
Die Prüfung ob das Spiel vorbei ist würde ich auch in eine Methode packen.
Jetzt kannst du prüfen ob das Spiel vorbei ist (alle Felder ausgefüllt) und ob es keinen Gewinner gibt.
Ist das der Fall ist es ein Unentschieden
 
J

johannes2308

Mitglied
Dir ist klar, dass damit 0 mit einer doppelt so hohen Wahrscheinlichkeit ermittelt wird als die anderen Zahlen?


Naja, finish ist ja nur true, wenn es einen Gewinner gibt :) D. h. nach der Schleife weißt Du, ob es ein Unentschieden war.
Tatsächlich ist mir das nicht klar gewesen, aber naja mein prof meinte wir können das so machen, also mach ich das auch so :D
 
J

johannes2308

Mitglied
Hast du ja eigentlich schon gemacht, sonst könntest du ja keinen Gewinner ermitteln.
Du könntest jetzt den Code der ermittelt ob es einen Gewinner gibt in eine Methode packen boolean playerHasWon() (oder sowas).
Die Felder in deinem Array haben ja den Wert ' ' wenn kein 'X' oder 'O'.
Wenn jedes Feld 'X' oder 'O' enthält, also kein ' ' in deinem Array ist. Ist das spiel vorbei.
Die Prüfung ob das Spiel vorbei ist würde ich auch in eine Methode packen.
Jetzt kannst du prüfen ob das Spiel vorbei ist (alle Felder ausgefüllt) und ob es keinen Gewinner gibt.
Ist das der Fall ist es ein Unentschieden
Hab dann doch noch den Fehler selber gefunden, aber trotzdem danke für deine Antworten :)
 
Blender3D

Blender3D

Top Contributor
Meine weitere Frage ist, wie ich hierbei noch eine Unentschieden Abfrage erstelle, also wenn alle Felder belegt sind, aber kein xxx oder ooo vorhanden ist. Das habe ich bereits mit der Variable counter(auch gehighlighted im code), als Zugermittler versucht, jedoch ohne Erfolg.
Du solltest mittels Teile und Herrsche Strategie das Problem zerlegen (Methoden) . Dann wird die Hauptschleife übersichtlicher.
Da Du bereits eine Lösung hast hier ein etwas überarbeiteter Code.
Hauptschleife ist hervorgeoben:
import java.util.Random;
import java.util.Scanner;

public class TicTakToe {
    // define random object
    private static Random random = new Random(System.currentTimeMillis());
    // define input object
    private final static Scanner input = new Scanner(System.in);
    // define board's dimension
    private final static int BOARD_DIM = 3;
    // create public char array board with 3 x 3 positions
    public static char board[] = new char[BOARD_DIM * BOARD_DIM];
    // define board's used characters
    private final static char PLAYER = 'x';
    private final static char CPU = 'o';
    private final static char EMPTY = ' ';

    public static void main(String[] args) {
        resetBoard();
        while (!isBoardFull()) {
            int pos = getCpuMove();
            System.out.println("CPU wählt Position " + pos + "!");
            board[pos] = CPU; // set CPU's move
            printBoard();
            if (isOver(CPU))
                break;
            pos = getPlayerMove("An welcher Stelle wollen Sie setzen (0 - 8)?");
            board[pos] = PLAYER;
            System.out.println("Sie haben Position " + pos + " gewählt!");
            printBoard();
            if (isOver(PLAYER))
                break;
        }
        System.out.println("ENDE");
    }

    private static int getCpuMove() {
        if (isBoardFull())
            throw new IllegalAccessError("Board is full you can't get CPU's move!");
        int pos = -1;
        do { // creating random number in between 0 - 8
            pos = random.nextInt(BOARD_DIM * BOARD_DIM);
        } while (board[pos] != EMPTY); // check's if random position isn't occupied
        return pos;
    }

    private static int getPlayerMove(String label) { // reads number 0-8 from the console.
        int pos = -1;
        do {
            pos = inputNumber(label);
            if (board[pos] != EMPTY)
                System.out.println("Ungültige Eingabe! Ihre gewählte Position ist bereits besetzt!");
        } while (board[pos] != EMPTY);// new input if Position is already used
        return pos;
    }

    private static int inputNumber(String label) {
        int number = 0;
        boolean ok = false;
        do {
            try {
                System.out.print(label + ": ");
                number = Integer.parseInt(input.next());
                ok = true;
            } catch (NumberFormatException e) {
                System.err.println("Bitte nur ganze Zahlen eingeben!");
            }
        } while (!ok);
        return number;
    }

    private static boolean isBoardFull() {
        for (Character c : board) {
            if (c.equals(EMPTY))
                return false;
        }
        return true;
    }

    private static boolean isColumnWin(int col, char player) {
        for (int pos = 0; pos < BOARD_DIM; pos++) {
            if (board[pos * BOARD_DIM + col] != player)
                return false;
        }
        return true;
    }

    private static boolean isDiagonalWin(char player) {
        if (board[4] != player)
            return false;
        return (board[0] == player && board[8] == player) || (board[2] == player && board[6] == player);
    }

    private static boolean isOver(char player) {
        if (isWin(player)) { // checks for current player's win
            System.out.println((player == CPU ? "CPU" : "Spieler") + " hat gewonnen!");
            return true;
        }
        if (isBoardFull()) {
            System.out.println("Unetschieden!!");
            return true;
        }
        return false;
    }

    private static boolean isRowWin(int row, char player) {
        for (int pos = 0; pos < BOARD_DIM; pos++) {
            if (board[row * BOARD_DIM + pos] != player)
                return false;
        }
        return true;
    }

    private static boolean isWin(char player) {
        for (int pos = 0; pos < BOARD_DIM; pos++) {
            if (isColumnWin(pos, player))
                return true;
            if (isRowWin(pos, player))
                return true;
        }
        return isDiagonalWin(player);
    }

    public static void printBoard() {
        for (int y = 0; y < BOARD_DIM; y++) {
            int lineStart = y * BOARD_DIM;
            System.out.print(lineStart + "-" + (lineStart + 2) + " >> [");
            for (int x = 0; x < BOARD_DIM; x++)
                System.out.print(board[lineStart + x]);
            System.out.println("]");
        }
    }

    public static void resetBoard() { // initiating and declaring board values as own method
        for (int i = 0; i < board.length; i++)
            board[i] = EMPTY;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Anfänger braucht Hilfe - Stecke beim Lernen fest Java Basics - Anfänger-Themen 10
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
_Zabuza_ Erste Schritte Wie am effektivsten Java lernen als Anfänger? Java Basics - Anfänger-Themen 12
T Roulette für Anfänger Java Basics - Anfänger-Themen 7
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
K Java Anfänger Java Basics - Anfänger-Themen 5
F Hilfe für einen Anfänger! Java Basics - Anfänger-Themen 4
S Ein Java Anfänger braucht Hilfe Java Basics - Anfänger-Themen 5
P Übungsaufgaben für Anfänger? Java Basics - Anfänger-Themen 2
Z Unklarheit bei Übungsaufgabe [Anfänger] Java Basics - Anfänger-Themen 22
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
CT9288 Mini Anfänger-Problem mit loops, statements und ; Java Basics - Anfänger-Themen 4
F Hilfe, bin Anfänger! Java Basics - Anfänger-Themen 4
R Erste Schritte Materialien für Java-Anfänger Java Basics - Anfänger-Themen 7
Koookie Kleines Frage - Antwort Programm (Anfänger) Java Basics - Anfänger-Themen 5
F Studium aufgabe ...Anfänger sucht hilfe :D Java Basics - Anfänger-Themen 24
F Anfänger braucht Hilfe :) Java Basics - Anfänger-Themen 3
F Abrechnungsprogramm erstellen Student (Anfänger) Java Basics - Anfänger-Themen 2
D Anfänger braucht Hilfe Java Basics - Anfänger-Themen 2
J Musikplayer zu schwer für Anfänger? Java Basics - Anfänger-Themen 3
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
V Erste Schritte Anfänger: Ausführen eines Java-Programms Java Basics - Anfänger-Themen 5
Textsurfer Methoden Anfänger * Java Basics - Anfänger-Themen 5
G Ein paar Anfänger Fragen zu StdDraw Java Basics - Anfänger-Themen 4
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
C verwirrter Anfänger Java Basics - Anfänger-Themen 6
L Verzinsungsprogramm (Java-Anfänger) Java Basics - Anfänger-Themen 3
T Datentypen enum static Chaos (blutiger anfänger) Java Basics - Anfänger-Themen 5
I if/else Statements Java Anfänger Java Basics - Anfänger-Themen 14
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
H Schleifen (anfänger) Java Basics - Anfänger-Themen 13
H Methoden Bluej Anfänger Java Basics - Anfänger-Themen 13
M Erste Schritte Einfache Aufzugssteuerung programmieren - Anfänger Java Basics - Anfänger-Themen 2
D Anfänger-Problem mit dem HalloWelt-Programm Java Basics - Anfänger-Themen 5
S Compiler-Fehler Anfänger sucht Hilfe. Fehler beim Compilieren Java Basics - Anfänger-Themen 6
V Erste Schritte Java-Anfänger braucht Hilfe bei Arrays Java Basics - Anfänger-Themen 19
V Array mit Zufallszahlen - Anfänger - Hilfe Java Basics - Anfänger-Themen 12
J Anfänger hat Problem mit seinen Beet Java Basics - Anfänger-Themen 12
D Compiler-Fehler Anfänger Fehlermeldung Java Basics - Anfänger-Themen 3
das_leon if als Auswahl (Anfänger) Java Basics - Anfänger-Themen 1
N Anfänger Problem Java Basics - Anfänger-Themen 4
GoodGuy [Anfänger] Kann mal wer drüber gucken? Java Basics - Anfänger-Themen 3
R Erste Schritte Anfänger Probleme bei AnimationDrawable Java Basics - Anfänger-Themen 0
J Kleiner Taschenrechner! Anfänger braucht Hilfe :( Java Basics - Anfänger-Themen 2
C Taxiwarteschlange - Anfänger Java Basics - Anfänger-Themen 2
J Fehlermeldung : cannot invoke char(at) int on the primitive type int --- Anfänger Java Basics - Anfänger-Themen 5
I Java, Application, Eclipse (Anfänger) Java Basics - Anfänger-Themen 1
M Java Anfänger - Video Tutorial Reihe (DEUTSCH) Java Basics - Anfänger-Themen 11
C Anfänger: Array + Klasse Java Basics - Anfänger-Themen 5
S OOP Uhrenanzeige programmieren, Achtung Anfänger! Java Basics - Anfänger-Themen 9
B Compiler-Fehler Ein Java-Eclipse-Anfänger geht auf Reisen... Java Basics - Anfänger-Themen 10
A 2 kurze Anfänger fragen Java Basics - Anfänger-Themen 6
I totaler Anfänger braucht Hilfe Java Basics - Anfänger-Themen 8
I Erste Schritte Bücher für Jungedliche[Anfänger] Java Basics - Anfänger-Themen 20
T Hallo anfänger braucht Hilfe :D Java Basics - Anfänger-Themen 7
C Anfänger Anfänger Fragen Java Basics - Anfänger-Themen 8
P [ANFÄNGER] if else funktioniert nicht Java Basics - Anfänger-Themen 4
A Anfänger Taschenrechner Frage Java Basics - Anfänger-Themen 14
D error: Class names, >>>HILFE, anfänger<<< Java Basics - Anfänger-Themen 4
J Hilfe für Anfänger Java Basics - Anfänger-Themen 8
E OOP Methode an andere Methode übergeben / OOP Anfänger Java Basics - Anfänger-Themen 4
Farbenfroh Exceptions Anfänger - Finde Fehler nicht Java Basics - Anfänger-Themen 7
H MergeSort (für Anfänger ) Java Basics - Anfänger-Themen 9
X Projekt Java Anfänger Java Basics - Anfänger-Themen 28
C Fehlersuche Adressbuch *Anfänger* Java Basics - Anfänger-Themen 5
C Anfänger braucht Hilfe bei Schularbeit Java Basics - Anfänger-Themen 3
J Erste Schritte Hilfe bei absolutem Anfänger-Projekt Java Basics - Anfänger-Themen 4
F Anfänger braucht Hilfe Java Basics - Anfänger-Themen 24
A Erste Schritte Übungen für Anfänger Java Basics - Anfänger-Themen 31
M Sieb des Eratosthenes für Anfänger Java Basics - Anfänger-Themen 10
M Tipps für einen Java-Anfänger Java Basics - Anfänger-Themen 5
S Anfänger Aufgaben Java Basics - Anfänger-Themen 6
G Anfänger-Errors und Fragen Java Basics - Anfänger-Themen 22
S Java für Anfänger: Probleme mit read() Java Basics - Anfänger-Themen 20
P [Anfänger] DiceGame Aufagbe Java Basics - Anfänger-Themen 23
C Input/Output Anfänger Array-Verständnis Frage Java Basics - Anfänger-Themen 7
W Erste Schritte OOP-Lektüre für Anfänger/Umsteiger von Clipper auf Java Java Basics - Anfänger-Themen 6
J Welches Java-Videotutorial für Anfänger empfehlenswert? Java Basics - Anfänger-Themen 7
F Java-Anfänger, brauche Hilfe Java Basics - Anfänger-Themen 3
F Java-Anfänger, brauche Hilfe Java Basics - Anfänger-Themen 2
P Java anfänger tutorial gesucht Java Basics - Anfänger-Themen 12
P Viereck mit Sterne - Anfänger bittet um Kritik und Anregung Java Basics - Anfänger-Themen 11
B Java für Anfänger Java Basics - Anfänger-Themen 7
T Bin Anfänger ... das Thema auch ? Java Basics - Anfänger-Themen 10
K Erste Schritte quelltext hilfe anfänger Java Basics - Anfänger-Themen 8
pg1337 Übungsaufgabe für Anfänger Java Basics - Anfänger-Themen 26
S Algorithmen für Anfänger Java Basics - Anfänger-Themen 18
F Anfänger Probleme Java Basics - Anfänger-Themen 12
L Klassen Anfänger braucht Hilfe! Probleme mit Javakara.jar Java Basics - Anfänger-Themen 25
R Java-Anfänger-Projekt-Begleiter gesucht Java Basics - Anfänger-Themen 18
J Vererbung Anfänger Programm bitte um Kritik&Anregungen Java Basics - Anfänger-Themen 21
K Anfänger If / Else Problem Java Basics - Anfänger-Themen 5
K Kleines Anfänger Problem bei der Abfrage Java Basics - Anfänger-Themen 8
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
M Erste Schritte Anfänger braucht Denkanstoß für Schulprojekt Java Basics - Anfänger-Themen 21
F Klassen Bibliothek erstellen für Anfänger Java Basics - Anfänger-Themen 8
T Collections Java Anfänger - Array-Struktur vollkommen unklar Java Basics - Anfänger-Themen 2
Spin Einfache Anfänger Frage setVisible von Panels Java Basics - Anfänger-Themen 5
K Java Anfänger und paar Fragen=D Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Anzeige

Neue Themen


Oben