TicTacToe Enumerations-Feldvariable in Kurzform vergleichen?

  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    TicTacToe Enumerations-Feldvariable in Kurzform vergleichen?

    Hallo,

    ich arbeite gerade an einem winzigen TicTacToe. Ich hatte versucht mit diesem Quellcode schnell und direkt herauszubekommen, ob und wer gewonnen hat:
    Spoiler anzeigen

    Quellcode

    1. public FieldState[,] spielFeld = new FieldState[3,3]; // Das Spielfeld
    2. public FieldState gewonnen()
    3. {
    4. return
    5. // Vertikale überprüfen
    6. spielFeld[0, 0] == spielFeld[0, 1] == spielFeld[0, 2] ||
    7. spielFeld[1, 0] == spielFeld[1, 1] == spielFeld[1, 2] ||
    8. spielFeld[2, 0] == spielFeld[2, 1] == spielFeld[2, 2] ||
    9. // Horizontale überprüfen
    10. spielFeld[0, 0] == spielFeld[1, 0] == spielFeld[2, 0] ||
    11. spielFeld[0, 1] == spielFeld[1, 1] == spielFeld[2, 1] ||
    12. spielFeld[0, 2] == spielFeld[1, 2] == spielFeld[2, 2] ||
    13. // Diagonalen überprüfen
    14. spielFeld[0, 0] == spielFeld[1, 1] == spielFeld[2, 2] ||
    15. spielFeld[2, 0] == spielFeld[1, 1] == spielFeld[0, 2];
    16. }
    17. public enum FieldState
    18. {
    19. Player1,
    20. Player2,
    21. None
    22. }

    nur leider geht das nicht, weil das ein Gequirle aus bool und FieldState wird:
    Der Operator "==" kann nicht auf Operanden vom Typ "bool" und "FieldState" angewendet werden.

    Jedoch wollte ich nicht einfach alles Ausschreiben. Deshalb frage ich jetzt ob es nicht eine Lösung gibt, die nicht ganz so viel mehr ist? Und ja ich weiß, er wird mir sofort ausgeben, dass "None" gewonnen hat. :S

    Vielen Dank im Voraus!
    Valerian
    Kann es sein, dass du irgendwo eine Funktion verwendest, die man anders lösen müsste?
    Wahrscheinlich bekommst du irgendwo einen boolschen Wert zurückgeliefert (ohne den Code gesehen zu haben)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    So geht das nicht, es führt wohl kein Weg daran vorbei, jedes Feld einzeln zu prüfen und das mit && zu verknüpfen.
    Du kannst es dir aber insofern vereinfachen, dass du mit einer Schleife jeden Spieler (und auch None) prüfen kannst, statt für jeden Spieler den ganzen Block zu kopieren.
    Architekturtechnisch gesehen sollte None übrigens der erste Wert im Enum sein und None kann auch eine gültige Rückgabe sein, in diesem Fall ist es nämlich unentschieden.
    Schau dir mal das an:

    VB.NET-Quellcode

    1. Public Shared Function AllEqual(ParamArray objects() As Object) As Boolean
    2. Return objects.All(Function(o) o.Equals(objects(0)))
    3. End Function
    4. Public Enum FieldState
    5. Player1
    6. Player2
    7. None
    8. End Enum
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. MessageBox.Show(AllEqual(FieldState.None, FieldState.None, FieldState.None).ToString)
    11. MessageBox.Show(AllEqual(FieldState.Player1, FieldState.None, FieldState.None).ToString)
    12. End Sub

    Ist zwar VB, sollte sich aber leicht in C# überetzen lassen. :).
    Überleg mal ganz lange, was Du hier zum Ausdruck bringen möchtest und was Du zum Ausdruck gebracht hast.

    Gelöschter Benutzer schrieb:

    Quellcode

    1. spielFeld[0, 0] == spielFeld[0, 1] == spielFeld[0, 2] ||
    2. spielFeld[1, 0] == spielFeld[1, 1] == spielFeld[1, 2] ||
    3. spielFeld[2, 0] == spielFeld[2, 1] == spielFeld[2, 2] ||
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hmm ok... dann muss es wohl doch die ausführliche Variante sein...
    Ich hab es jetzt so gelöst:
    Spoiler anzeigen

    Quellcode

    1. public FieldState gewonnen()
    2. {
    3. if (// Vertikale überprüfen
    4. FieldState.Player1 == spielFeld[0, 0] && spielFeld[0, 0] == spielFeld[0, 1] && spielFeld[0, 1] == spielFeld[0, 2] ||
    5. FieldState.Player1 == spielFeld[1, 0] && spielFeld[1, 0] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[1, 2] ||
    6. FieldState.Player1 == spielFeld[2, 0] && spielFeld[2, 0] == spielFeld[2, 1] && spielFeld[2, 1] == spielFeld[2, 2] ||
    7. // Horizontale überprüfen
    8. FieldState.Player1 == spielFeld[0, 0] && spielFeld[0, 0] == spielFeld[1, 0] && spielFeld[1, 0] == spielFeld[2, 0] ||
    9. FieldState.Player1 == spielFeld[0, 1] && spielFeld[0, 1] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[2, 1] ||
    10. FieldState.Player1 == spielFeld[0, 2] && spielFeld[0, 2] == spielFeld[1, 2] && spielFeld[1, 2] == spielFeld[2, 2] ||
    11. // Diagonalen überprüfen
    12. FieldState.Player1 == spielFeld[0, 0] && spielFeld[0, 0] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[2, 2] ||
    13. FieldState.Player1 == spielFeld[2, 0] && spielFeld[2, 0] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[0, 2])
    14. return FieldState.Player1;
    15. if (// Vertikale überprüfen
    16. FieldState.Player2 == spielFeld[0, 0] && spielFeld[0, 0] == spielFeld[0, 1] && spielFeld[0, 1] == spielFeld[0, 2] ||
    17. FieldState.Player2 == spielFeld[1, 0] && spielFeld[1, 0] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[1, 2] ||
    18. FieldState.Player2 == spielFeld[2, 0] && spielFeld[2, 0] == spielFeld[2, 1] && spielFeld[2, 1] == spielFeld[2, 2] ||
    19. // Horizontale überprüfen
    20. FieldState.Player2 == spielFeld[0, 0] && spielFeld[0, 0] == spielFeld[1, 0] && spielFeld[1, 0] == spielFeld[2, 0] ||
    21. FieldState.Player2 == spielFeld[0, 1] && spielFeld[0, 1] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[2, 1] ||
    22. FieldState.Player2 == spielFeld[0, 2] && spielFeld[0, 2] == spielFeld[1, 2] && spielFeld[1, 2] == spielFeld[2, 2] ||
    23. // Diagonalen überprüfen
    24. FieldState.Player2 == spielFeld[0, 0] && spielFeld[0, 0] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[2, 2] ||
    25. FieldState.Player2 == spielFeld[2, 0] && spielFeld[2, 0] == spielFeld[1, 1] && spielFeld[1, 1] == spielFeld[0, 2])
    26. return FieldState.Player2;
    27. return FieldState.None;
    28. }

    Ist halt ein großer Textblock aber trotzdem noch recht übersichtlich ;)

    Trotzdem vielen Dank!
    Valerian