TicTacToe Control nun mit KI!

    • Beta

    Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Nibel.

      TicTacToe Control nun mit KI!

      Hi Leute,
      ich veröffentliche hier mein erstes Control, was einfaches, nämlich das Spiel TicTacToe.
      Seid bitte nicht zu streng, jeder fängt mal klein an!

      Member
      Diese Events, Propertys und Funktionen gibt es

      VB.NET-Quellcode

      1. Public Const Cross As Integer ' Braucht man für AddObject
      2. Public Const Circle As Integer ' Braucht man für AddObject
      3. Public ReadOnly Property ActivePlayer() As Integer ' Der momentane Spieler
      4. Public Property LineColor() As Color ' Die Farbe der Trennlinien
      5. Public Property CrossColor() As Color ' Die Farbe der Kreuze
      6. Public Property CircleColor() As Color ' Die Farbe der Kreise
      7. Public Property BgColor() As Brush ' Hintergrundfarbe
      8. Public Property Flash() As Boolean ' Ob er die Gewinnerobjekte aufblinken lassen soll
      9. Public Property FlashColor() As Color ' und in welcher Farbe
      10. Public Property StopGame() As Boolean ' Ob das Spiel gestoppt sein soll ( für Benutzereingaben )
      11. Public Property Against_KI() As Boolean ' Ob gegen eine KI gespielt wird
      12. Public Property KI_Difficilty() As Integer ' Welcher Schwierigkeitsgrad von 1-4
      13. Public Function NewGame() As Boolean ' Startet ein neues Spiel
      14. Public Function AddObject(ByVal ObjectID As Integer, ByVal FieldNumber As Integer) As Boolean ' Added ein Objekt unten erklärt
      15. Public Event GotWinner(ByVal player As Integer) ' Gewinner
      16. Public Event FieldFull() ' Unentschieden, das Feld ist voll
      17. Public Event CrossAdded(ByVal Field As Integer) 'Kreuz hinzugefügt Field = Welches Feld
      18. Public Event CircleAdded(ByVal Field As Integer) ' Kreis hinzugefügt Field = Welches Feld
      19. Public Event NextPlayer(ByVal player As Integer) ' Spielerwechsel (player = Der der neu dran ist)
      20. Public Event GameplayChanged(ByVal Stopped As Boolean) ' Das Spiel wurde entweder gestoppt oder wieder aufgenommen ( Stopped = neuer Wert)
      21. 'Außerdem gibt es die Klasse TTTKI, ich habe das mal alles als Shared gemacht, damit ihr es verwenden könnt wenn ihr wollt
      22. ' iField ist ein Array mit 10 Membern. - Diese Member sind entweder 0, 1 oder 2. - 0 heißt Feld unbesetzt, 1 heißt vom Spieler belegt - und 2 heißt vom Computer belegt
      23. ' Das muss eingehalten werden sonst klappt es nicht !
      24. Public Function Easy(ByVal iField() As Integer) As Integer ' Schwierigkeit einfach
      25. Public Function Normal(ByVal iField() As Integer) As Integer 'mittel
      26. Public Function Hard(ByVal iField() As Integer) As Integer 'usw
      27. Public Function Unbeatable(ByVal iField() As Integer) As Integer
      28. Public Function Random_KI_Set(ByVal iField() As Integer) As Integer ' Setzt auf ein zufällig freies Feld
      29. Public Function Someone_d_win(ByVal iField() As Integer, ByVal Player As Integer) As Integer ' Testet ob ein Spieler im nächsten Zug gewinnen könnte und gibt das benötigte Feld zurück



      Wenn Flash = True ist (standart), dann blinken die drei GewinnerBausteine auf
      Es ist komplett mit GDI gezeichnet, Man kann während des Spiels alle Propertys verändern, es wird sofort übernommen.
      Auch die Größe kann man problemlos verändern und es wird weitergespielt

      Download:
      nibel.bplaced.net/codes/TicTacToe.dll
      Größe ca. 27 KB


      Update: StopGame() und ReturnGame() wurden durch Property erestzt und entsprechendes Event erstellt
      Bitte um Feedback und möglich Bugs, Probleme


      Update:
      So nächstes Update... Ihr habt jetzt die Funktion AddObject(ObjectID As Integer, FieldNumber As Integer) Object ist entweder TicTacToe1.Cross oder TicTacToe1.Circle oder halt TicTacToe1.ActivePlayer... FieldNumber ist die FeldNummer, 1 ist links oben, oben mitte 2 , oben rechts 3 und so weiter. Der User muss aktiv sein, schummeln nicht möglich! Bei Erfolg ist es true, sonst false

      Update:
      So nach längerer Zeit hab ich mich mal drangesetzt und eine KI geschrieben. Sie geht von Easy bis Unbeatable. Dafür gibt es 2 neue Property, Against_KI ob man gegen den Computer spielt und KI_Difficulty, der Schwierigkeitgrad von 1-4. Außerdem hab ich diese KI in der Klasse TTTKI öffentlich gemacht, damit sie auch so benutzt werden kann. Die Funktion erwartet das Array iField() As Integer. Es muss so implementiert sein, sonst gibt es Fehler:
      Dim iField(10) As Integer
      iField(1) = 1 ' Feld Nr.1, (links oben) ist vom Spieler 1 belegt
      iField(9) = 2 ' Feld Nr.9, (rechts unten) ist vom Spieler 2 bzw. Computer belegt
      iField(5) = 0 ' Feld Nr.5, (mitte) ist leer

      Das mit den verschiedenen Styles hab ich verworfen, das wär zu aufwendig geworden und zuviel Mühe für nix

      mfG Nibel

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Nibel“ ()

      du solltest auf jeden Fall Anti-Aliasing aktivieren

      VB.NET-Quellcode

      1. g.SmoothingMode = SmoothingMode.AntiAlias

      Skybird schrieb:

      Das sind ja Ubisoftmethoden hier !

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()

      mach mal Image-Eigenschaften mit denen man die Bilder für X O und die für disabled nehmen kann
      dann ist das viel vielseitiger ;)
      naja zB
      Player-X as Image
      Player-X_Hover as Image
      Player-X_Disabled as Image
      ' und das ganze für Player-Y

      und die zeichnest du dann wenn da was drin ist (Not (Image Is Nothing) ... zum rausfinden ob da überhaupt ein Bild drin ist) anstatt deiner Kreuze und Kreise
      dann kann sich das jeder selbst anpassen
      ich habs zwar nicht gedownloadet aber werden in den beiden oben genannten Funktion auch Werte übergeben
      du definierst das als WithEvents das Control (wenn du es auf die Form ziehst und/oder es keine Klasse ohne GUI ist (was hier ja nicht der Fall ist) wird es automatisch als WithEvents definiert)

      und dann kannst du in der CodeAnsicht oben in der linken Combobox das Control wählen und in der rechten Combobox das Event was du willst
      danach wird das Event zu deinem Code hinzugefügt (oder wenn du es schon hast wechselst du dort hin) und du kannst es mit deinem Code belegen
      dort stehen dann auch automatisch die übergebenen Variablen die du abfragen kannst

      ich hoffe das hilft

      MfG M4n94fr34k
      Cool danke ich habe es verstanden ;)

      Eine Frage noch
      wie kann ich es am besten machen dass wenn ich bei mir auf der form ein X mache das dieses X über eine TCP Verbindung an den Server gesendet wird
      und bei der anderen form(Also das selbe spiel nur ein 2. mal gestartet) übertragen wird
      geht das oder muss ich sowas über eine mausklick simulation machen mit positionen?