Millionen bist du. Uns - Dunkelheit und Dunkelheit und Dunkelheit.
Probieren Sie es aus, kämpfen Sie gegen uns!
Ja, Skythen - wir sind es! Ja, Asiaten - wir ...
Alexander Block " Skythen "In einem früheren
Artikel habe ich viel über meine Erkenntnisse im Bereich Design und Benutzeroberfläche von Brettspielen gesprochen, aber ich musste diese Geschichte unterbrechen, kann man in der Mitte sagen, teils wegen des großen Volumens des Artikels, teils einfach, weil ich zu diesem Zeitpunkt nicht bereit war, sie fortzusetzen als nächstes. Seitdem hat sich viel geändert. Neue interessante Probleme wurden gelöst und die Spiele, die sie erzeugten (nicht weniger interessant), wurden der
Veröffentlichung hinzugefügt. Ich möchte heute darüber sprechen.
Wenn sich jemand erinnert, ging es um das Spiel "
Abalon ", das 1988 von Michel Lale und Laurent Levy entwickelt wurde. Seine Essenz besteht darin, die Bälle des Feindes aus dem Feld zu schieben. Zwei Bälle können einen und drei Bälle schieben - ein Paar Bälle einer anderen Farbe. Der Spieler kann seine Bälle einzeln oder in Gruppen zu je zwei oder drei Bällen auf dem Brett bewegen (zusätzlich sollten drei Bälle eine „Reihe“ bilden). Was hat mich daran gehindert, dieses Spiel das letzte Mal zu machen?
Offensichtlich nicht die Gruppenbewegung selbst. Die gleichzeitige Bewegung mehrerer Figuren innerhalb eines Zuges erfolgt sogar im
Schach (
Rochade ). Und die "
Schiebepuzzles "
sind einfach so aufgebaut, dass eine solche Bewegung synchron und reibungslos abläuft. Schauen wir uns ein Spiel an, das 1975 von Robert Abbott entwickelt wurde:
Es sieht aus wie ein Abalon. Der einzige Unterschied besteht darin, dass die "Reihe" die gegnerische Figur nicht von ihrem Platz "drückt", sondern sie einfach mit einem "Schach" -Fang vom Brett entfernt. Der Sieg wird an einen der Spieler vergeben, der es geschafft hat, in der letzten Reihe des Bretts seiner Figuren mehr zu ziehen als sein Gegner in diesem Moment. Das ganze Spiel basiert auf sich bewegenden "Reihen". Es ist unwahrscheinlich, dass es gelingt, nur Einzelstücke zu gewinnen. So sieht ein einfacher Druck aus.
Zrf(define push-1 ( $1 (verify friend?) (while friend? cascade $1 ) (verify not-friend?) add ))
Es geht nur um die Zauberwortkaskade - sie zwingt den Dolmetscher, die bewegte Figur auf das aktuelle Feld zu "freigeben", von dort "in der Hand" eine andere Figur zu nehmen (es ist nicht wichtig für sich selbst oder den Gegner) und sich weiter zu bewegen, bereits mit der neuen Figur "in der Hand". In einem Zug kann ein solcher Vorgang wiederholt ausgeführt werden, wodurch eine unbegrenzte Anzahl von Teilen gleichzeitig bewegt wird. Solche (und etwas komplexeren) Fälle finden sich auch in anderen Spielen - "
Guns ", "
Dameo ", "
Leutwayite Game ", ...
Aus Sicht der Benutzeroberfläche sind Pushing-Moves ebenfalls recht trivial implementiert. Die bekannte Zielfeldbezeichnung (grüner Kreis) erscheint in der Abbildung. Wenn wir (nach den Spielregeln) diese Figur essen können - wir essen (Schachfang), sonst - pushen wir. Sie können eine Reihe und mehr als ein Feld nach vorne schieben (wie im Spiel Epaminondas). Das Codieren eines solchen Zuges wird natürlich etwas komplizierter sein:
Zrf (define push-2 ( $1 (verify friend?) (while friend? mark $1 (verify not-enemy?) to back cascade $1 ) $1 (verify not-friend?) add ))
Das Schlüsselwort to (und sein gepaartes
von ) wirkt in Verbindung mit der
Kaskade . Dies bedeutet, dass die Figur „außer Kontrolle“ jetzt auf das Brett gelegt werden muss und die neue Figur etwas später „in die Hand nehmen“ muss, nachdem Sie zu einem anderen Feld navigiert haben. Im Allgemeinen ist das „Schieben“ von Bewegungen einfach, aber es gibt eine andere Art von Gruppenbewegung bei Abalon:
Ich nenne sie "Querbewegungen". Aus Sicht der ZRF-Codierung sind sie nicht kompliziert. Das Problem liegt in der Benutzeroberfläche. Wie kann man dem Programm „sagen“, dass der Spieler nicht einen Ball, sondern eine Gruppe bewegen möchte, wenn beide Züge nach den Regeln zulässig sind? Ich benutze das gleiche "Blinken", das mir bei Checkern so nützlich war, um die "aktuelle" Zahl zu markieren. Erst jetzt gibt es mehrere "aktuelle" Zahlen im Set.
Ein Klick auf eine "freie" Figur fügt sie der Gruppe hinzu, wenn alle der Gruppe hinzugefügten Figuren beteiligt sind (es ist noch einfacher, die Schaltfläche nicht loszulassen und die gesamte Gruppe mit einem Mausklick hervorzuheben). Wenn es keine solchen Bewegungen gibt, wird nur eine neue Gruppe erstellt, die bisher aus einem Stück besteht. Für die zuletzt hinzugefügte Zahl werden immer grüne Kreise angezeigt (dies ist möglicherweise nicht sehr offensichtlich, aber Sie können sich daran gewöhnen). Durch wiederholtes Klicken auf eine „blendende“ Figur wird die gesamte Gruppe sofort zurückgesetzt.
ÜbrigensGrüne Kreise erscheinen nicht unbedingt nur bei „blendenden“ Figuren. In einigen Fällen ist eine Situation möglich, in der alle ausgewählten Teile in einem gültigen Zug enthalten sind, es jedoch keinen gültigen Zug gibt, der darauf beschränkt ist, nur diese ausgewählten Formen zu bewegen. Es klingt ein bisschen verwirrend, aber hier ist eine Illustration:
In diesem
Spiel sind nur gleichzeitige Züge von Gruppen mit drei Teilen zulässig (wenn weniger Teile übrig sind, sollte sich jeder bewegen). Alle ausgewählten Figuren bewegen sich einen Schritt und in die gleiche Richtung. Schachfang, seine Figuren stören die Bewegung. Um zu gewinnen, müssen Sie mindestens eine Ihrer Figuren in der letzten Reihe im feindlichen Lager halten.
Das Spiel selbst ist meiner Meinung nach nicht sehr interessant, aber aus Sicht der Codierung ist dies ein echter Wahnsinn. Jeder Versuch, „ehrlich“ alle möglichen Bewegungen von Gruppen mit drei Figuren zu erzeugen, führt zu einer kombinatorischen Explosion. Sie müssen tricksen (der Vorteil von Dagaz erlaubt dies). Zunächst generieren wir alle gültigen Züge von Einzelstücken. Das ist einfach:
(define step ( $1 add ))
Bis Sie den möglichen Kampf Ihrer eigenen Figur überprüfen können, das alles später! Wir gehen einfach in alle Richtungen, wo immer es möglich ist. Schalten Sie als nächstes die "
Magie " ein. Wir kombinieren einfach alle möglichen Kombinationen von drei Zügen verschiedener Teile in eine Richtung und bilden so ein kartesisches Produkt. Danach
verwerfen wir Züge, die auf unsere eigenen Teile stoßen.
Warum sie nicht sofort fallen lassen? Aus einem sehr einfachen Grund - ein Stück hat das Recht, sich auf ein besetztes Feld zu bewegen, wenn es als Teil derselben Gruppenbewegung freigegeben wird, und zum Zeitpunkt der Erzeugung der "elementaren" Bewegungen gibt es keine Informationen über die Zusammensetzung der bewegten Gruppen! Deshalb liebe ich dieses Projekt so sehr. Von Zeit zu Zeit wirft er hier so interessante Rätsel!
Das Verschieben muss nicht wie in Abalone auf nur einem Feld erfolgen. In dem 2009 von Dieter Stein erfundenen Spiel
Ordo (und insbesondere in
Ordo X ) können sich Figurengruppen viel weiter bewegen. Die einzige Bedingung ist, dass die Teile ihrer Farbe am Ende des Zuges nicht getrennt werden (dies ist die gleiche Invariante des Spiels wie die Notwendigkeit, dass der König die Bedrohung im Schach verlässt). Der Spieler, der die erste Zeile des Bretts gewinnt, gewinnt.
In diesem Spiel gibt es sowohl Längs- als auch Querbewegungen der „Reihen“ von Stücken beliebiger Größe und Entfernung (natürlich innerhalb des Bretts). Es werden so viele Vorlagen zum Generieren von Zügen verwendet, dass die Verarbeitung einer von mir mit einem
Konverter entwickelten
ZRF-Datei mehr als 5 Minuten dauert (die meisten Spiele werden in Sekunden verarbeitet)! Man könnte annehmen, dass dies zu Problemen in der Phase der Erzeugung der Bewegungen führen würde, aber dies ist nicht so. Die überwiegende Mehrheit der Züge wird durch die
Invariante des Spiels unterbrochen.
Eine weitere Gehirn-Puzzle-Aufgabe tauchte hier aufTatsache ist, dass der Mechanismus der abwechselnden Auswahl von Figuren, den ich für die Durchführung einer Gruppenbewegung entwickelt habe, im Allgemeinen nicht mit der Schnittstelle für "Pushing" -Züge kompatibel ist, die von alten Versionen des Controllers implementiert wurde. Es ist ganz einfach: Um einen "Pushing" -Zug auszuführen, müssen Sie eine Figur auswählen, die in der Lage ist, auf das Feld zu gehen, das bisher von einer anderen Figur der bewegten Gruppe besetzt ist. Wir können das Zielfeld jedoch nicht anzeigen, da die Bildung der Gruppe noch nicht abgeschlossen ist und das Verschieben einer einzelnen Figur auf das besetzte Feld nach den Spielregeln höchstwahrscheinlich verboten ist.
Wenn alles „gemäß den Regeln“ ausgeführt wird, müssen im Allgemeinen alle Figuren der verschobenen Gruppe einzeln angeklickt werden. Erst danach zeigt die Benutzeroberfläche die Zielfelder für die zuletzt hinzugefügte Figur an. Selbst in Abalon mit seinen Gruppen von maximal drei Figuren ist dies etwas anstrengend, aber in Ordo ist es im Allgemeinen undenkbar! Ich musste eine spezielle Methode entwickeln, die die Gruppe automatisch „erweitert“, wenn sie die oben beschriebenen Konflikte erkennt.
So sieht es für Abalone aus Dagaz.Model.closure = function(board, move, group) { var r = []; _.each(group, function(pos) { r.push(pos); }); for (var i = 0; i < r.length; i++) { var pos = r[i]; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null) && (a[0][0] == pos)) { var p = a[1][0]; var piece = board.getPiece(p); if ((piece !== null) && (piece.player == board.player) && (_.indexOf(r, p) < 0)) { r.push(p); } } }); } return r; }
In Ordo sind jedoch lange "Pushing" -Züge zulässig, und dieser Algorithmus funktioniert nicht! Es spielt keine Rolle - alle in Dagaz.Model definierten Funktionen können neu definiert werden.
Auf diese Weise Dagaz.Model.closure = function(board, move, group) { var design = board.game.design; var r = []; _.each(group, function(pos) { r.push(pos); }); for (var i = 0; i < r.length; i++) { var pos = r[i]; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null) && (a[0][0] == pos)) { var target = a[1][0]; var x = Dagaz.Model.getX(pos); var y = Dagaz.Model.getY(pos); var dx = sign(Dagaz.Model.getX(target) - x); var dy = sign(Dagaz.Model.getY(target) - y); var dir = design.findDirection(pos, pos + (dy * Dagaz.Model.WIDTH) + dx); if (dir !== null) { while ((pos !== null) && (pos != target)) { var piece = board.getPiece(pos); if ((piece === null) || (piece.player != board.player)) break; if (_.indexOf(r, pos) < 0) { r.push(pos); } pos = design.navigate(board.player, pos, dir); } } } }); } return r; }
Diese Überlastung ist für
Takoka am
einfachsten . Da es keine "Pushing" -Züge gibt (es ist immer notwendig, alle in der Gruppe enthaltenen Teile klar hervorzuheben), reicht es aus, diese Funktionalität zu blockieren, dh die Gruppe einfach nicht zu erweitern:
Dagaz.Model.closure = function(board, move, group) { return group; }
Ich entschuldige mich für den Funktionsnamen, der niemandem etwas sagt. Ich konnte mir einfach keinen besseren Namen für die Aktion einfallen lassen.

Dieses
Spiel implementiert auch Gruppenbewegungen, aber seine Mechanik ist völlig anders! Hier bewegen sich die Figuren in 3x3 Gruppen, außerdem sind die leeren Felder der Gruppe auch Teil des verschobenen „Musters“. Das Vorhandensein von Figuren auf einem der acht externen Felder zeigt die Richtungen an, in die Sie sich bewegen können, und das Ausfüllen des zentralen Felds bestimmt, ob Sie das "Muster" auf eine beliebige oder nur eine kurze Strecke verschieben können, nicht mehr als 3 Schritte. Um zu gewinnen, muss der "Ring" des Feindes zerstört werden - ein Analogon der königlichen Figur (dies ist ein leeres Feld, das allseitig von acht gefüllten umgeben ist). Sie müssen sehr vorsichtig sein, um Ihren Ring nicht zu zerstören.
GESS erwies sich als wahrer Albtraum, sowohl in Bezug auf "
Magie " als auch in Bezug auf den
Prototyp selbst - das Skelett des Spiels. Es reicht zu sagen, dass die Platine (20x20, unter Berücksichtigung einer Reihe von Feldern außerhalb der Platine) aus zwei Schichten besteht. Die gesamte oberste Ebene ist vollständig mit unsichtbaren Formen gefüllt, die die Bewegung steuern. Die Bewegung der Steine, aus denen die „Muster“ der Spieler bestehen, sind nur Nebenwirkungen dieser Bewegungen. Leider habe ich es noch nicht geschafft, einen Bot für dieses Spiel zu entwickeln.
Am Ende des Artikels möchte ich Ihnen etwas anderes vorstellen, das nicht direkt mit dem Thema Gruppenbewegung von Figuren zusammenhängt. In diesem
Spiel wurde ich gebeten, einen der Abonnenten meiner Projektseite zu gewinnen - Sultan Ratrout. Im Allgemeinen sind dies gewöhnliche
Säulenprüfer auf einem sechseckigen Brett. Auch ohne die Damen. Das Konzept der Revolution ist anders! Das Spielfeld selbst ist transformierbar! Genieße es.
Ich fahre in den Urlaub ...