Tic-Tac-Toe Künstliche Intelligenz...

  • VB6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Tic-Tac-Toe Künstliche Intelligenz...

    Ich bins mal wieder :D


    Muss euch leider schon wieder nerven :/


    Und zwar bin ich immer noch an meinem Tic-Tac-Toe dran. Die Zweispieler-Funktion läuft jetzt einwandfrei und ich bin auch mit dem Quellcode zufrieden.

    Nun möchte ich gerne ( und mein Ausbilder auch) eine KI in das Spiel einbauen.

    Ich benutze für die Gewinnmöglichkeiten 8 Arrays.
    In der Abfrage geht er dann die Arrays durch.

    Nun wollte ich die KI so proggen, dass der PC checkt ob er eine Gewinnmöglichkeit spielen kann.

    Wenn ja, dann soll er die setzen
    Wenn nein, dann soll er prüfen ob der Spieler eine Gewinnmöglichkeit in seinem nächsten Zug spielen kann.

    Wenn ja, dann soll er diese verhindern.

    Wenn nein, dann soll er eine Falle bauen. Das heißt wenn...

    X O
    O
    X

    der Fall ist soll er rechts in die Ecke ein X setzen.

    Kann er das nicht, soll er prüfen, ob der Gegenspieler eine Falle bauen kann.



    Mein Quellcode

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim intAnzahlFrei%
    3. Dim X$
    4. Dim O$
    5. Dim AGewinn(7) As String
    6. Private Sub cmdStart_Click()
    7. Dim i%
    8. ' Von 0 um größten Index ausführen
    9. For i = 0 To picAusgabe.Ubound
    10. picAusgabe(i).Enabled = True
    11. Next i
    12. 'Aktiviert den Countdown, in dem ein Spieler seine Figur setzen muss
    13. TimerSpieler.Enabled = True
    14. intAnzahlFrei = 9
    15. cmdStart.Visible = False
    16. End Sub
    17. Private Sub cmdZuruecksetzen_Click()
    18. Dim i%
    19. 'Setzt Countdown auf 30
    20. lblRestzeit.Caption = "30"
    21. TimerSpieler.Enabled = True
    22. 'Löscht die Bilder aus der Picturebox
    23. For i = 0 To picAusgabe.Ubound
    24. picAusgabe(i) = LoadPicture()
    25. Next i
    26. 'Pictureboxen sind wieder frei zum benutzen
    27. For i = 0 To picAusgabe.Ubound
    28. picAusgabe(i).Enabled = True
    29. Next i
    30. 'Pictureboxen Tag wird geleert
    31. For i = 0 To picAusgabe.Ubound
    32. picAusgabe(i).Tag = ""
    33. Next i
    34. 'Setzt die freien Felder wieder auf 9
    35. intAnzahlFrei = 9
    36. End Sub
    37. Private Sub picAusgabe_Click(Index As Integer)
    38. Dim i%
    39. Dim Y%
    40. Dim s$
    41. 'Zählt die freien Boxen runter
    42. intAnzahlFrei = intAnzahlFrei - 1
    43. 'Altes Design
    44. 'X = ("C:\Users\dhenke\Dennis Henke\Tic-Tac-Toe\x.jpg")
    45. 'O = ("C:\Users\dhenke\Dennis Henke\Tic-Tac-Toe\o.jpg")
    46. 'Neues Design
    47. X = ("C:\Users\dhenke\Dennis Henke\Tic-Tac-Toe\X_Neu.jpg")
    48. O = ("C:\Users\dhenke\Dennis Henke\Tic-Tac-Toe\O_Neu.jpg")
    49. 'Prüft welcher Spieler an der Reihe ist
    50. If lblSpieler.Caption = "X" Then
    51. picAusgabe(Index) = LoadPicture(X)
    52. 'Braucht man, damit die Boxen bei eingabe gesperrt werden
    53. picAusgabe(Index).Enabled = False
    54. 'Countdown wird wieder auf 30 gesetzt
    55. lblRestzeit.Caption = "30"
    56. picAusgabe(Index).Tag = "X"
    57. s = "X"
    58. ElseIf lblSpieler.Caption = "O" Then
    59. picAusgabe(Index) = LoadPicture(O)
    60. picAusgabe(Index).Enabled = False
    61. lblRestzeit.Caption = "30"
    62. picAusgabe(Index).Tag = "O"
    63. s = "O"
    64. End If
    65. 'Legt die Gewinnmöglichkeiten fest
    66. AGewinn(0) = picAusgabe(0).Tag = s And picAusgabe(1).Tag = s And picAusgabe(2).Tag = s
    67. AGewinn(1) = picAusgabe(3).Tag = s And picAusgabe(4).Tag = s And picAusgabe(5).Tag = s
    68. AGewinn(2) = picAusgabe(6).Tag = s And picAusgabe(7).Tag = s And picAusgabe(8).Tag = s
    69. AGewinn(3) = picAusgabe(0).Tag = s And picAusgabe(3).Tag = s And picAusgabe(6).Tag = s
    70. AGewinn(4) = picAusgabe(1).Tag = s And picAusgabe(4).Tag = s And picAusgabe(7).Tag = s
    71. AGewinn(5) = picAusgabe(2).Tag = s And picAusgabe(5).Tag = s And picAusgabe(8).Tag = s
    72. AGewinn(6) = picAusgabe(0).Tag = s And picAusgabe(4).Tag = s And picAusgabe(8).Tag = s
    73. AGewinn(7) = picAusgabe(6).Tag = s And picAusgabe(4).Tag = s And picAusgabe(2).Tag = s
    74. 'Prüft wo sich ein X und wo sich ein O befindet und legt den Sieger fest
    75. If AGewinn(0) = True _
    76. Or AGewinn(1) = True _
    77. Or AGewinn(2) = True _
    78. Or AGewinn(3) = True _
    79. Or AGewinn(4) = True _
    80. Or AGewinn(5) = True _
    81. Or AGewinn(6) = True _
    82. Or AGewinn(7) = True Then
    83. MsgBox lblSpieler.Caption & " hat gewonnen! Glückwunsch!"
    84. 'Stopt den Countdown
    85. TimerSpieler.Enabled = False
    86. 'Sperrt die Boxen
    87. For i = 0 To picAusgabe.Ubound
    88. picAusgabe(i).Enabled = False
    89. Next i
    90. 'Zählt die Siege
    91. If s = "X" Then
    92. lblPunkteX.Caption = lblPunkteX.Caption + 1
    93. Else
    94. lblPunkteO.Caption = lblPunkteO.Caption + 1
    95. End If
    96. ElseIf intAnzahlFrei = 0 Then
    97. MsgBox "Unentschieden!"
    98. For i = 0 To picAusgabe.Ubound
    99. picAusgabe(i).Enabled = False
    100. Next i
    101. TimerSpieler.Enabled = False
    102. End If
    103. If lblSpieler.Caption = "O" Then
    104. lblSpieler.Caption = "X"
    105. Else
    106. lblSpieler.Caption = "O"
    107. End If
    108. End Sub
    109. Private Sub TimerSpieler_Timer()
    110. Dim i As Integer
    111. 'Zählt vom Countdown runter
    112. lblRestzeit.Caption = lblRestzeit.Caption - 1
    113. 'Legt fest, was passiert wenn die Zeit abeglaufen ist
    114. If lblRestzeit.Caption = "0" Then
    115. MsgBox " Sie haben verloren Spieler " & lblSpieler.Caption & " !"
    116. TimerSpieler.Enabled = False
    117. End If
    118. End Sub



    Und so habe ich es probiert zu erreichen :

    Visual Basic-Quellcode

    1. For i = 0 to 7
    2. If picAusgabe(i).Tag = s and picAusgabe(i).Tag = S Then
    3. picAusgabe(i).Picture = LoadPicture (X)
    4. End if
    5. Next i



    Es kommt zwar kein Fehler, aber es kommt auch nicht der gewünschte Effekt.

    Der Computer setzt zwar bei 2 X in einer Reihe ein weiteres X, aber es kommt dann keine Gewinnmeldung.
    Wenn 2 O in einer Reihe sind, dann verhindert er ein drittes.
    Wenn ich aber als Spieler O den Gewinn von X verhindern will, setzt der Computer sein X einfach über mein O ( Also er schummelt :D)

    Also nicht der gewünschte Effekt...

    Hab ich da irgendein Denkfehler gemacht ??


    Danke schon mal :)

    Dennis336 schrieb:

    eine KI in das Spiel einbauen.
    Das sind ja echt große Worte bzw. Buchstaben für Euer Vorhaben.
    Hat sich das Dein Lehrer einfallen lassen?
    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!
    Nein, mir war langweilig auf der Arbeit, weil ich immer nur gelesen habe und ich auch mal was praktisches machen wollte. Die Aufgaben von meiner Schule waren mir zu einfach. Dann hab ich mir gedacht, versuche ich mal ein Tic-Tac-Toe zu programmieren. Gedacht getan.. Mein Ausbilder hat das dann gesehen und hat gesagt wenn ich den 2 Spielermodus fertig habe, dann soll ich mich daran machen ein Computergegner zu entwickeln. Er hat mir da ein paar Anregungen gegeben, weil er das selber erst letze Woche gemacht hat.

    Aber irgendwie funktioniert das nicht so wie ich will :D wie gesagt der PC schummelt :D
    Du solltest das ganze zunächst mal ordentlich kapseln, da kann keiner schummeln.
    Es gibt ein Spielbrett, auf das können beide Gegner sehen.
    Jeder Gegner kann einen Zug machen und fertig.
    Der PC muss dann 3 oder 5 Ebenen tief alles probieren und den für ihn erfolgreichsten Zug setzen.
    Mach also zunächst mal die Spieler-Klassen.
    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!