[Läuft] µitLight Dezember '10/Januar '11

  • Thema: Schach-Engine

    Diesmal wird es, wie bereits angekündigt ;), recht schwierig: Programmiert Eure eigene Schach-Engine und -KI. Die Engine umfasst die Ergänzung, der bereits vorhanden Funktionen, die KI die eigentliche Herausforderung. :) Aufgrund des Schwierigkeitsgrades werden die Winterferien mit einbezogen.

    Im Anhang findet ihr die Quellcode.zip. Diese behandelt ihr wie folgt:

    • Entpackt die Datei in ein beliebiges Verzeichnis
    • Benennt die Interface.au3 um, sodass der Dateiname eurem Benutzernamen entspricht (bei mir z.B.: MatthiasG.au2). Habt ihr nicht unterstützte Sonderzeichen im Namen, lasst sie aus.
    • Sendet nur dieses Skript (denn die Schach.au3 soll unverändert bleiben) bei Abgabe ein.

    An dieser Stelle noch einmal herzlichen Dank an xXlowXx und Oscar für die Erstellung der GUI! :thumbup:

    Die Spielregeln sind (außer den Üblichen) Folgende:

    • Nur die internen DLLs von AutoIt und Windows sind erlaubt
    • GDI+ und Konsorten sind komplett verboten, alles muss über die bereitgestellten Funktionen abgewickelt werden.
    • Alles weitere findet ihr im Skript

    Der Abgabetermin ist der 16.02.2011 23:59
    Die Einsende-Adresse lautet uitlight@l3viathan.de

    Bitte sendet eure Ergebnisse dort rechtzeitig ein!

    Zur Zeit läuft die Vorlaufphase bis zum 12.12.2010: Wir bitten euch, das Skript herunter zu laden, Fehler aufzuspüren (da Selbige immer auftauchen, wir aber keine mehr gefunden haben) und zu prüfen, ob ihr mit den angebotenen und angeforderten Funktionen auskommt. Meldet alles bitte hier oder per Mail an o.g. Adresse, damit bis zum 12. eine finale Version zur Verfügung steht. Erst danach solltet ihr beginnen, damit ihr nicht Großteile neu schreiben müsst.

    Der Wettbewerb wurde am 02.01.10 nach einer verlängerten Vorlaufphase eröffnet - viel Erfolg!

    Wir hoffen auf viele Einsendungen zu diesem doch sehr spannenden Projekt!

    Viel Erfolg allerseits! :thumbup:

    Im Namen der Jury (also L3viathan, Schnitzel und meiner Wenigkeit),

    Matthias

    Changelog

    P.S.: Aus Bequemlichkeit hier auch ein Upload-Link von Dropbox, damit ich nicht immer neu uploaden muss. :whistling:
    Quellcode.zip

    11 Mal editiert, zuletzt von MatthiasG. (2. Januar 2011 um 20:42)

  • Also irgendwie geht die Schach.au3 nicht wirklich. Wenn man Interface.au3 so startet wie du sie gemacht hast sollten ja zumindestens die Schachfiguren schon aufgestellt sein. In der Schach.au3 wird zumindestens die _NormalPosition() aufgerufen. Man erhält aber nur ein leeres Schachbrett.

    Gibt zwei Lösungen dafür. Entweder die Interface.au3 in den Ordner Schach mit rein oder die Pfade in der Schach.au3 anpassen. Bei @ScriptDir wird immer vom startenden Script ausgegangen und nicht vom includierten wodruch dei Pfad dann nicht stimmen können.

    Noch eine Frage und zwar, ist der menschliche Spieler immer weiß oder kann man es auch so machen, dass der menschliche Spieler schwarz ist?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    8 Mal editiert, zuletzt von chip (23. November 2010 um 09:28)

  • Hallo MatthiasG,

    das die Pfade nicht stimmen hat ja chip schon gemeldet, das der Mensch immer weiss hat stört mich auch etwas da weiss einen kleinen Vorteil hat.
    Desweiteren _Chess_HumanTurn hat nur einen Parameter nämlich das Ziel des Zuges, der menschliche Spieler muss doch aber auch die Möglichkeit haben von wo er was ziehen möchte auszuwählen, oder habe ich da etwas in der Aufgabe übersehen?

    Edit: hat sich geklärt, mein Display (Netbook ist zu klein) um $CommandInput darzustellen, schade hatte schon überlegt auch mit zu machen,


    mfg autoBert

    Einmal editiert, zuletzt von autoBert (23. November 2010 um 10:58)

  • Hallo allerseits.

    Pfade wurden nun angepasst. Ich hatte die Schach.au3 kurz vor dem Upload in den Ordner source verschoben, damit die Quelle nicht in den Verzeichnis mit den User-Scripten ist und habe dabei vergessen, die Pfade für die Icons anzupassen.

    Menschlicher Spieler kann auch schwarz auswählen, ist aber per default weiß. Wenn ihr auf den Button Befehle drückt, findet ihr dort den Befehl "restart" beschrieben. Rufe ich in dem Input restart b auf, bin ich als menschlicher Spieler schwarz.

    autoBert Wenn du nur deswegen nicht mitmachen kannst, ist das kein Problem, ich kann das Skript dahingehend anpassen, dass immer eine Inputbox für den menschlichen Spieler erscheint. Wäre das so in deinem Sinne, damit du auch testen kannst?

    SQLite ist erlaubt, da sie zum Standardumfang gehört. GDI+ haben wir deshalb verboten, damit die Funktionen der Schach.au3 verwendet werden, und jeder dieselbe Basis hat.

    Vielen Dank für Euer Feedback, ruhig weiter so :)

    Viele Grüße,
    Matthias


  • Menschlicher Spieler kann auch schwarz auswählen, ist aber per default weiß. Wenn ihr auf den Button Befehle drückt, findet ihr dort den Befehl "restart" beschrieben. Rufe ich in dem Input restart b auf, bin ich als menschlicher Spieler schwarz.

    Das ist ein wichtiger Punkt zu wissen. Weil ich hätte nun die KI nur für die Farbe schwarz gemacht. Wenn beide Farben aber gespielt werden sollen muss man da komplett anders rangehen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ich kann das Skript dahingehend anpassen, dass immer eine Inputbox für den menschlichen Spieler erscheint. Wäre das so in deinem Sinne, damit du auch testen kannst?

    ja, dann würde ich mich auch einmal daran versuchen, obwohl ich betsimmt schon 30+ Jahre kein Schach mehr gespielt habe,

    mfg autoBert

  • Ich werde zu Hause den Code dahingehend anpassen, leider bin ich gerade noch in der Schule und habe hier keine Möglichkeit dazu.

    Viele Grüße,
    Matthias

  • So, das Skript habe ich nun angepasst.

    Bitte weitere Verbesserungsvorschläge posten! :)

    Viele Grüße,
    Matthias

  • Was meinst du mit Eröffnungsbibliotheken?

    Wenn du eine Datenbank mit Eröffnungen meinst, die von dir selbst stammt, dann ja. Wenn sie von dritten stammt, dann leider nicht.

  • chip, keine Angst denn

    Wenn du eine Datenbank mit Eröffnungen meinst, die von dir selbst stammt, dann ja. Wenn sie von dritten stammt, dann leider nicht.

    und da ich selbst seit über 30 Jahren nicht gespielt habe, wird das wohl eine sehr rudimentäre DB.

    Nachtrag: Frage zu en passant, da meine Schachkenntnisse ja schon verjährt sind. Ist die Erklärung hierzu in http://de.wikipedia.org/wiki/En_passant richtig? (Ich hatte es anders in Erinnerung). Des weiteren muss der Teilnehmer (also ich) beweisen, dass der gegnerische Bauer unmittelbar davor den Doppelschritt gemacht hat?

    Nachtrag2: damit du nicht Besonderheiten (GuiCtrkInput/InputBox) in der Schach.au3 beachten must schlage ich vor wieder die ursprüngliche Version zu nehmen, die ich mir dann in diesem Bereichen

    [autoit]

    $hGui = GUICreate('Schachbrett', 1024, $iHeight + 60, 0, 0)
    ;.........
    Global $CommandInput, $HelpButton
    $CommandInput = GUICtrlCreateInput("", 700, 65, 300, 25)
    GUICtrlSetBkColor(-1, 0x008800)
    GUICtrlSetOnEvent(-1, "__Chess_Input")
    $HelpButton = GUICtrlCreateButton("Befehle...", 700, 165, 100, 25)

    [/autoit]

    anpasse

    mfg autoBert

    3 Mal editiert, zuletzt von autoBert (25. November 2010 um 06:02)

  • Keine Ahnung ob schon etwas an Fehler gemeldet wurde!
    Deshalb schreib ich auch keine Mail sondern poste hier, damit die anderen User sehen können, was bereits gemeldet wurde bzw. bisher noch unentdeckt geblieben ist und dann selbst gemeldet werden kann.

    Probleme in der Schach.au3

    • [autoit]If $SMALLSCREEN Then
      $CommandInput = GUICtrlCreateInput("", 10, $iHeight + 65, $iWidth - 70, 25)[/autoit]
      Nach dem If fehlt ein Not, sonst sehe ich die Inputbox innerhalb der GUI (für den Fall $SMALLSCREEN=False) nicht.
    • Gib mal in die Inputbox nur "set" ein.

      Code
      ...\Quellcode\source\Schach.au3 (367) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
      Local $who = __Chess_Wer_Auf_Feld($array[2])
      Local $who = __Chess_Wer_Auf_Feld(^ ERROR


      Das selbe natürlich auch bei "restart" und "rochade"

    • Drück mal auf den "Befehle..."-Button und danach auf Ok um den Hinweis zu schließen.
      Führe dann einen "set a2 a3" Befehl aus:
      => Der Zug wird ausgeführt. (<= OK)
      => Der Hinweis (vom "Befehle..."-Button) erscheint wieder (<= ERROR)
    • Wenn die KI dran ist, wird die InputBox rot und disabled.
      => Wie geb ich nun den Befehl "abort" ein? :D
    • Nachdem die KI ihren Zug ausgeführt hat, muss ich jedesmal mit der Maus in die InputBox klicken, um einen neuen Befehl einzugeben.
      => Wünschen würde ich mir einen Focus auf die InputBox, wenn "Human" dran ist.

    [Edit]
    @set xy xy ep
    Warum muss ich da hinten ein "ep" angeben?
    Langt es denn nicht, wenn ich einfach set xy xy schreib und meine Validierungs Funktion dann nachschaut ob es ein gültiger Zug (in diesem Fall, ein gültiger "ep") war oder nicht?

    2 Mal editiert, zuletzt von Cyberdyne (25. November 2010 um 02:55)

  • Was meinst du mit Eröffnungsbibliotheken?

    Wenn du eine Datenbank mit Eröffnungen meinst, die von dir selbst stammt, dann ja. Wenn sie von dritten stammt, dann leider nicht.

    Mh von dritten Stammt eigentlich alles. Jeder Spielzug in Schach und jede eröffnungstrategie hat irgendjemand schonmal aufgeschrieben. In dem Fall ist es dann also nicht möglich überhaupt die KI einigermaßen realistisch zu machen. Alleine schon diese Tabelle hier: klick mich hat alle möglichen Züge zu Spielbeginn gelistet, ergo kann die KI keine einzigen Zug machen ohne auf irgendeine weiße eine Zug dieser, von dritten erstellten, Liste auszuführen. Es gibt im Schach schlicht und einfach keinen Zufall.

    Man sollte das Ziel dieses µitLight nochmal deutlicher machen. Ist es nun das Ziel eine möglichst gute KI zu erstellen oder einfach nur eine reine Plausibiltätsprüfung zu machen? Wäre nett wenn das mal klar gesagt werden würde. Weil Schach-Engine ist wie gesagt schon die Schach.au3 und damit wäre eigentlich garnichtsmehr zu machen.

    Zitat

    Eine Spiel-Engine (engl. Game Engine [ˈgeɪmˌɛndʒɪn]) ist ein Computerprogramm, das den Spielverlauf steuert und für die visuelle Darstellung des Spieleablaufs verantwortlich ist.

    Hier noch ein paar Fehler:

    Du schreibst bei _Chess_Validate da hier "4 Parameter, 2 davon optional" aber gleichzeitig schreibst du unter Anmerkungen das "Bei einer Rochade bleiben $Start und $End leer!" also sind nicht zwei von vier optional sondern alle sind optional.

    Bei _Chess_HumanTurn schreibst du "An Schach-Regelungen denken!" da allerdings vor diese Funktion die _Chess_Validate aufgerufen wird ist ja hier nichtsmehr zu regeln.

    Wenn man in der aktuellen Version Interface.au3 ausführt ist auf dem Schachbrett keine Inputbox mehr und auch der Button "Befehle..." ist nicht vorhanden.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    5 Mal editiert, zuletzt von chip (25. November 2010 um 11:18)

  • So, hab noch einen Fehler entdeckt:

    • Ich hab bei der Validierungs-Funktion den Return auf False gesetzt.
      [autoit]Func _Chess_Validate($Start, $End, $Params = "", $Params2 = "")

      Return False
      EndFunc

      Somit müsste jeder Zug den ich mache, falsch sein!
      Ist auch so (<= OK) ^^

      Das dumme ist nur, ich kann meinen Zug nicht wiederholen!
      Stattdessen werde ich Übergangen und die KI ist am Zug (<= ERROR)

      [/autoit]
    [autoit]
    • [Edit]
    • [autoit]
    • Validierungs-Funktion wieder auf Return True gesetzt.
      Gebe "set a2 a8" ein.
      => schickt den a-Bauer auf die gegnerische Grundlinie (<= OK)
      Es kommt eine Input-Box, inder ich nach der Umwandlung gefragt werde. Wähle D für Dame.
      => Es passiert nichts! D.h. auf dem Feld a8 ist immernoch der Bauer und keine Dame (<= ERROR)
    • [autoit]
    • Sobald ein Bauer die gegnerische Grundlinie berührt, kann der Bauer nicht mehr gezogen werden.
      set a2 a8 (<= OK)
      set a8 a2 (<= ERROR)

      Mit den andere Figuren gibts kein Problem
      set a1 a8 (<= OK)
      set a8 a1 (<= OK)

    [/autoit]
      [/autoit][/autoit]

    Einmal editiert, zuletzt von Cyberdyne (26. November 2010 um 03:53)

  • Hallo µitLight-Jury,

    das Problem mit dem Umwandeln kann ich bestätigen, ich habe mit den Original-Dateien getestet und folgende Zugfolge für den Spieler eingegeben (KI hat jeweils Zeit verstreichen lassen):

    • set b2 b4
    • set b4 b6
    • set b6 b8
    • d2 d4

    ich weiss ist unnsinnig und muss von uns in _Chess_Validate behandelt werden, dass dies nicht möglich ist.
    Das Ergebnis dieser Zugfolge könnt ihr hier bewundern:
    autoit.de/wcf/attachment/11864/

    @all:

    Nachtrag: Frage zu en passant, da meine Schachkenntnisse ja schon verjährt sind. Ist die Erklärung hierzu in http://de.wikipedia.org/wiki/En_passant richtig? (Ich hatte es anders in Erinnerung). Des weiteren muss der Teilnehmer (also ich) beweisen, dass der gegnerische Bauer unmittelbar davor den Doppelschritt gemacht hat?

    wäre nett wenn mir jemand bestätigen könnte, dass die Beschreibung korrekt ist.

    mfg autoBert

  • Eine Funktion die beim starten einer Partie aufgerufen wird wäre noch gut, damit man bereits gewisse Sachen inizialisieren kann.

    Also einfach im Interface:

    [autoit]

    Func _Chess_Initialize()

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]

    und in der Schach.au3 einfach am Scriptanfang diese Funktion aufrufen.



    Nachtrag: Frage zu en passant, da meine Schachkenntnisse ja schon verjährt sind. Ist die Erklärung hierzu in http://de.wikipedia.org/wiki/En_passant richtig? (Ich hatte es anders in Erinnerung). Des weiteren muss der Teilnehmer (also ich) beweisen, dass der gegnerische Bauer unmittelbar davor den Doppelschritt gemacht hat?

    Wenn ein Bauer 2 Felder vorrückt und anschließend direkt neben einem gegnerischen Bauern zum Stehen kommt, so darf dieser geschlagen werden, als würde er nur 1 Feld ziehen. Diese Schlagmöglichkeit entfällt jedoch im nächsten Zug.

    Sieht man ja gut auf dem Wikibeispiel:

    [Blockierte Grafik: http://upload.wikimedia.org/wikipedia/commons/0/09/Ajedrez_animaci%C3%B3n_en_passant.gif]

    Edit:

    Und weiter gehts mit den Fehlern ;). Wenn zu Spielbeginn die Spielerfarbe schwarz ist aber ganz normal weiß mit dem ersten Zug beginn, dann wird _Chess_ComputerTurn nicht aufgerufen sondern _Chess_HumanTurn.

    Naja ich mach doch nicht mit beim µitLight sind einfach zuviele Fehler in dem ganzen Script um es effektiv als Grundlage zur Erstellung einer Schach KI zu verwenden. Da hat man ja mehr damit zu tuen die Limitierungen der Schach.au3 irgendwie hinzubiegen als mit der eigentlichen KI. Zeigt auch schon allein, das es keine gemeinsamen Array gibt in dem die Positionen gespeicher sind. Dies bedeutet z.b. dass wenn schwarz nun von d8 auf d1 zieht __Chess_Wer_Auf_Feld("d1") trotzdem noch ausgibt, dass d1 im besitz von weiß ist. Umgekehrt also wenn weiß von d1 nach d8 zieht gibt __Chess_Wer_Auf_Feld("8") richtigerweise aus, dass nun weiß darauf ist. Bedeutet also, dass man nun nochmal seperat eine Liste der Positionierung der Figuren machen müsste und diese auch Auswerten, was wiederrum auf kosten der Laufzeit geht.

    Kurz und knapp. Schönes Script um Schachzüge zu animieren, aber um wirklich darauß ein Spiel zu machen bei dem man aktiv Züge macht oder gar eine KI nicht zu gebrauchen.

    Wünsche allen anderen trotzdem noch viel Spaß bei diesem µitLight.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    16 Mal editiert, zuletzt von chip (26. November 2010 um 12:46)

  • Naja ich mach doch nicht mit beim µitLight sind einfach zuviele Fehler in dem ganzen Script um es effektiv als Grundlage zur Erstellung einer Schach KI zu verwenden.


    8|
    Dies ist doch erst dir Vorlaufphase!

    Zur Zeit läuft die Vorlaufphase bis zum 12.12.2010: Wir bitten euch, das Skript herunter zu laden, Fehler aufzuspüren


    Nichts anderers tun wir gerade ;)
    Oder hast du schon angefangen zu proggen? :P

    Eine Funktion die beim starten einer Partie aufgerufen wird wäre noch gut, damit man bereits gewisse Sachen inizialisieren kann.
    [...]
    und in der Schach.au3 einfach am Scriptanfang diese Funktion aufrufen.


    ...aber auch sobald der User über die InputBox "restart" eingibt. ;)

    Zeigt auch schon allein, das es keine gemeinsamen Array gibt in dem die Positionen gespeicher sind.


    Gibts doch $gFeld, nur musst du halt $gFeld selber aktualisieren, nachdem ein Zug getätigt wurde ;)

    [Edit]

    Wenn zu Spielbeginn die Spielerfarbe schwarz ist aber ganz normal weiß mit dem ersten Zug beginn, dann wird _Chess_ComputerTurn nicht aufgerufen sondern _Chess_HumanTurn.


    Kann ich nicht bestätigen!

    Bzw. dur darfst die Änderung NICHT hier vornehmen

    [autoit]

    ; Globale Variablen, die Vorgegeben sind. NICHT ÄNDERN!
    Global $gWhosTurn = "w" ; Wer am Zug ist: w=weiß, b=black
    Global $gFeld[8][8][2] ; Aussehen des Feldes: [x-Koordinate, y-Koordinate, [w=weiß/b=black/0=leer, Nummer der Figur]]
    Global $gPlayerColor = "w" ; Farbe des menschlichen Spielers: w=weiß, b=black

    [/autoit]

    Sonder zu Beginn musst du "restart b" in die InputBox eingeben, dann klappts auch wie gewünscht.

    Einmal editiert, zuletzt von Cyberdyne (26. November 2010 um 12:59)