Zählen Sie nicht die Zahlen in "pi",
"E" ist unendlich gleich.
Und wenn Sie sie am Ende schreiben, was wird mehr sein?
Martin Gardner "Tic Tac Toe"Für diesen Artikel wollte ich ein anderes Epigraph wählen, fand es aber zu erbärmlich. Die nächste
Veröffentlichung wurde erneut verzögert. In dieser Zeit konnte ich den Job wechseln! Die Arbeit an einem neuen Ort kostet viel Energie, aber ich finde weiterhin Zeit für mein kleines Hobby. Und ich muss sagen, was ich dabei zu bewältigen habe, wird immer schwieriger. Ich werde es dir erzählen. Ich wollte mit einem anderen Epigraph beginnen, aber dieses ist auch nicht schlecht.
Diesmal gab es neue
Mankals und "
Übergangsspiele " (das sind
Halma und ihre Verwandten). Eine Art Rennen, bei dem du das Haus deines Gegners mit deinen Figuren vor ihm nehmen musst. Figuren (sowohl unsere als auch andere) können übersprungen werden (wie bei
Dame ), aber es gibt keine Erfassungen. Was erkläre ich dir? Sicherlich haben viele von Ihnen in Ihrer Kindheit
Corners gespielt.
Auf den ersten Blick sieht das Spiel einfach aus, aber die Probleme begannen bereits auf Kernelebene. Erinnerst du dich, ich
habe über zusammengesetzte Bewegungen gesprochen? Aus vielen Gründen ist es bequemer, sie als zusammengesetzte darzustellen - als einzelnes Ganzes und nicht als Folge von Teilbewegungen. Dies ist für die KI bequemer, und aus gestalterischer Sicht gibt es Spiele, deren Beschreibung in Form von zusammengesetzten Bewegungen viel natürlicher aussieht. Es gibt jedoch ein Problem.
Bei Dame werden bei einem zusammengesetzten Zug die Teile vom Brett entfernt (möglicherweise am Ende des Zuges). In den Ecken können Sie über die eigenen oder gegnerischen Figuren bis ins Unendliche springen. Im wahrsten Sinne des Wortes. Und hier werden keine Erweiterungen gespeichert, da alles in Zyklen abläuft, ohne sie zu erreichen, im Kernel, selbst in der Phase der Erstellung der Liste der Züge. Ich musste diese Logik ändern und dort die Option (
Detect-Loops ) implementieren, über die ich im Voraus nachdenken sollte.
Mit dem Bot war es auch nicht einfach.Das Hauptproblem bei dieser Spielefamilie besteht darin, dass es nicht so einfach ist, eine Bewertungsfunktion auszuwählen, die die Situation auf dem Brett angemessen darstellt. Da das Ziel des Spiels darin besteht, die „Heimat“ des Gegners zu erreichen, ist es möglich, die Gesamtentfernung aller Teile zu den Zielfeldern (
Manhattan oder
Euklidisch - kein Unterschied) zu schätzen. In Halm können die Teile jedoch unter erfolgreichen Umständen das gesamte Brett auf einmal überspringen, sodass eine solche Schätzung erfolgt gibt wenig.
Bei den Zielfeldern ist auch nicht alles klar. Sie können nicht alle Figuren auf dasselbe Feld richten. Die erste Figur, die ihn genau dort erreicht und nimmt. Es wäre ideal, die optimalen Zielfelder für jede der Figuren zu bestimmen und zu ihnen zu wechseln, aber es ist im Berechnungsplan schwierig. Außerdem ändert sich die Situation auf dem Brett mit jeder Bewegung. Im Allgemeinen habe ich beschlossen, nicht weit nach vorne zu schauen und mich auf einen rein
heuristischen Algorithmus zu beschränken .
Mit einer solchen Beurteilung der SchlaganfallqualitätDagaz.AI.heuristic = function(ai, design, board, move) { var t = getTargets(design, board, board.player); var m = getMove(move); var r = 1; if (m !== null) { if (!design.inZone(0, board.player, m.start)) { if (_.indexOf(t.first, m.end) >= 0) { r = 1000 + getDistance(t.first, m.start) - getDistance(t.first, m.end); } if (_.indexOf(t.goal, m.end) >= 0) { r = 700 + getDistance(t.first, m.start) - getDistance(t.first, m.end); } if ((r == 1) && (_.indexOf(t.second, m.end) >= 0)) { r = 500 - getDistance(t.second, m.end); } } if (r == 1) { if (design.inZone(2, board.player, m.end) && !design.inZone(2, board.player, m.start)) { r = 300; } } if (bestFound(design, board, 300)) return -1; if (r == 1) { var goals = getGoals(design, board, board.player); if (!_.isUndefined(goals[m.start])) { var goal = goals[m.start]; if (m.next == goal.next) { r = 100 + distance(goal.end, m.start) - distance(goal.end, m.end); } } } if (notBest(design, board, r)) return -1; var b = board.apply(move); if (isRestricted(design, b, board.player)) return -1; } return r; }
Keine ideale Lösung, aber zunächst funktioniert es ganz gut. Wenn der Bot eine Bewegung sieht, mit der es möglich ist, in das "Haus" des Feindes zu "springen", wählt er sie aus. Andernfalls wird die Entfernung zum Ziel schrittweise verringert, um eine Überlastung zu vermeiden. Die traurigste Situation kann passieren, wenn ein Spieler (versehentlich oder absichtlich) sein Stück im "Haus" lässt und der andere es mit einer doppelten Reihe seiner Stücke "sperrt".
Natürlich ist die Wahrscheinlichkeit einer solchen Situation recht gering.Dank der von Sidney Saxon, dem Erfinder und Sammler von Spielen aus New York, vorgeschlagenen Regel. Sein Vorschlag lautet wie folgt: Wenn eine Figur die Fähigkeit hat, ihre "Heimat" zu verlassen, indem sie durch eine gegnerische Figur oder durch eine Kette von Sprüngen springt, die von einer solchen Bewegung ausgehen, muss sie dies tun. Ich habe verschiedene Versionen der Regeln ausprobiert, ohne die Möglichkeit, Figuren in ihrem eigenen "Haus" zu sperren, und fand die Sidney Saxon-Regel am erfolgreichsten. Nachdem er sein „Zuhause“ verlassen hat, kann das Stück nicht mehr dorthin zurückkehren (obwohl es das Recht hat, es während des Abschlusses des Umzugs zu durchlaufen).
Nur für den Fall, dass ich die "Sperr" -Züge des Gegners verbiete (wenn Sie nicht viele Züge vorausschauen müssen, können Sie sich ziemlich komplizierte Heuristiken erlauben), indem Sie negative Bewertungen für sie festlegen, ist die Situation des "Sperrens" leerer Zielfelder für den Bot nicht weniger gefährlich (insbesondere dies auffällig im
klassischen Halma mit seinen rein orthogonalen Bewegungen). Im Allgemeinen hat dieser Bot Raum zum Wachsen.
In Spielen, in denen Stücke genommen werden dürfen, ist es noch komplizierter. Und es gibt viele solche Spiele! Der vielleicht berühmteste davon ist der
Camelot , der 1930 von George Parker erfunden wurde. Aber ich persönlich mag ein viel weniger bekanntes Spiel, das auf der gleichen Mechanik basiert.
Dieses
Spiel ist die Geschichte selbst! Bereits 1908 hatten die Suffragisten die Idee, ihre politischen Ansichten voranzutreiben. Alles ist hier: das Unterhaus, die
Albert Hall , das Stadtgefängnis und das Krankenhaus.
Suffragistinnen kämpfen gegen Polizisten. Ihr Ziel ist es, 6 ihrer Leute ins Unterhaus zu bringen. Sie können ihr Hauptquartier, Albert Hall, nicht betreten. Formen bewegen sich in jede Richtung. Das Springen über freundliche und feindliche Teile ist ebenfalls erlaubt.
Eine Reihe von Sprüngen kann jedoch beliebig lang sein. Wenn der Fall in der "Arena" stattfindet, werden feindliche Figuren beim Durchspringen abgeschnitten und in ein Gefängnis oder Krankenhaus gebracht. Gewöhnliche Figuren werden nur diagonal geschnitten, groß (Polizisten und Suffragistenführer) - in jede Richtung. Wenn 6 Personen im Gefängnis und im Krankenhaus rekrutiert werden, können sie durch erneutes Betreten des Spiels "ausgetauscht" werden. Daher verlassen die Figuren, wie bei
Shogi oder
Pillar Checkers , niemals das Spiel.
Im Allgemeinen befasst sich diese gesamte Version nur mit solchen Optionen. Zum Beispiel habe ich endlich die korrekte Transformation von Figuren im
Schach gemeistert (bis jetzt haben sich alle Bauern nur in Königinnen verwandelt, was im Allgemeinen falsch ist). Ich habe mich nicht viel damit beschäftigt und einen Auswahldialog direkt auf die Leinwand gezeichnet. Es stellte sich ziemlich gut heraus (wenn ich meine Hände hätte abnehmen können, um sie von der Matte zu unterscheiden, wäre es im Allgemeinen wunderbar gewesen).
Eine weitere "nukleare" Verfeinerung war mit der Verbesserung der Benutzeroberfläche verbunden und hat ihren eigenen Hintergrund. Das Projekt enthält seit geraumer Zeit einen
Mechanismus , mit dem Sie die aktuelle Position verschlüsseln können, indem Sie sie über die URL übergeben. Wenn man bedenkt, dass Beschreibungen aller Spielzustände in diesem Format in das Protokoll geschrieben werden, hilft dies beim Debuggen sehr. Das ist nur der Benutzer, der nichts über das Browserprotokoll weiß, es nützt wenig.
Nein, nein, das ist nicht alles gut!Es gibt eine Reihe von Spielen, deren Gameplay aus vielen (möglicherweise heterogenen) Phasen besteht. Als Beispiel können Sie das beliebte Spiel von 2008 -
Kamisado -
anführen . Jede Phase dieses Spiels (bevor eine der Figuren an die letzte Horizontale übergeben wird) ist relativ kurz, aber nach Abschluss wird das Spiel fortgesetzt. Die Spieler ordnen ihre Figuren gemäß den vereinbarten Regeln in der ersten Zeile neu an und versuchen erneut, die letzte Horizontale vor dem Gegner zu erreichen (die Figur, die in der vorherigen Phase den Sieg gebracht hat, erhält neue Fähigkeiten).
Diesen Aspekt des Spiels automatisiert die Option „
Progressive Levels “, die automatisch in die nächste Phase des Spiels übergeht, wenn einer der Spieler gewinnt. Und da sich die anfängliche Anordnung der Figuren von einer Stufe zur anderen unterscheidet, wird sie vom
Common-Setup- Modul berechnet und über die
URL an die nächste Stufe des Spiels weitergeleitet.
Hand in Hand mit dieser Gelegenheit geht ein anderer Weg, der es Ihnen ermöglicht, die anfängliche Anordnung der Zahlen zu diversifizieren. Mit der Option "
Selektor " können Sie mehrere anfängliche Anordnungen (und sogar Kartenkonfigurationen) in einer einzigen
JS-Datei codieren. Aktualisieren Sie Ihre
Reversi- Homepage und Sie werden verstehen, was ich meine.
Das neue Plug-In
soll das Problem lösen. Strukturell ist dies ein gewöhnlicher Baum, in dem alle Spielzustände gespeichert werden, die jemals in der Spielsitzung vorgestellt wurden (und da dieser Baum in Zukunft den gesamten Verlauf des Spiels in die
SGF- Datei
hochladen kann). Der Benutzer kann diese Zustände mithilfe der Schaltflächen oben auf dem Bildschirm "umdrehen".
Dies ist sehr praktisch, aber Sie können noch mehr von den beiden Pfeilen oben profitieren. Genau das macht die Option "
Advisor-Modus ". Wenn der Benutzer länger als die angegebene Zeit denkt, berechnet der Bot, mit dem er spielt, den Kurs für ihn und setzt den neuen Spielstatus in den "Sitzungsmanager". Der vorgeschlagene Schritt kann einfach durch Drücken der Vorwärts-Taste akzeptiert werden. Und wenn Ihnen der Zug nicht gefällt, können Sie ihn jederzeit zurücksetzen.
Viel Freude im Entwicklungsprozess brachte Klang (es scheint, was viel einfacher ist). Die erste
Implementierung war zu naiv. Ich weiß nicht, womit es verbunden ist, aber irgendwo in der Mitte des Spiels hörte der Sound einfach auf zu spielen, ohne dass Nachrichten im Protokoll vorhanden waren. Dies manifestierte sich in allen Browsern, die ich hatte, bis ich anfing, die erstellten Sound-Objekte im Speicher zwischenzuspeichern. Aber dann kam ein anderes Problem.
Wenn der Sound lange gespielt wurde und der Bot schnell genug
nachdachte (wie zum Beispiel bei
Ködern ), wurde der Sound seiner Bewegung einfach „verschluckt“, was äußerst unangenehm aussah. Hier musste ich lange schamanen und es endete mit
Krücken . Wenn das Flag "Klonbar" gesetzt ist, erstelle ich immer noch mehrere Soundinstanzen, eine für jeden Spieler (auch wenn sie denselben Sound verlieren). Natürlich half dies in keiner Weise dem IE, der sich (offensichtlich aus religiösen Gründen) weigerte, sowohl mit "wav" - als auch mit "ogg" -Dateien umzugehen. Dieser Browser funktioniert für mich lautlos!
Ansonsten verlief die Veröffentlichung ohne Zwischenfälle.
Halme und
Mankalam bestanden aus ein paar
Schachspielen sowie einer Vielzahl von Shogi- Variationen, die ich in der nächsten Ausgabe von
Il fogliaccio degli astratti und einem weiteren einfachen
Spiel chinesischer Kameraden gelesen hatte. Oh ja, hier ist noch etwas:
Nur ein kleiner Simulator des Kurzzeitgedächtnisses. Es ist notwendig, die gleichen Paare (Königin mit Königin, König mit König usw.) der gleichen Farbe zu öffnen. Hierfür und für alle 200 Klicks werden Punkte vergeben. Da Boni für Punkte vergeben werden (zum Beispiel für den Wechsel von roten und schwarzen Anzügen), können Sie mit Freunden darüber konkurrieren, wer ein besseres Gedächtnis hat. Mach es!
Und alles ein frohes neues Jahr!