Problem wurde noch nicht gelöst, musste aber abgebaut werden.Überprüfen Sie für Winner Tic Tac Toe Spiel Java
Antwort
Du bist gerade nicht, wenn der „Computer“ gewonnen, wenn der Computer nur knapp sein Ziel hat, und Spieler entweder, dann können Sie die tieGame Flagge wahr
Das Problem ist dieser Ausdruck in der if-Anweisung drehen:
GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player &&
GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player &&
GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player
Sie überprüfen, ob der Spieler in jeder Brettposition ist.
Sie möchten feststellen, dass es keinen Gewinner gab. Das bedeutet, dass keine der Zeilen, Spalten und Diagonalen den gleichen Spieler hat.
aber ich habe wenn man diagonal, row und column gewinnt, also die letzte möglichkeit ist, wenn alle plätze dort eingenommen sind wurde noch kein gewinner deklariert weil die anderen if-statements es nicht erwischt haben, deshalb muss es keine geben Gewinner und es ist ein Gleichstand Spiel? Macht das Sinn, ich weiß nicht, vielleicht ist meine Logik fehlerhaft. –
@JaneDoe Sie können eine Bindung noch früher erkennen. Wenn es in jeder Reihe, Spalte und Diagonale ein X und ein O gibt, ist das Spiel gebunden. – 4castle
Überprüfen Sie dies: http://StackOverflow.com/A/24376236/315017 –
Ändern Sie zu GameBoard[0][0] != 0
für alle 9 Bedingungen.
Der Fehler ist im Hauptcode/Struktur der Funktion. Deine Funktion muss zwei Variablen zurückgeben, Finalwinner und Tie-Spiel. Im Moment stoppt Ihre Funktion bei der ersten return-Anweisung und setzt diese im Prinzip auf finalwinner.
versuchen, etwas wie folgt aus:
public static boolean[] CheckForWinner(int player)
{
//Row and Column Check
if (GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player ||
GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player ||
GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player ||
GameBoard[0][0] == player && GameBoard[1][0] == player && GameBoard[2][0] == player ||
GameBoard[0][1] == player && GameBoard[1][1] == player && GameBoard[2][1] == player ||
GameBoard[0][2] == player && GameBoard[1][2] == player && GameBoard[2][2] == player)
{
boolean finalwinner=true;
}
//diagonal checks
if (GameBoard[0][0]==player && GameBoard[1][1]==player && GameBoard[2][2]==player)
{
boolean finalwinner=true;
}
if (GameBoard[2][0]==player && GameBoard[1][1]==player && GameBoard[0][2]==player)
{
boolean finalwinner=true;
}
//Tie Game Check
if (GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player &&
GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player &&
GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player)
{
boolean tieGame=true;
}
return new boolean [] {finalwinner, tiegame};
}
public static void main (String[] args)
{
System.out.println("Tic Tac Toe Game");
System.out.println("Player 1 is 1, Computer is 2");
Draw();
currentplayer=1;
while (winner!= true)
{
if(currentplayer==1)
{
System.out.println("Your Turn");
Player1Turn(currentplayer);
}
else
ComputerTurn(currentplayer);
boolean result[] = CheckForWinner(currentplayer);
if(result[0]==true && result[1]==false)
{
System.out.println("Winner is Player" +currentplayer+ "Congrats Champion!");
System.out.println("Beginning New Game! Press Cancel then Enter to Exit");
Reset();
}
if(result[1]==true)
{
System.out.println("It's a Tie! Play Again.");
System.out.println("Beginning New Game! Press Cancel then Enter to Exit");
Reset();
}
if(currentplayer==1)
currentplayer=2;
else if(currentplayer==2)
currentplayer=1;
}
}
BTW, ich denke, Ihre Logik in der CheckForWinner-Funktion ist genau. –
Wie schlägst du vor, ich repariere es? –
http://stackoverflow.com/questions/2832472/how-to-return-2-values-from-a-java-function –
EDIT: Info on enums
Dies ist wahrscheinlich nicht das, was Sie bevorzugen würden, aber ich empfehle gehen Sie für einen anderen Zug/Board Darstellung:
WIE
Erstens, ich schlage vor, Sie implementieren Ihre Board-Zellen als enums (sin ce gibt es nur 9 von ihnen).
Dann implementieren die Platine als ein Satz von 9 Aufzählungen, die als solche:
public enum Move {
A0, A1, A2, B0, B1, B2, C0, C1, C2; }
Auch implementieren Muster (zB eine ganze Linie, eine ganze diagonal) als Gruppen von 3 enums gewinnen (dh eine Teilmenge der Tafel).
Nach diesen Änderungen wird es viel einfacher zu überprüfen, ob ein Spieler (sei es du oder der Computer) gewonnen hat.
Ich empfehle Ihnen, die Teilmengen und die Methode hinzuzufügen, die prüft, ob ein Spieler auch innerhalb der Move-Klasse gewonnen hat.
Eine Teilmenge kann wie folgt erstellt werden: z.
static private final EnumSet<Move> lineA = EnumSet.of(A0,A1,A2);
Und ein Scheck von Ihrem gewonnen Methode (beachten Sie für alle Untergruppen überprüfen müssen) könnte möglicherweise sein:
moves.containsAll(lineA)
wo bewegt sich der Satz von Bewegungen durch Spieler (wenn ein Spieler macht aus eine Bewegung, die du die Enum zu seinen Bewegungen addierst).
WARUM
Dieser Entwurf prägnanter, einfach und elegant ist. Sie sollten die beschriebenen Probleme nicht mehr erleben, wenn Sie diesen Ansatz verwenden.
i ziemlich einfach bin, wenn es um Java geht, bin ich ein Anfänger noch damit ich Ich weiß nicht, was Enums sind, also habe ich ein 2d-Array verwendet! –
Dann verweise ich Sie auf https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html. Enums sind der bessere Ansatz in Ihrem Fall, also wenn ich Sie wäre, würde ich die 10-15 Minuten dauern, die erforderlich sind, um über enums für Ihre Lösung zu lesen und zu implementieren. –
Zuerst, in Ihrer Hauptmethode sagen Sie finalwinner=CheckForWinner(currentplayer);
, so dass Sie finalwinner=true;
nicht jedes Mal nach Überprüfung der Zeile, Spalte und Diagonale setzen müssen. return true;
ist genug.
Ihr Problem ist, überprüfen Sie für eine Krawatte Spiel, und wenn es der Fall ist, können Sie auch true zurück, aber es ist falsch, weil keiner der beiden Spieler noch Computer gewinnt! So Ihre checkForWinner Methode immer kehrt wahr.
Sie haben nicht wirklich für Tie Spiel Extra zu überprüfen. Überprüfen Sie den Gewinn für den Spieler, checken Sie den Gewinn für den Computer, wenn beide falsch sind und der letzte Zug ist erledigt - es ist ein Unentschieden.
- 1. TIC TAC TOE SPIEL - Python
- 2. Libgdx Tic Tac Toe Spiel
- 3. Javascript Tic Tac Toe Spiel wartet Benutzereingabe
- 4. Javascript Tic Tac Toe
- 5. NodeJS Tic Tac Toe Multiplayer Spiel
- 6. Einfache Tic-Tac-Toe AI
- 7. Q Lernalgorithmus für Tic Tac Toe
- 8. Tic-Tac-Toe in VHDL
- 9. Probleme beim Neustart Logik Tic Tac Toe Spiel (JavaScript)
- 10. Codierung eine Krawatte in Tic Tac Toe
- 11. Algorithmus zur Implementierung von Tic Tac Toe Spiel?
- 12. Tic Tac Toe checkgewinner gratis pascal
- 13. Verschachtelte Funktion funktioniert nicht - Tic Tac Toe Spiel
- 14. Fix meine Tic Tac Toe Spiel in Visual Basic 2005
- 15. C# Tic Tac Toe Konsole App
- 16. Tic Tac Toe mit Alpha-Beta-Prunning in Java
- 17. C++ Tic Tac Toe mit Klassen
- 18. Einen Einzelspieler bauen Tic-Tac-Toe
- 19. Ändern einer Do While-Schleife zu einer While-Schleife in einem Tic Tac Toe-Spiel
- 20. Tic-Tac-Toe Spiel wechselt nicht die Spieler, aktualisiert den Spielstand oder wechselt die Spieler
- 21. Fehler in Minimax-Algorithmus für Tic Tac Toe
- 22. Javascript Tic Tac Toe - Winning Funktion nicht aufrufen/arbeiten
- 23. Logische Fehler, Suche nach einem Gewinner in Tic Tac Toe
- 24. Tic-Tac-Toe, um nach einem Gewinner zu suchen
- 25. Tic Tac Toe mit Builder 6 Anwendungen Formular
- 26. C++ - Basic Tic-Tac-Toe Programm druckt leeren Bildschirm
- 27. Javascript Tic Tac Toe Spiel wird nicht für diagonale Gewinner validieren
- 28. Brauchen Sie Hilfe beim Einfügen von Tasten in Tic Tac Toe Spiel
- 29. Probleme Positionierung Layouts zu Tic Tac Toe App - vom Bildschirm
- 30. Haskell - wie nächste Schritt in Tic Tac Toe-Spiel mit Liste Monade
Dieser Code könnte von einigen "for" -Schleifen profitieren. Das ist viel zu wiederholend. – 4castle
i vor für Schleifen hatte, aber es war nicht funktioniert und nach so lange versucht, habe ich ein ständiger für if-Anweisungen Das einfachste Modell eines TicTacToe Board –
ist ein 9-Slot-Array. Die Verwendung einer 2-d-Array-Version ist eine unnötige Komplexität. Denkanstoß. –