So erstellen Sie eine zuverlässige Spielmechanik in Excel. Teil 2

Ursprünglicher Autor: Paul Tozour
  • Übersetzung

In diesem Teil werden wir das Problem der optimalen Platzierung von Waffen auf dem Panzer, die räumliche Lage der Teleporte im MMORPG und das Gleichgewicht der Schlachten von vier Klassen von RPG-Charakteren lösen.

Objektlokalisierungsaufgaben


Tabellen für diesen Teil können Sie hier herunterladen: ( SuperTank ) ( Teleports, Teil 1 ) ( Teleports, Teil 2 )

SuperTank: Problem gelöst!


Im ersten Artikel der Serie haben wir über ein Beispiel für eine Aufgabe für ein Spiel namens SuperTank gesprochen. Im zweiten Teil haben wir uns mit den Grundkonzepten der Lösungsmodellierung vertraut gemacht und ich habe über das Lösen eines einfachen Beispiels mit dem Tool "Suche nach Lösungen" in Excel gesprochen.

Nun können wir das im zweiten Teil gewonnene Wissen auf die SuperTank-Aufgabe anwenden und beweisen, dass mit ihrer Hilfe dieses Problem einfach und schnell gelöst werden kann. Aktualisieren Sie Ihr Gedächtnis: SuperTank ist ein Spiel, in dem Sie in einem eigenen Panzer kämpfen können. Supertank sieht so aus:


Jeder Supertank kann eine beliebige Anzahl von Kanonen mit fünf verschiedenen Typen haben:


Der Supertank kann 50 Tonnen Waffen aufnehmen und der Spieler kann 100 Credits ausgeben. Der Supertank verfügt außerdem über 3 "kritische Schlitze", in denen Spezialwaffen wie MegaRocket und UltraLaser untergebracht sind.

Die Tabelle für dieses Beispiel kann hier heruntergeladen werden .

Das Ziel ist es, Waffen aufzusammeln, die den durch Supertank verursachten Schaden maximieren, ohne die Grenzen von 50 Tonnen, 100 Credits und 3 kritischen Slots zu überschreiten. Wir gehen außerdem davon aus, dass diese Tabelle alle notwendigen Informationen enthält und dass Faktoren wie Reichweite, Häufigkeit und Schussgenauigkeit irrelevant sind oder bereits im Parameter Damage der entsprechenden Waffe berücksichtigt wurden.

Um dieses Schema zu optimieren, geben wir diese Daten zunächst in eine Kalkulationstabelle ein. Unmittelbar darunter werden wir eine weitere Tabelle hinzufügen, in der ein Satz von 5 "quantitativen" Zellen vorhanden ist, um die Anzahl der fünf Waffentypen anzugeben.

Für den Moment geben wir den Wert 1 in diese Zellen ein, nur um ihre Arbeit zu testen, aber dies sind unsere Entscheidungszellen - wir werden das Solver-Tool bitten, die korrekten Werte dieser Zellen zu finden. Sie können verstehen, dass dies Entscheidungszellen in gelber Farbe sind, da wir weiterhin die im zweiten Teil beschriebenen Formatierungsregeln einhalten. Rechts von den „quantitativen“ Zellen werden Berechnungszellen hinzugefügt, die die Werte der Anzahl in den Entscheidungszellen mit den Werten für Schaden, Gewicht, Kosten und kritische Slots aus der obigen Tabelle multiplizieren. Daher spiegelt jede Zeile dieser Tabelle den Schaden, das Gewicht, den Preis und die kritischen Schlitze wider, die für alle verwendeten Waffen in allen Waffenkategorien erforderlich sind.


Wir werden auch einen Abschnitt erstellen, der alle Werte für Menge, Gewicht, Kosten und kritische Zeitbereiche aus der obigen Tabelle zusammenfasst und mit den in den Problembedingungen angegebenen Maximalwerten für Gewicht, Kosten und kritische Zeitbereiche (50, 100 bzw. 3) vergleicht.


In Übereinstimmung mit den Formatierungsregeln aus dem zweiten Teil des Artikels sind die blauen Zellen oben die Kriterien aus den Bedingungen des Problems. Graue Zellen sind Berechnungszellen, die die Gesamtwerte für Gewicht, Kosten und kritische Slots basierend auf der Summation aus der Mengentabelle darstellen (d. H. Die Gesamtwerte der Spalten Gewicht x Menge, Kosten x Menge und kritische Slots x Menge). Schließlich stellt die orangefarbene Zelle den Gesamtschaden unseres Supertanks dar, basierend auf dem Gesamtschaden der Spalte Schaden x Menge in der obigen Tabelle.

Bevor wir mit der Lösung fortfahren, müssen wir unsere Kalkulationstabelle benutzerfreundlicher gestalten. Wir werden die Fähigkeit von Excel verwenden, um jeder Zelle einen Namen zu geben und den sieben Zellen in der letzten Berechnungstabelle eindeutige Namen zu geben. Dies ist optional, aber auf lange Sicht wird dadurch die Kalkulationstabelle deutlich klarer (z. B. wenn die Zelle anstelle von $ F $ 21 als MaxCriticalSlots bezeichnet wird). Dazu wählen wir einfach die Zelle aus und gehen in das Namenseingabefeld links neben dem Formelfeld und geben einen neuen Namen ein.


Jetzt gehen wir endlich zu Excel Solver und suchen nach einer Lösung (gehen Sie zur rechten Seite der Registerkarte "Daten" und wählen Sie "Solver".) Wenn Sie dies nicht sehen, gehen Sie zu "Excel-Optionen" Wählen Sie die Kategorie Add-Ins ("Add-Ins") aus, stellen Sie sicher, dass in der Dropdown-Liste "Verwalten" die Option "Excel-Add-Ins" ausgewählt ist, und klicken Sie auf "Start" Das Kontrollkästchen Solver-Add-In ist aktiviert:

Im Feld "Ziel festlegen" (Zielfunktion optimieren) wählen wir die orangefarbene Zielzelle aus, und klicken Sie unten auf das Optionsfeld " Max" Ändern von Variablenzellen ("Ändern von Zellen von Variablen") Wählen Sie Entscheidungszellen aus (gelbe Zellen in der Spalte Menge der zweiten Tabelle). Klicken Sie unten auf die Schaltfläche Hinzufügen, um die folgenden Einschränkungen hinzuzufügen:

  • Die Werte der Entscheidungszellen sollten im Bereich von 0 bis zu einem vernünftigen Maximum liegen (wir haben 50 gewählt, obwohl dies wahrscheinlich ein viel größerer Grenzwert als notwendig ist). Es ist auch notwendig, die Einschränkung "= Ganzzahl" ("Ganzes") für jede Zelle der Lösung festzulegen, da wir keinen Bruchteil der Waffe haben können und Excel Solver jede Variable standardmäßig als reelle Zahl betrachtet, sofern Sie nicht das Gegenteil angeben.

  • Wir müssen auch die Werte für Gesamtkosten, Gesamtgewicht und Gesamtzahl der kritischen Schlitze auf die Werte aus den Bedingungen des Problems beschränken. Das Bild des Dialogfelds zeigt, dass sie jetzt praktische Namen haben, die wir der unteren Tabelle hinzugefügt haben, sodass das Dialogfeld besser lesbar ist.


Jetzt klicken wir auf die Schaltfläche "Lösen" ("Lösung suchen") und nach einer kurzen Wartezeit füllt Solver die Mengenwerte ein, die uns Folgendes geben:

  • 1 Maschinengewehr
  • 3 Raketen
  • 2 MegaRockets
  • 1 Laser
  • 1 UltraLaser

All dies führt zu einem Gesamtverlust von 83 Einheiten und erfordert genau 50 Tonnen, 100 Credits und 3 kritische Slots. Sie sehen, dass sich die beste Lösung nicht von der Solver-Laufzeit ändert. Wenn Sie diese Werte zurücksetzen und erneut optimieren, oder gehen Sie zu Optionen und ändern Sie den Startwert, erhalten wir immer noch dieselben Werte. Wir können nicht hundertprozentig sicher sein, dass diese Lösung optimal ist, aber angesichts der Tatsache, dass es Solver nach mehreren Optimierungsdurchgängen nicht verbessert hat, ist es mit hoher Wahrscheinlichkeit ein echtes Optimum und nicht nur ein lokales Maximum.

Problem gelöst

Zusätzliche Verwendungen


Das Tolle daran ist, dass wir die Aufgabe nicht nur viel schneller gelöst haben als manuell, sondern auch so eingerichtet haben, dass wir testen können, welche Waffe im SuperTank-Spiel mit verschiedenen Parametern (Gewicht, Kosten, kritische Slots) am nützlichsten ist. Dies bedeutet, dass wir den Effekt verschiedener Änderungen an diesen Parametern im SuperTank-Spiel relativ leicht ändern können. Wenn wir ein neues alternatives Supertank-Modell hinzufügen möchten, das einfacher, härter ist oder eine andere Anzahl an kritischen Slots aufweist, kann dies sehr einfach durchgeführt werden.

Durch die Änderung all dieser Parameter können wir auch die relative Nützlichkeit jeder dieser Waffen verstehen und schnell feststellen, welche von ihnen zu nützlich ist, nicht genug ist und einen Preis hat, der für ihr Gewicht und ihren Schaden ungeeignet ist und so weiter.

Der Punkt ist wiederum, dass ein solches Werkzeug es uns ermöglicht, den Konstruktionsraum viel schneller zu durchsuchen, als wir es von Hand könnten. Es bietet uns eine bequeme Gelegenheit, die Auswirkungen solcher Änderungen mit jeder inkrementellen Konstruktionslösung zu bewerten, die wir entwickeln können, ob nun die Parameter der Waffe oder des Supertanks selbst geändert werden, neue Waffen oder Modelle von Supertanks hinzugefügt werden oder neue Parameter (etwa die Größenbegrenzung in Kubikmetern).

Um zu verstehen, was ich meine, gehen Sie zur blauen Max-Cost-Zelle und ändern Sie ihren Wert von 100 auf 99. Starten Sie Solver erneut und Sie erhalten ein völlig anderes Waffenplatzierungsmuster:

  • 0 Maschinengewehre
  • 2 Raketen
  • 3 MegaRockets
  • 3 Laser
  • 0 UltraLasers

Ein solches Schema ergibt einen etwas kleineren Schadensindikator (82 statt 83), unterscheidet sich jedoch radikal vom vorherigen.

Wenn wir den maximalen Kostenwert 101 oder 102 zuweisen und die Berechnung erneut durchführen, besteht eine Wahrscheinlichkeit, dass wir eine Konfiguration erhalten, die der ersten ähnlich ist oder mit ihr übereinstimmt. Wie dem auch sei, der Schaden bleibt gleich 83 (die Schemata können variieren, da es in solchen Fällen mehrere optimale Schemata gibt). Wenn Sie jedoch den Wert für Max Cost auf 103 setzen, sollten Sie Folgendes erhalten:

  • 1 Maschinengewehr
  • 4 Raketen
  • 2 MegaRockets
  • 0 Laser
  • 1 UltraLaser

Das erhöht den Gesamtschaden auf 84.

Dies ist interessant: Ein solches Waffenplatzierungsschema unterscheidet sich sehr von den ersten beiden.


Wie Sie sehen, erhalten wir ein unerwartetes Ergebnis: Die optimale Auswahl der Waffen in unserem System hängt stark von den Parametern des Supertanks ab und kann sich bereits bei kleinen Änderungen dieser Parameter erheblich ändern. Darüber hinaus gibt es alle möglichen nützlichen Informationen: Alle fünf Waffentypen sind in mindestens zwei der drei Supertank-Einstellungen nützlich, und die Raketen und MegaRockets sind offensichtlich in allen drei Bereichen von Nutzen. Es scheint, dass dies uns sagt, dass alle fünf Waffentypen gut ausbalanciert sind, das heißt, in Bezug auf einander nützlich sind und gleichzeitig einzigartig bleiben.

Und wie Sie auch feststellen können, bieten uns ähnliche Modelle und Lösungsoptimierungen eine hervorragende Gelegenheit, um schnell eine Suche in einer lokalen Umgebung durchzuführen und eine erneute Optimierung durchzuführen. Bei einigen Arten von Aufgaben können wir die dominanten Strategien und Ausnutzungen von Spielern erkennen, die auf andere Weise nur schwer oder gar nicht zu finden sind.

Wurmloch-Teleports


Wenn Sie sich die letzten beiden Beispiele anschauen (Beispiel mit Steuersätzen in einem Strategiespiel und SuperTank), könnten Sie denken, dass solche Techniken nur in Fällen anwendbar sind, in denen sich Benutzer mit Zahlen befassen. Aber du wirst absolut falsch sein! Wie wir sehen werden, gibt es viele Beispiele dafür, dass Sie von der Optimierung von Gestaltungselementen profitieren können, die für Benutzer nicht nur wie Zahlen aussehen, sondern auch überhaupt nicht aussehen!

Vielleicht denken Sie auch, dass die Entscheidungsmodellierung nur für Entscheidungen gilt, die Spieler in Spielen treffen können. Dies trifft auch nicht zu: In manchen Fällen können sie zur Modellierung verwendet werden, um die eigenen Lösungen als Designer zu optimieren.

Angenommen, Sie arbeiten an einem Weltraum-MMORPG. Eines Tages nähert sich Ihr Chefdesigner mit sichtbarer Angst auf seinem Gesicht. "Wir schließen die Neugestaltung des Omega-Sektors ab", sagt er. „Und wir hatten ein Problem. Wir planen, ein paar Wurmloch-Teleports in diesem Segment der Welt hinzuzufügen, aber wir können uns nicht darauf einigen, wo sie platziert werden sollen. "

„Wie viele Teleports?“, Fragst du.

„Wir wissen es noch nicht. Wahrscheinlich drei, aber zwei bis vier. Wir sind uns noch nicht sicher. " Dann zeigt er Ihnen eine Karte, die so aussieht:


"Was ist das?" Sie fragen.

„Dies ist die Omega-Sektorenkarte. Oder zumindest die Sternensysteme, die ein Spieler in diesem Quadranten besuchen kann. Wir müssen bestimmen, in welchen Zellen die Wurmlöcher sein sollten. “

„Nun, okay, aber nach welchen Regeln werden sie aufgestellt? Kann ein Wurmloch in demselben Quadranten wie das Sternensystem platziert werden? «

» Wir möchten, dass Sie das Wurmloch so platzieren, dass der Abstand zwischen einem Sternensystem und dem nächsten Wurmloch minimiert wird. Und ja, Sie können sie in den gleichen Quadranten wie das Sternensystem stellen; Dies sind nur kleine Teleports, die im Weltraum hängen und somit überall aufgestellt werden können. Und denken Sie daran, dass wir noch nicht entschieden haben, wie viele es sein sollte, also geben Sie mir Lösungen für 2, 3 und 4 "Wurmlöcher". "

Wie formulieren Sie dieses Problem und wie lösen Sie es?

Teleports optimieren!


Beginnen wir mit der Vorbereitung der Lösungszellen. Bezeichnen Sie vier Teleports als A, B, C und D. Wir wissen, dass jeder Teleport im Wesentlichen nichts anderes ist als die Koordinaten (x, y) auf der Sternenkarte des Omega-Sektors. Wir wissen auch, dass wir einen Weg benötigen werden, um die Anzahl der aktiven Teleports festzulegen. Deshalb werden wir eine Zelle hinzufügen, in der wir die Anzahl der Teleports festlegen können. Wir verwenden Teleportation D nur, wenn 4 "Wurmlöcher" verwendet werden, und C - nur, wenn wir 3 oder mehr haben.


Im Folgenden erstellen wir eine Tabelle zur Berechnung der Entfernung von jedem Sternensystem zum nächstgelegenen Teleport. Diese Tabelle sieht folgendermaßen aus:


Das linke Blau zeigt die Koordinaten jedes Sternensystems auf der Karte. Jede Linie ist ein Sternensystem. Wir haben sie gerade von der Omega-Sektorenkarte übernommen, die der führende Designer uns gegeben hat.

Auf der rechten Seite berechnen wir die Entfernung zu jedem der vier Teleports. Dies ist nur der Satz des Pythagoras. Die Entfernung wird als Quadratwurzel der horizontalen und vertikalen Entfernung zwischen dem Sternensystem und dem Teleport berechnet:

= SQRT (($ B14-Axe) ^ 2 + ($ C14-Ay) ^ 2)

(Keine Sorge - ich verspreche Ihnen, dass dies die schwierigste Mathematik ist, die wir in der Serie treffen werden!)

Wir nehmen die X- und Y-Koordinaten jedes Sternensystems aus den blauen Zellen in der obigen Tabelle und die X- und Y-Koordinaten jedes Teleports (die Zellen mit den Namen Ax und Ay für A in der obigen Funktion SQRT ()) teleportieren - aus den gelben Zellen der obigen Lösungen.

Schließlich nehmen wir das Minimum dieser vier Werte in der Spalte Dist to Closest, das heißt, wir verwenden einfach die Funktion MIN (), um das Minimum der vier Werte auf der linken Seite zu bestimmen. Dann fassen wir die ganze Spalte unten zusammen; Summe ist die Zielzelle.

Sie haben vielleicht bemerkt, dass im obigen Screenshot alle Zellen Dist zu D sind. Der Grund ist, dass wir die Zelle „Anzahl der Teleporter?“ Im oberen Teil des Entscheidungsmodells verwenden, wodurch wir die Anzahl der zu zählenden Teleports anpassen können. Wenn die Anzahl der Teleports 2 ist, verwenden wir den Wert 99 sowohl in Dist zu C als auch in Dist zu D, und wenn es 3 ist, wird der Wert 99 nur in der Spalte Dist zu D verwendet, sodass jedes Sternsystem alle zusätzlichen Teleports ignoriert. bei der Berechnung der Entfernung zum nächstgelegenen Teleport bei 2 oder 3 Teleports.

Jetzt werden wir Solver starten:


Die Zielzelle ist die Summe am unteren Rand der Spalte Dist to Closest. Beachten Sie, dass wir hier, im Gegensatz zu anderen Beispielen, das Optionsfeld "An: Min" verwenden möchten, da wir den Mindestabstand zwischen allen Sternsystemen und Teleports und nicht den Maximalwert benötigen.

Im Folgenden geben wir acht gelbe Zellen der X- und Y-Koordinaten der Wurmlöcher A, B, C und D als Entscheidungszellen an ("Durch Ändern variabler Zellen"). Im Abschnitt "Einschränkungen" beschränken wir jede der Koordinaten auf einen ganzzahligen Wert im Bereich von 0 bis 12. Beachten Sie, dass wir für diese Entscheidungszellen eine Ganzzahleinschränkung verwenden, da der Lead Designer nur wissen möchte, in welcher Zelle sich jeder Teleport befindet. Wir können diese Einschränkung jedoch leicht überspringen, wenn der Designer echte Koordinaten benötigt.

Wenn wir die Werte 2, 3 und 4 für „Anzahl der Teleporter?“ Festlegen und Solver nacheinander mit jedem Wert ausführen, erhalten wir die folgenden Konfigurationen:


Mit diesen Informationen können wir zum Hauptdesigner gehen und ihm die optimalen Orte für das Auffinden einer beliebigen Anzahl von Teleports im Bereich von 2 bis 4 zeigen. Hier sehen Sie, wie die optimalen Wurmlochpositionen für 2, 3 und 4 Teleporte auf der Karte aussehen (grün dargestellt).


Die Tabelle für dieses Beispiel kann hier heruntergeladen werden .

Habe ich über Ninjas gesprochen?


„Erstaunlich“, sagt der Chefdesigner, aber man sieht Leiden auf seinem Gesicht. „Äh, aber ich habe vergessen zu sagen, dass einige dieser Systeme von Weltraum-Ninjas besiedelt sind. Und wir möchten, dass Systeme mit Ninjas weiter von Wurmlöchern entfernt sind, damit sich die Spieler nicht übermäßig bedroht fühlen. “

„Wow. Es verändert die Dinge völlig. “

„Genau. Außerdem gibt es in einigen Sternensystemen nicht nur eine, sondern zwei Kolonien, dh es ist doppelt so wichtig, dass sie sich in der Nähe von Teleports befinden. Oder es ist doppelt so wichtig, weiter zu sein, wenn es sich um ein System mit zwei Weltraum-Ninja-Kolonien handelt. So sieht die Karte jetzt aus: "


Er fährt fort: „Jede negative Zahl ist eine Weltraum-Ninja-Kolonie. Das System mit der Nummer 2 enthält zwei menschliche Kolonien, und mit der Zahl -2 gibt es zwei Ninja-Kolonien. Kannst du

mir sagen , wo die Teleporter in diesem Fall platziert werden sollen? « » Sag mal, hast du wenigstens schon entschieden, wie viele Teleporter es sein wird: 2, 3 oder 4? «, Fragst du verlegen.

"Ich habe Angst noch nicht."

Wir entscheiden unter Berücksichtigung des Ninja


Um dieses Problem zu lösen, müssen Sie der Tabelle eine neue Spalte hinzufügen, die die Gewichte der Tabelle angibt. Wir nennen es einen Multiplikator. Wir multiplizieren diesen Wert einfach mit dem Wert in der Spalte "Abstand zum nächsten".

Wenn wir dies tun, ändert Dist to Closest geringfügig seine Bedeutung. Dies ist jetzt nicht die Entfernung zum nächstgelegenen Sternensystem, denn bei Sternensystemen von Ninjas ändert sich der Wert um den Faktor -1. Es sieht eher nach verallgemeinerten "Punkten" (Score) aus, also nennen wir sie so.


Somit repräsentieren Punkte jetzt den kumulierten Wert. Durch die Minimierung stellen wir sicher, dass Solver bestrebt ist, Systemen mit menschlichen Kolonien und möglichst weit entfernt von bevölkerten Ninja-Systemen so nahe wie möglich zu sein.

Nun erhalten wir folgende Ergebnisse:


Wie Sie sehen, erhalten wir so die Konfiguration von Teleports, die sich von den einfacheren Versionen ohne Ninjas jeweils sehr unterscheiden.


Die Tabelle für diese erweiterte Version des Teleport-Beispiels kann hier heruntergeladen werden .

Wie Sie sehen, konnte unser Lösungsmodell diese nicht triviale Aufgabe schnell lösen und wir können sie an veränderte Anforderungen anpassen.

Diese Aufgabe gehört zu einer Klasse von Aufgaben, die als "Objektlokalisierungsprobleme" bezeichnet werden und im Bereich des Betriebsmanagements sehr gut untersucht sind. Wie Sie jedoch sehen können, können sie potenziell sowohl im Spieledesign als auch im Leveldesign verwendet werden. Die Lösung ist in Excel einfach (wenn auch nicht trivial).

Ausgleichsklassen für Kämpfe Spieler gegen Spieler


Die Kalkulationstabelle für diesen Teil kann von hier heruntergeladen werden: Link

Tabellenkalkulationen und Simulationen


In den vorherigen drei Teilen dieser Artikelserie haben wir das Konzept der Modellierung und Optimierung von Lösungen sowie das Tool "Search for solutions" (Solver) von Excel kennengelernt. Wir haben gezeigt, wie sie verwendet werden können, um die optimalen Stadtsteuersätze in 4X-Strategien zu berechnen, die optimale Platzierung von Teleports im Weltraumspiel zu bestimmen und das optimale Waffenlayout für die im ersten Teil beschriebene Supertank-Aufgabe auszuwählen.

Es stellt sich eine natürliche Frage: Wie ist es, das Spiel auszugleichen? Ist es möglich, solche Techniken auf alle Arten von komplexen Ausgleichsaufgaben anzuwenden, die in vielen verschiedenen Spielarten vorkommen, insbesondere in Strategien, RPG und MMORPG?

Die Antwort auf diese Frage: Ja natürlich, aber mit vielen Vorbehalten. Insbesondere Tabellenkalkulationen unterliegen vielen Einschränkungen, da sie das Spiel in den meisten nicht-trivialen Fällen nicht genau beschreiben. Daher ist es schwierig für uns, ein zuverlässiges Auswuchten mit Optimierungstechniken durchzuführen. Die eigentlichen Probleme beim Ausgleich der überwiegenden Mehrheit der Spiele werden weit über das hinausgehen, was wir in einer Tabelle modellieren können. Die Simulation des Spiels selbst ist in der Regel zu kompliziert, hat viele bewegliche Teile und wird häufig in Echtzeit ausgeführt. Wenn Sie versuchen, eine diskrete Simulation durchzuführen, können wir mit allen möglichen Problemen konfrontiert werden.

Deshalb, wenn wir ähnliche Techniken zum Ausgleichen von Klassen in MMORPGs wie WildStar oder strategischen Spielen wie verwenden wolltenPlanetary Annihilation . Um zumindest etwas Genauigkeit und Nützlichkeit zu gewährleisten, müssten wir sie in die Spielsimulation selbst integrieren.

Die Wahrheit ist außerdem, dass einige Aspekte des Ausgleichs nicht automatisiert werden können. Wie im ersten Teil des Artikelserläutert, ist das Spielgefühl nicht automatisch einstellbar.

Das Beste, auf das wir hoffen können, ist die Demonstration eines einfachen Beispiels, das eine allgemeine Herangehensweise an Aufgaben dieser Art veranschaulicht: Mit einem einfachen Beispiel in Excel lernen wir, wie man diese Art von Ausgleichsproblemen angehen und optimieren kann. Wir zeigen, dass Solver, zumindest für ein Beispiel eines einfachen Kampfes, ein gutes Gleichgewicht zwischen mehreren RPG-Klassen im Verhältnis zueinander erzielen kann. Dann können Sie diese Basisstruktur als Grundlage für die Lösung solcher Optimierungsprobleme mit einem komplexeren Schema verwenden, das tiefer in die Simulation des Spiels integriert ist.

Wir hoffen, dass Sie mit uns alle Tricks lernen und sehen, was dieses einfache Beispiel uns geben kann.

Balancing nicht definiert


Es gibt keine allgemein akzeptierte Definition des Wortes "Ausgleich". Es hat viele Bedeutungen, und die wahre Bedeutung hängt normalerweise vom Kontext des jeweiligen Spiels ab. Unter verschiedenen Bedingungen kann Balancing mit dem Einrichten mehrerer Klassen von Charakteren verbunden sein, um ihre Fähigkeiten in einem Rollenspiel auszugleichen, mit der Anzahl der gegnerischen Kräfte, die in einem strategischen Spiel gegeneinander antreten, oder mit der Anpassung der Kosten verschiedener Einheiten oder Ressourcen entsprechend ihrer Nützlichkeit.

Die beste Definition von "Balancing" hängt normalerweise von den Designzielen des jeweiligen Spiels ab. Da diese Ziele jedoch beliebig sein können, ist es nicht möglich, a priori zu bestimmen, was Balancing für Spiele im Allgemeinen bedeutet.

Einige Spieler neigen zu der Ansicht, dass das Ausgleichen in der Schlacht den gleichen Schaden bedeutet. Dies gilt insbesondere für MMORPGs, bei denen Spieler oft beschweren, dass der Schaden pro Sekunde (DPS) einer Klasse im Vergleich zu anderen Klassen zu klein oder zu groß ist.

Natürlich können Klassen nicht nur von DPS ausgeglichen werden. Es ist akzeptabel, dass eine Klasse mehr DPS als die andere hat, dies sollte jedoch durch andere Faktoren kompensiert werden, die den Gesamtnutzen der Klasse einschränken, z. B. ein verringertes Überleben oder weniger langfristige DPS im Vergleich zu kurzfristigen DPS.

Kleines MMO


Stellen Sie sich vor, wir erstellen ein neues Projekt, ein sehr vereinfachtes Multiplayer-Online-Rollenspiel mit dem Namen "Tiny MMO". Als Teil des Designs bemühen wir uns, die vier Klassen für Spieler-gegen-Spieler-Kämpfe (PVP) so auszugleichen, dass alle vier Klassen im Kampf relativ gleich sind und es keine offensichtliche "beste" oder "schlechteste" Klasse gibt Sie können gegen andere Klassen kämpfen.

Obwohl „Tiny MMO“ ein Echtzeitspiel ist, dauert die Aktion jedes Spielers genau 3 Sekunden, sodass wir es ausprobieren können, indem wir es als rundenbasiertes Spiel präsentieren, in dem jede Runde ein drei Sekunden dauerndes Gameplay ist.

Spieler in diesem Spiel können eine von vier Charakterklassen wählen:

  • Krieger (Krieger) verursacht den meisten Schaden
  • Magier wirkt Zauber aus der Ferne und hat die größte Angriffsreichweite aller vier Klassen.
  • Heiler (Heiler) wird automatisch behandelt und stellt für jede Bewegung einen bestimmten Teil ihrer Gesundheit wieder her
  • Barbar (Barbar) hat die meiste Gesundheit

Dies ist alles, was wir über diese vier Klassen wissen, und wir müssen die anfänglichen Parameter für Gesundheit (HP), Schaden, Heilung und Angriffsbereich für alle vier Klassen festlegen. Wir müssen sie so ausbalancieren, dass jede Klasse einzigartig ist und sich ihre Merkmale deutlich von allen anderen Klassen unterscheiden. Als Folge davon ist jede Klasse im Hinblick auf die drei anderen Klassen so "ausgewogen" wie möglich.

Mit anderen Worten, wir möchten die folgende Tabelle optimieren:


Vorläufig verwenden wir temporäre Werte und gehen davon aus, dass jede Klasse mit 50 HP beginnt, 10 Punkte Schaden pro Runde verursacht, 0 HP pro Runde heilt und eine Angriffsreichweite von 40 Metern hat. Jeder Charakter bewegt sich mit einer Geschwindigkeit von 10 Metern pro Spielzug. Da das Design festlegt, dass sich alle vier Klassen von Charakteren mit derselben Geschwindigkeit bewegen können, wird dieser Wert als konstant betrachtet und die Bewegungsgeschwindigkeit wird nicht in die Tabelle der Entscheidungsvariablen eingetragen.

Offensichtlich ist dies ein Trainingsbeispiel mit einem sehr vereinfachten Schadensmodell. Dies ist ein kontinuierlicher durchschnittlicher Schadenswert pro Sekunde, der die Unterschiede im Impulsschaden durch Langzeitschaden sowie Mana und andere Mechanismen, die die Angriffsfähigkeiten der Klasse verändern, ignoriert. Wir werden nur eine Art von Schaden haben, was ziemlich unrealistisch ist, da die meisten Klassen Dutzende Arten von Schäden haben und wir ein KI-System implementieren müssen, das in jeder Runde einen Angriff auswählt. Darüber hinaus hat der Schaden in den meisten Spielen ein zufälliges Element, aber zunächst werden wir ihn weglassen und davon ausgehen, dass die Variabilität des Schadens nicht so groß ist, dass er das Ergebnis des Kampfes zwischen den beiden Klassen erheblich beeinflusst.

Natürlich ist es unwahrscheinlich, dass ein in Excel durchgeführter Abgleich perfekt ist oder mit dem endgültigen Abgleich des Spiels übereinstimmt. Sie wird viele Wiederholungstests durchlaufen müssen. Wenn wir jedoch ein oder zwei Stunden damit verbringen, eine gute erste Option für unser Excel-Spiel zu erhalten, werden wir uns zumindest mit größerer Wahrscheinlichkeit den Qualitätsparametern des ursprünglichen Gleichgewichts nähern, was uns dem endgültigen Gleichgewicht näher bringt, das wir erreichen möchten.

Tabelle gewinnt


Wir müssen die vier Klassen in einem Zweikampf miteinander ausgleichen. Da wir nur 4 Klassen haben (Warrior, Mage, Healer und Barbarian), gibt es insgesamt 6 mögliche Kombinationen verschiedener Klassen:

  • Krieger - Magier
  • Krieger - Heiler
  • Krieger - Barbar
  • Magier - Heiler
  • Magier - Barbar
  • Heiler - Barbar

Ein solcher Abgleich kann ziemlich kompliziert sein. Selbst in unserem eher einfachen Fall mit vier Klassen haben wir sechs Beziehungen zwischen den Klassen, genauso wie wir sechs Linien zwischen vier Punkten eines Quadrats zeichnen können.


Jedes Mal, wenn wir nur eine kleine Änderung in einem der Parameter einer der Klassen vornehmen möchten, wirkt sich diese Änderung auch auf den PvP-Ausgleich zwischen diesem Klassenpaar und den beiden anderen Klassen aus. Diese Power-Interconnectivity mit zunehmender Anzahl von Klassen wird nur noch zunehmen, und Entscheidungen über den Ausgleich des PvP zwischen beliebigen Klassenpaaren, die im Vakuum gemacht werden, ohne alle anderen Wechselwirkungen zu berücksichtigen, können sehr gefährlich werden.

Im Idealfall möchten wir eine bestimmte Tabelle von Siegen erstellen .wie der unten gezeigte. Wenn wir einen Kampf zwischen jedem dieser 6 Paare in einer Kalkulationstabelle simulieren können, können wir für jedes der 6 Paare eine Art "Punktvariable" generieren. Je mehr Punkte, desto besser können wir alle sechs Punkte kombinieren, um eine Zielfunktion zu generieren.


Beachten Sie, dass in der oben gezeigten Tabelle die Zellen entlang der Diagonalen Null sind, da sie Paare der gleichen Klasse bezeichnen, die per Definition ausgeglichen werden. Außerdem sind die Zellen in der oberen rechten Ecke ebenfalls Null, da sie genau dieselben Paare wie in den Zellen in der linken unteren Ecke bezeichnen.

Lassen Sie uns nun ein Modell für den Kampf zwischen zwei verschiedenen Klassen vorbereiten.

"Kampfsimulator"


Platzieren Sie jedes Klassenpaar in einem Abstand von 100 Metern. Jeder Charakter hat 3 Sekunden, um anzugreifen, so dass wir ihn als eine schrittweise Simulation präsentieren können, in der jede „Bewegung“ 3 Sekunden bedeutet. Bei jeder „Bewegung“ greift jeder Charakter entweder den anderen an, wenn er sich innerhalb der Reichweite des Angriffs befindet, oder bewegt sich weiter, um die Entfernung zu verkürzen.

Die Simulation sieht so aus:


Oben zeigt ein Paar Charaktere, die sich der Schlacht angeschlossen haben: In diesem Fall sind es Magier (Klasse 1) und Heiler (Klasse 2). Die linke Spalte zeigt den aktuellen Abstand zwischen zwei simulierten Zeichen.

Für jedes Zeichen sind die Spalten wie folgt:

  • Max. Reichweite : Dies ist die maximale Entfernung, mit der ein Charakter angreifen kann. Es wird direkt von den gelben Entscheidungsvariablen in der Entscheidungsvariablentabelle übernommen.
  • Heilung : Dies ist der Betrag der Charakterbehandlung pro Spielzug, der direkt aus der Entscheidungsvariablentabelle erhalten wird.
  • HP : Dies ist die Gesundheit eines Charakters in jeder Runde. Anfangs entspricht es dem entsprechenden Wert von HP aus der Tabelle der Entscheidungsvariablen, nimmt jedoch mit der Zeit ab, wenn ein anderer Charakter angreift. Sie erhöht sich in jeder Runde um die Menge der Behandlung, die ein Charakter in jeder Runde auf sich selbst anwenden kann.
  • Schaden : Die Menge an Schaden, die ein Charakter einem Gegner zufügt, wenn er sich in Reichweite des Angriffs befindet. Wenn ein Zeichen stirbt, fällt dieser Wert auf 0.
  • Angriffe? : Diese Spalte prüft, ob sich der Charakter im Angriffsbereich befindet. Wenn ja, bedeutet dies, dass der Charakter im aktuellen Verlauf angreift; Andernfalls rückt der Charakter näher an den anderen Charakter heran.

Daher bewegen sich beide Charaktere aufeinander zu und greifen dann an, bis einer oder beide sterben. Jeder Charakter bewegt sich alle 3 Sekunden um 5 Meter (5 Meter pro "Zug"). Wenn sich beide Charaktere aufeinander zu bewegen, ändert sich der Bereich in jeder Runde um 10 Einheiten und um 5 Einheiten, wenn sich nur eine von ihnen bewegt. Das Spiel selbst ist so aufgebaut, dass sich beide Charaktere gleichzeitig bewegen können. Danach ist der Zug zur gleichen Zeit erlaubt, sodass möglicherweise beide Charaktere gleichzeitig sterben.

Als Nächstes müssen wir die Bewertung für diese Tabelle einrichten und einen numerischen Wert generieren, der angibt, wie gut der Kampf war. Mit anderen Worten, wie nah sind wir an der Erreichung unserer Designziele?

Natürlich möchten wir, dass beide Charaktere bis zum Ende der Schlacht oder zumindest so nah am Tod wie möglich tot sind. Wenn die Schlacht ausgeglichen ist, sollten beide Kampfklassen die Gesundheit des Gegners am Ende der Schlacht verringern.

Dies allein reicht jedoch nicht aus. Wenn wir die Wertung auf diese Weise organisieren, maximiert der Optimierer einfach die Schadenswerte, sodass sich beide Charaktere sofort gegenseitig töten! (Wenn Sie neugierig sind, ändern Sie die dem Artikel beigefügte Tabelle, um sich selbst ein Bild zu machen.) Natürlich streben wir nicht den sofortigen Tod an: Wir brauchen beide Charaktere am Ende der Schlacht tot oder fast tot, aber gleichzeitig wollen wir, dass die Schlacht eine angemessene Zeit dauert.

Mit anderen Worten, wir sind nicht nur bestrebt, eine relativ gleichmäßige Balance aller Klassen gegeneinander sicherzustellen; Wir möchten auch das Gleichgewicht interessant machen , einschließlich der Kämpfe, die die entsprechende Zeitdauer aushalten.

Um eine solche Bilanzschätzung zu erstellen, müssen wir rechts neben jeder Tabelle mehrere Zellen erstellen. Dauer gibt die Dauer des Kampfes an; es zählt die Anzahl der Zeilen in der Tabelle, in denen beide Zeichen noch leben. Gesamt-HP berechnet die gesamten Trefferpunkte der zwei überlebenden Charaktere. Idealerweise sollte es 0 sein, dh, wenn der Kampf endet, sterben beide Charaktere.


I. Schließlich kombiniert Score die Dauer und die Gesamtzahl der Trefferpunkte im Formular (Dauer / (1 + Gesamt-PS)). Beachten Sie, dass wir den Divisor um 1 erhöht haben, da Total HP gleich 0 sein kann. In diesem Fall würden wir einen Fehler durch Nullen erhalten. So können wir garantieren, dass wir den Optimierer für die Ermittlung der maximalen Kampfdauer und des Mindestwerts der Summe der Trefferpunkte belohnen .

(Beachten Sie, dass wir in jeder „Simulation“ von Klasse zu Klasse 17 Zeilen haben. Dies bedeutet, dass wir im Wesentlichen eine Entwurfsentscheidung getroffen haben, dass die Schlacht ungefähr 17 Runden dauern sollte länger können Sie die Anzahl der Zeilen ändern, die Formeln für die Schätzung der Bewertung entsprechend bearbeiten und die Neuoptimierung durchführen.)

Schließlich nehmen wir diese sechs Score-Werte (einen für jede Tabelle) und verwenden sie in der obigen Siegestabelle, um die Ergebnisse des Kampfes zwischen jedem der Klassenpaare anzuzeigen.

Sie können diese sechs Bewertungen einfach zusammenfassen und das Ergebnis als endgültigen Ergebniswert verwenden. Wenn wir dies tun, wird Solver jedoch höchstwahrscheinlich keine gute Balance zwischen den höchsten und den niedrigsten Stufen für die einzelnen Schlachten finden können, und er erhält auch sehr hohe Noten für einige Klassenpaare und niedrige Bewertungen für andere. Wir wollen das nicht: Wir brauchen alle Noten, um hoch zu sein, und wir bemühen uns, sie alle anzuheben. Um dies zu beheben, multiplizieren wir die Summe der Schätzungen mit der kleinsten Gruppenauswertung (mithilfe der Excel-Funktion MIN ()), damit sich Solver auf die Schätzungen mit dem niedrigsten Wert konzentriert.

Einschränkungen hinzufügen


Wir sind noch nicht fertig. Wenn Sie das Entscheidungsmodell mit den aktuellen Parametern optimieren, werden die Klassen höchstwahrscheinlich falsch konfiguriert. Tatsächlich schreibt das Modell höchstwahrscheinlich die gleichen Werte wie HP, Schaden, Heilung und Bereich in die Tabelle der Entscheidungsvariablen.

Und natürlich möchten wir, dass jede Klasse ihre eigene Individualität hat. Wir brauchen Krieger, um den größten Schaden zu verursachen, Mage hat die größte Reichweite, Heiler hat den höchsten Heilungswert und Barbar hat die meisten HP. Wir möchten auch, dass diese Unterschiede nicht zu klein sind - wir müssen diese Klassen sehr stark voneinander unterscheiden.

Dazu erstellen wir eine kleine Tabelle mit Einschränkungen. Diese Tabelle stellt sicher, dass jede der vier Klassen ein entsprechendes Attribut besitzt und anschließend eine Bewertung von 0 oder 1 erhält, abhängig davon, ob die Einschränkungsbedingung erfüllt ist.


Die Tabelle "Min. Differenz" rechts zeigt die minimale Differenz jedes Klassenattributs relativ zu allen anderen Klassen an. Mit anderen Worten, der Krieger sollte mindestens 4 HP mehr Schaden als alle anderen Klassen haben, der Magier sollte eine Angriffsreichweite von mindestens 10 mehr haben und so weiter.

Jetzt, da wir diese speziellen Einschränkungen hinzugefügt haben, ist es Zeit zu optimieren!

Suche nach Lösungen


Jetzt können wir das integrierte Solver-Tool von Excel („Search for Solutions“) ausführen, um die Anfangsparameter zu optimieren. Als Zielzelle wählen wir die Score-Zelle aus, die die Ergebnisse aller sechs Turniere kombiniert. Wir legen fest, dass die Entscheidungsvariablen alle 16 Zellen in der gelben Entscheidungsvariablentabelle enthalten, die wir zu Beginn erstellt haben.

Wir setzen die Einschränkungen auch (im Feld Betreff der Bedingungen) wie folgt:

  • Alle Entscheidungszellen müssen Ganzzahlen mit einem Mindestwert von 0 sein.
  • Alle Zellen in der HP-Säule sollten einen Maximalwert von 200 und einen Mindestwert von 30 haben.
  • Alle Zellen in der Damagespalte haben einen Maximalwert von 20.
  • Alle Zellen in der Spalte "Heilung" haben einen Maximalwert von 15.
  • Alle Zellen in der Spalte "Bereich" haben einen Maximalwert von 100.
  • Außerdem müssen alle vier Zellen in einem bestimmten Abschnitt der Einschränkungen auf 1 gesetzt werden, damit ihre besonderen Bedingungen erfüllt werden.


Wählen Sie schließlich den evolutionären Wert für die Lösungsmethode und starten Sie Solver. Da dies ein evolutionärer Algorithmus ist, besteht die Möglichkeit, die Lösung zu verbessern, die während des zweiten oder dritten Solver-Laufs oder nach dem Einstellen der Parameter (Schaltfläche "Optionen") für die evolutionäre Optimierung gefunden wurde.

Als Ergebnis sollten wir so etwas haben:


... und wie magisch der Löser uns eine gute Ausgangskonfiguration gab.

Wie Sie sehen, verursacht der Krieger jetzt den größten Schaden, der Magier hat die größte Reichweite, der Heiler heilt den besten und der Barbar hat die meisten HP. Darüber hinaus können Sie auf die Ergebnisse einzelner „Klasse-gegen-Klasse“ -Turniere eingehen und sehen, wie sich Klassen im Kampf miteinander manifestiert haben. Wie Sie sehen, sind die meisten von ihnen sehr ausgeglichen - am Ende des Kampfes sterben beide Klassen, oder eine von ihnen überlebt kaum. Darüber hinaus dauern alle Turniere lang genug, keine der Klassen kann nicht "voshotny" die anderen.

Nicht schlecht für ein paar Stunden, oder?

Fazit


In diesem Beispiel haben wir ein einfaches Auswuchtproblem erstellt und gezeigt, dass wir dieses Problem durch Simulation und Optimierung lösen können. Obwohl es offensichtlich ist, dass dies ein einfaches Beispiel ist, zeigt es uns die Leistungsfähigkeit von Modellierungs- und Optimierungstechniken für Lösungen. Darüber hinaus kann es eine Inspirationsquelle sein, die in komplexeren Auswuchtwerkzeugen verwendet werden kann, die eng in die Simulation des Spiels integriert sind. Wir hoffen, dass Sie dieses Beispiel als Leitfaden für die Formulierung solcher Aufgaben in der Praxis verwenden können.

In den nächsten beiden Teilen der Serie werden wir in das Feld der Zuweisungsprobleme eintauchen, das mit der Wahl der optimalen Zuweisungen aus zwei oder mehr Entitätssätzen zusammenhängt. Wir werden zeigen, wie diese Aufgaben zu lösen sind, und zeigen, wie dieser Ansatz verwendet wurde, um das Design der Türme in unserem Strategiespiel für iOS / Android City Conquest zu erstellen .

Jetzt auch beliebt: