Die Anforderungen verstehen
- Alle Spieler haben eine begrenzte Anzahl benachbarter Gegner.
Zunächst geht es um die Spawnpunkte der Spieler, nicht um die aktuelle Position der Spieler zu einem bestimmten Zeitpunkt im Spiel. Nur um das aus dem Weg zu räumen.
Angrenzend ist gut definiert, wenn wir über ein Diagramm sprechen. Wir können uns eine Karte vorstellen, die die Navigierbarkeit auf der Karte darstellt - von nun an "die Grafik".
Wenn der Can-Node höchstens einen Spawn-Punkt haben kann, ist es sinnvoll, davon zu sprechen, dass sie "benachbart" sind. Hinweis: Ich werde Knoten aus Gründen, die später ersichtlich werden, nicht dazu zwingen, höchstens einen einzigen Startpunkt zu haben.
Um den Graphen zu erstellen, müssen wir Dinge wie Mauern, Brücken, Leitern, Teleportationspunkte oder sogar den Flugraum berücksichtigen, wenn es einen Spieler geben könnte, der fliegen kann. Jeder Knoten repräsentiert einen überfahrbaren Ort; Jede Verbindung repräsentiert eine mögliche Bewegung.
Hinweis: Größe und Form der Knoten kennen und mit tatsächlich benachbarten Knoten arbeiten. Betrachten Sie Knoten nicht als Punkt. Beachten Sie, dass Verbindungen keine Länge haben. Verwenden Sie auch konvexe Knoten.
Das Diagramm könnte vorkompiliert worden sein (die Karte wurde von einem Designer erstellt); Andernfalls kann es im laufenden Betrieb erstellt werden, wenn die Karte nach dem Zufallsprinzip erstellt wird.
- Alle Spieler haben die gleiche Chance, auf benachbarte Gegner zu treffen.
Ich gehe davon aus, dass Gegner andere Spieler sind. Wieder nur, um das aus dem Weg zu räumen.
Unter der Annahme, dass jeder Spieler einen zufälligen Schritt macht, wird die Wahrscheinlichkeit, einen Spieler an einem bestimmten Punkt zu finden - auf einer ebenen Fläche, frei von Hindernissen - durch eine (Gauß'sche) Funktion der Entfernung zum Startpunkt gegeben - von nun an " Funktion".
Da wir am Diagramm arbeiten, werden wir stattdessen die Werte im Diagramm mit Anmerkungen versehen.
- Die Kartengröße muss sich nicht proportional zur Anzahl der Spieler erhöhen.
Wenn wir die Einschränkung hätten, einen einzelnen Spawn-Punkt pro Knoten zu haben, dann bräuchten wir kleinere Knoten, um mehr Spieler hinzuzufügen. Wenn wir die Grafik festlegen, bevor wir wissen, wie viele Spieler wir haben werden, müssen wir möglicherweise die Knoten für das jeweilige Spiel unterteilen.
- Diese Einschränkungen gelten nicht für unpassierbare Leerzeichen.
Ich habe nicht vor, Hindernisse hinzuzufügen, um das Problem zu lösen. Au contraire muss ich um die Hindernisse arbeiten. Wenn sie nicht da wären, wäre die Implementierung einfacher.
Lösung
Wir versuchen, N Spawnpunkte so zu platzieren, dass die Chance, bei all diesen Spawnpunkten auf einen anderen Spieler zu treffen, gleich ist.
Wir können den Fehler als Summe der Differenzen der Chancen zum Mittel der Chancen messen. Wir versuchen das zu minimieren (in der Tat wollen wir es auf 0 setzen).
Dazu müssen wir die Chance kennen, auf jedem Knoten des Graphen auf einen Spieler zu treffen.
Beginnen Sie mit Null, um diese Chance zu berechnen. Da die Chance, einen Spieler auf einem bestimmten Knoten zu finden, wenn es keine Spieler gibt, Null ist. Gehen Sie dann für jeden Spawnpunkt durch das Diagramm und addieren Sie zur mit Annotationen versehenen Chance den Wert der Funktion für den aktuellen Spawnpunkt.
Hinweis 1: Das Hinzufügen oder Verschieben eines Spawn-Punkts wirkt sich auf die Wahrscheinlichkeit aus, dass auf der gesamten Karte ein Spieler angetroffen wird.
Hinweis 2: Wenn Sie nachverfolgen, wie stark sich jeder Spawn-Punkt auf die Chance auswirkt, wird dies einfacher.
Hinweis 3: Da Knoten eine Größe haben, hängt es von der Größe der Knoten ab, wie nahe Sie an error = zero kommen können. Sie können präziser arbeiten, indem Sie mit Wertebereichen arbeiten (minimale und maximale Wahrscheinlichkeit, abhängig von der jeweiligen Position der Startpunkte innerhalb des Knotens).
Platziere die Spawnpunkte nach dem Zufallsprinzip und beginne sie so zu verschieben, dass der Fehler kleiner wird. Und machen Sie so lange weiter, bis wir uns nicht mehr verbessern können (zu viele Iterationen ohne Verbesserung, oder der Fehler ist Null).
Hinweis 4: Wenn Sie einen Spawnpunkt verschieben, können Sie die Chance nutzen, auf einen Spieler zu treffen (mit Ausnahme des Spawnpunkts, den Sie verschieben), um zufällig eine neue Position für einen Spawnpunkt auszuwählen, an der die Chance besteht, auf einen Spieler zu treffen, der näher ist die Mittelwerte sind wahrscheinlicher. Ich erinnere dich daran, dass das Verschieben des Spawnpunktes den Mittelwert beeinflusst.
Das erwartete Verhalten ist, dass zu nahe beieinander liegende Spawnpunkte auseinander gehen und zu weit auseinander liegende Spawnpunkte näher rücken. Bis sie das Gleichgewicht erreichen.
Wenn Sie bei einer bestimmten Iteration mehrere Spawn-Punkte auf einem Knoten haben (was unwahrscheinlich ist, da diese sich tendenziell verschieben, aber bei genügend großen Knoten möglich sind), teilen Sie den Knoten und fahren Sie mit dem Lösen fort. Jede Unterteilung des Knotens ist gültig.
Die obige Lösung nähert sich dem Fehler = Null, erreicht aber garantiert nicht Null. Sie können es so lange ausführen, bis es ein lokales Minimum erreicht ... Theoretisch können Sie dann die Knoten so unterteilen, dass sie genau Null sind ... Dies entspricht jedoch dem Ändern der Koordinaten des Startpunkts!
Versuchen Sie simuliertes Tempern, um den Startpunkt innerhalb des Knotens zu verschieben. Obwohl es sich, ehrlich gesagt, wahrscheinlich nicht lohnt, sich mit diesem Detaillierungsgrad zu beschäftigen.
Ich möchte klarstellen, dass das Ergebnis für eine flache Karte ohne Hindernisse nicht gleichmäßig verteilte Punkte sein wird. Wenn die Karte Kanten hat (d. H. Wenn sie nicht umbrochen wird), befindet sich mehr Startpunkt näher an den Kanten. Dies liegt daran, dass Punkte in der Mitte aus mehr Richtungen erreicht werden können, was die Wahrscheinlichkeit einer Begegnung erhöht andere Spieler dort. Somit zeigen weiter auseinander in der Nähe der Mitte, um dies zu kompensieren.