Tic Tac Toe

  • VB6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Tic Tac Toe

    Hey Leute,

    Hab mal wieder ein Problem 8)

    Undzwar:

    Aufgabenstellung ist ein "TicTacToe"-Spiel (Das mit Kreuz und Kreis setzten und wer drei in einer reihe hat gewinnt.

    Jetzt ist die Frage folgende:
    Wie mach ich das das der PC als gegner sich die bestmögliche lösung raussucht?
    Der Random Befehl ist mir bekannt aber dann ist es ja zu einfach weil der PC wahrlos, ohne sinn und verstand irgendwelche plätze belegt.
    währe nett wenn mir jemand da auf die sprünge helfen könnte oder wenn sogar jemand dazu schon einen code fertig haben sollte den vllt. postet.

    Danke im Voraus

    MfG
    IT-Assi
    Der erste Zug geht immer in die Mitte.

    Es ist ähnlich wie beim Schach. Du musst jeden möglichen Zug bewerten, indem du die darauf folgenden (auch die des Gegners) durchspielst.Den Zug mit der besten Bewertung führst du aus. Hast du Mehrere gleich bewertet, dann darf der Zufallsgenerator ran.

    Oder du führst eine Datenbank, bei welcher Stellung mit welchem Zug gewonnen und verloren wurde. So wird dein Programm immer Spielstärker.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Du musst alle möglichen Zugmöglichkeiten durchgehen und bewerten. Dadurch erhälst du eine Art Baum-Struktur, wo du dann den Weg mit der besten Bewertung auswählst. Ein "Zweig" in diesem Baum könnte so aussehen: (CPU spielt B2, Spieler dann A1, CPU dann A3, Spieler dann A2, CPU dann C1 und gewinnt, Bewertung = eine hohe Zahl da Spiel gewonnen) Um dies zu realisieren, brauchst du für den Baum verschachtelte Arrays und eine rekursive Funktion die jeden Knoten vom Baum durchläuft bis das Spiel zuende ist und dann mit dem nächsten Knoten weitermacht. Dies ist das gleiche Prinzip wie bei einem herkömmlichen Auto-Routen-Planer, welcher die kürzeste oder schnellste Strecke herausfindet.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hi!

    Die verschachtelten Arrays sind wieder ne tolle Idee :D
    In VB6 kann man keinen Array von nem Array machen (außer über UDTs)

    Du müsstest das so machen, dass der Computer jeden möglichen Spielzug versucht. Und dann jeden Möglichen des Spielers simuliert, dann wieder jeden möglichen vom Computer bis das Spielfeld voll ist. Nachher bekommst du eine Liste von Ergebnissen. Der Spielzug, wo die meisten gewonnen wurden, den nimmt er dann.


    so long...
    Andy

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    zitat wikipedia.de:

    "Für Tic Tac Toe gibt es 255.168 verschiedene Spielverläufe, von denen 131.184 mit einem Sieg des ersten Spielers enden, 77.904 mit einem Sieg des zweiten Spielers und 46.080 mit einem Unentschieden"

    wie soll ich das denn alles in eine schleife programmieren?
    das ist ja viel zu krass...
    255.000 auf einem 3x3 Feld? Da es ja nur 9 Felder gibt hast du "nur" eine Rechentiefe von höchstens 9 Zügen, erst bei Schach wird es lustiger...
    Wegen verschachtelte Arrays: um es sauber zu programmieren würde ich zu Klassen raten (classTree, classNode, classTicTacToe). Wobei ein Node-Objekt viele Unternodes haben kann.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    schon richtig mit dem 3x3 feld. aber es gibt 255xxx pielverläufe, niht verschiedene züge. das minte ich damit.

    also ie gesagt von arrays in vb hab ich eh noch wenig ahnung, und dann gleich verschatelt oder in klassen unerteilt, das sagt mir null.

    ich hab jetzt mal so angefangen:

    9Var. für maximal 9Züge erstellt.
    ein Tic Tac Toe spielfeld eingelesen und in jedes der 9 Felder ein "x" eine "0" und ein Label gelegt. Alles 3 Invisible gemacht.

    dann will ich jetzt coden das der computer, wenn der spieler z.b. auf label 1 (links oben) klickt auch links oben das entsprechende zeichen ("x") erscheint.
    Als 2. Zug kommt dann Spieler 2 (nicht pc) gleiches chema wie oben.

    Wenn das Realisiert ist werde ich mich am PCals gegenspieler versuchen.
    undzwar folgendermaßen:
    Als 2. zug kommt der PC. Ich hab mir jetzt gedacht ich mach das erstmal mit dem random befehl, ist zwar nicht die professionellste lösung aber besser als nichts.

    Also auf einen neuen versuch ^^

    MfG
    Hi!

    2 PictureBoxen machen, eine mit O und eine mit X (picO und picX als Name), dann 9 Pictureboxen für die einzelnen Felder.

    Für "Berechnungen", die dahinter stecken verwendest du am Besten ein 2D-Array: 0 = leer, 1 = Spieler1, 2 = Spieler2

    Visual Basic-Quellcode

    1. '[DATEI-BEGINN]
    2. Option Explicit
    3. 'Eine Aufzählung von Werten, die in nem Feld drinen sein können
    4. 'Array mit den Feldern, jedes Feld kann einen der o.g. Werte annehmen
    5. Private Fields(0 to 2, 0 to 2) as FieldTypes
    6. '[ALLGEMEINE VARIABLEN]
    7. Private ActivePlayer as Byte 'welcher Spieler ist am Zug?
    8. Private RoundNr as Byte 'welcher Spielzug ist jetzt?
    9. '[PROZEDUREN]
    10. 'Diese aufrufen um ein neues Spiel zu starten
    11. Private Sub NewGame()
    12. Dim i as Integer, j as Integer
    13. 'Alle Felder leeren
    14. For i = 0 to 2
    15. For j = 0 to 2
    16. Fields(i, j) = 0
    17. Next j
    18. Next i
    19. ActivePlayer = 1 'Anfangsspieler auswählen
    20. RoundNr = 1
    21. End Sub


    Im Form_Load oder beim Click auf neues Spiel musst du jetzt NewGame aufrufen.
    Beim Klick auf eine Picturebox prüfen, ob das Feld (im Array) = 0 ist, wenn ja, musst du ActivePlayer eintragen und ActivePlayer ändern.
    Jedes mal RoundNr um eins erhöhen, wenn sie 10 erreicht hat ist das Spiel zu Ende.


    so long...
    Andy

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

  • Benutzer online 1

    1 Besucher

  • 3 Benutzer haben hier geschrieben