TicTacToe

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von FAtheone.

    Hallo @ all

    Ich möchte gerne TicTacToe programieren. Dazu habe ich mir folgendes überlegt:

    Ich nehme ein 2 demensionales Array (3x3) und trage für den Spieler die Zahl 1 und für den Computer eine 2 ein - jenachdem wo halt gesetzt wurde. Das ist soweit auch kein Problem. Ich möchte jetzt gerne das der Computer logisch setzt. Also er soll sehen wann er eine Reihe voll machen kann und zweitrangig der Spieler eine Reihe voll machen könnte.

    Dies könnte man natürlich mit ganz vielen IF Abfragen lösen aber dazu bin ich zu faul :D Das kann man doch auch bestmmt irgendwie anders lösen oder? Nur fällt mir gerade leider nichts ein wie es gehen könnte. Habt ihr vllt eine Idee?

    Hoffe auf eure Hilfe. Viele Grüße
    Croasider

    Croasider schrieb:

    2 demensionales Array (3x3) und trage für den Spieler die Zahl 1 und für den Computer eine 2 ein

    Gut - wenigstens mal jemand der die Darstellung von der internen Repräsentation trennt.

    Croasider schrieb:

    Also er soll sehen wann er eine Reihe voll machen kann und zweitrangig der Spieler eine Reihe voll machen könnte

    Das nennt sich ein Bewertungssystem: eine mögliche Bewertung wäre die maximale Anzahl 1er bzw. 2er die ein Spieler in einer Reihe hat. Wenn dieser maxWert auf 3 ist hat der entsprechende Player gewonnen.

    Noch ein kleiner Zusatztip: für so eine Computer Simulation ist ein rekursives Verfahren ideal

    Croasider schrieb:

    Kenne Rekursion nur darunter das siche ine Funktion selbst aufruft

    So funktioniert das auch bei Spielsimulationen, wo Du und der Gegner abwechseln am Zug sind und Du einen möglichst guten Zug ermitteln willst.

    Der beste Zug ist definiert als der mit der besten Bewertung die Du erreichen kannst, wenn Dein Gegner sich optimal wehrt, also auch möglichst gute Züge ausführt.

    1. dazu machst Du irgendeinen Zug, bewertest das Ergebnis und drehst das Spielfeld um.
    2. jetzt macht der Gegner seinen besten Zug
    3. Spielfeld wieder umdrehen und Du bist wieder an der Reihe
    Abgebrochen wird, wenn entweder Du oder Dein Gegner siegen oder keine Züge mehr möglich sind. Dann wird die nächste Alternative ausprobiert.

    Wie wolltest Du denn Deine "Strategie" festlegen ?
    Zunächsteinmal einige Hilfsklassen und Strkturen:

    VB.NET-Quellcode

    1. 'Zustand der Felder. Hierbei ist es egal, ob CPU vs. Player oder Player vs. Player oder CPU vs. CPU spielen
    2. Public Enum FldState As Integer
    3. Empty
    4. PlayerO
    5. PlayerX
    6. End Enum
    7. 'Spieler art (Für den Logik-Teil)
    8. Public Enum PlayerType As Integer
    9. None 'Keiner/ Initialisierungswert
    10. Player 'User Input
    11. CPU_Easy 'Zufall
    12. CPU_Medium 'Schliesst eigene 3er und Blockiert Gegnerische
    13. CPU_Hard 'Versucht Zwickmühlen
    14. CPU_Indestructible 'Wendet die unbesiegbare Strategie an
    15. End Enum
    16. Dim fld(2,2) As FldState
    17. 'CPU Feldprioritäten. Höher = Besser, Werden gesetzt
    18. Dim cpuPriority(2,2) As Integer
    19. Dim plOt As PlayerType = PlayerType.None 'Spieler O ist ein ...
    20. Dim plXt As PlayerType = PlayerType.None ' - " - X - " -
    21. 'Logik (Sub, Eventgesteuert)
    22. 'Parameter: CurrPlayer As FldState (Sinnvolle Werte: PlayerX und PlayerO)
    23. Select Case CurrPlayer
    24. Case PlayerX
    25. If plXt = Player Then
    26. Else 'CPU
    27. 'Priority-Feld initialisieren
    28. Select Case plXt
    29. 'Je nach Schwierigkeitsgrad befüllen (s. Post)
    30. End Select
    31. 'Feld auswählen: Maximum des Priority-Felds bestimmen
    32. End If
    33. Case PlayerO
    34. useCPU = Not (plOt = Player)
    35. End Select


    Schwierigkeitsgrad:
    Easy: Alle ohne Mark (fld(x,y) = None) mit Prio 1, sonst Prio 0, der Zufalls-wähler nimmt dann i.eines der gültigen
    am besten direkt als Initialisierung nutzen, dann kann man den weglassen und Prio 0 ist sowieso klar.
    Medium: Prüfe auf "Zwei gleiche", eigene: Prio 3, gegnerische: Prio 2 => Win first, block second
    Hierzu:
    Spalte und Zeile immer überprüfen,
    RO-LU-Diagonale: x=y
    RU-LO-Diagonale: x+y = 2

    The rest to come...
    ich verstehe das nicht mir dem computer :) wer kann mir das mal erklären,



    möchte das sich eine Form öffnet, wo man dann entscheiden kann gegen wen man spielen will, player vs. player oder computer vs.player.

    man sollte es auch in verschiedenen schwierigkeitsstufen einstellen können...


    PrivateSub Button[Zahl es Buttons]_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button[Siehe Anfang].Click
    Form2.Show()Me.Hide()
    EndSub

    //-------------------------------------------------
    Public
    ClassForm2
    EndClass

    so was muss ich nun eingeben :(
    Geheim Code!
    Wirklich sehr geheim!
    Kann man sich aus 1000 Stellen wie ich schon gesagt habe einfach Rauskopieren!
    Und warum schickst du uns einen für dich unleserlichen Code? Ist doch Sinnlos! (Abgesehen Davon das es eh jeder hier versteht ^^)

    Echt LOL :D
    Ja ordentlich strukturierter und kommentierter Code ist nicht nur für andere wichtig auch für dich selbst.
    Ich weiss noch wie ich nach ca. einen halben Jahr meinen eigenen sehr schlechten Code lesen wollte. ^^
    Keine Chance. :)

    Man muss dazu sagen, das es mein erster Programmierter Spielecode war. (Alles ohne sprechende Variablennamen)
    Da hab ich dann auch dazugerlernt, wie es aussehen sollte. :)