Wenn alle Spieler auf zufälligen Positionen in der gleichen Entfernung zu benachbarten Spielern erscheinen, ist die Anzahl der Spieler proportional zur Wahrscheinlichkeit, dass ihre Spawn-Positionen ungerecht sind. Je näher die Spieler der Kartenmitte kommen, desto wahrscheinlicher ist es, dass sie auf andere Spieler treffen und desto unwahrscheinlicher ist es, dass sie überleben, verglichen mit Spielern am Rand der Karte. Angenommen, alle Spieler werden gleichzeitig erzeugt.
Gibt es eine Möglichkeit, Spawnpunkte zu formen oder die Karte zu ändern, so dass:
- Alle Spieler haben eine begrenzte Anzahl benachbarter Gegner.
- Alle Spieler haben die gleiche Chance, auf benachbarte Gegner zu treffen.
- Die Kartengröße muss sich nicht proportional zur Anzahl der Spieler erhöhen.
- Diese Einschränkungen gelten nicht für unpassierbare Leerzeichen.
Die Antwort muss nicht perfekt sein, nur offensichtlich besser als die Alternative. Out-of-the-Box-Denken willkommen.
game-design
level-design
Unangemessener Code
quelle
quelle
Antworten:
Lassen Sie die Spieler ihre Startpositionen selbst auswählen.
Laichen Sie zu Beginn des Spiels alle Spieler in der Mitte der Karte, ohne die anderen Spieler zu verletzen. Sie müssen sich dann austoben und die Mittel beschaffen, um sich gegenseitig anzugreifen (eine Basis aufbauen, eine Waffe aufheben, Ressourcen sammeln usw.).
Je nachdem, ob Sie prozedurale oder handgefertigte Karten verwenden, müssen Sie entweder ein bisschen Glück oder Kartenwissen mitbringen, um einen guten Startort frühzeitig zu finden. Aber wann und wo man sich niederlässt, ist meist eine strategische Entscheidung. Eine frühzeitige Bereitstellung bietet Ihnen einen Zeitvorteil, bringt Sie jedoch in eine gefährliche Position. Wenn Sie Ihre Basis sorgfältig auswählen, bleiben Sie im frühen Spiel zurück, können aber im mittleren und späten Spiel einen entscheidenden Vorteil haben.
quelle
Die Anforderungen verstehen
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.
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.
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.
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.
quelle
Es hängt davon ab, welche Art von Spiel Sie erstellen möchten und wie schnell es ist. Die perfekte gleichmäßige Verteilung ist auf einer Kugel wie der Welt möglich (zum Beispiel Planetary Annihilation). Aber ist das eine faire Option in Ihrem Spiel? Selbst wenn alle Leute auf gleicher Distanz laichen, haben manche Brut einen besseren Vorteil.
Ist Ihre Karte eine feste oder eine prozedural erzeugte? Und haben Sie jemals versucht, Age of Empires mit 8 Personen auf einer 2-Personen-Karte zu spielen? Es ist nicht möglich, die Spieler unendlich zu skalieren, ohne die Kartengröße anzupassen. Sogar eine unfaire Startplatzierung kann viel Dynamik in das Spiel bringen (siehe die Worms-Serie). Niemand hat sich beschwert, wenn Sie direkt in einer großen Gruppe aufgetaucht sind, solange Ihre einrundige Allianz mit einem anderen Spieler andauerte oder Sie nach der ersten Runde nicht die überlebendsten Würmer hatten.
(Ich werde ein paar weitere Beispiele hinzufügen, wenn ich mehr über Ihre Art von Spiel weiß.)
quelle
Gehen Sie für etwas, das bisher nicht vorgeschlagen wurde: Stellen Sie sicher, dass es keinen Mittelpunkt auf der Karte gibt. Damit meine ich, dass sich die Kartenränder an die gegenüberliegenden Seiten anschließen. Dies würde viel Programmierarbeit erfordern, aber in der Praxis kann sich das Niveau unendlich wiederholen, wenn Sie in eine Richtung gehen. Dies bedeutet, dass es kein Zentrum gibt und eine zufällige Spawnposition keine Vor- oder Nachteile hat.
Sie können dies tun, indem Sie eine flache, quadratische Karte erstellen und jede Kante mit einer Kopie der gegenüberliegenden Kante verbinden. Wenn ein Spieler die Seite verlässt, wird er ohne Wissen des Spielers an die gegenüberliegende Kante teleportiert. Theoretisch kann man natürlich keine Spieler auf der anderen Seite der Grenze sehen. Um dies zu beheben, erstellen Sie Klone dieses Spielers, die auf der anderen Seite der Grenze herumzulaufen scheinen, damit Sie sie sehen können. Wenn Sie auf sie zulaufen, teleportieren Sie sich über den Spieler und der tatsächliche Spieler steht dort, wo sich der Dummy befunden hat.
Alternativ könnte sich die gesamte Karte außerhalb einer Kugel befinden, dies erschwert jedoch das Ablaichen von Koordinaten.
quelle
Hier sind einige mögliche Lösungen:
quelle
Grundsätzlich glaube ich, dass dies ein Problem der Graphverteilung ist. Unter der Annahme einer Deathmatch-Situation (jeder andere Spieler ist ein Feind) müssen Sie Ihre Karten als zusammenhängende Grafik modellieren und nachverfolgen, welchem Knoten in der Grafik jeder Spieler am nächsten ist. Nicht jeder Knoten muss ein Spawnpunkt sein, aber Sie benötigen das komplexe Diagramm, um die Abstände zwischen den Spawnpunkten zu modellieren. Zur Spawn-Zeit iterieren Sie dann den Graphen und bewerten jeden spawnbaren Knoten basierend darauf, ob es in der Nähe befindliche Knoten Spieler gibt.
Der ideale Knoten hat dann:
Stellen Sie sich vor, Ihr Diagramm wurde reguliert und Sie zeichnen konzentrische Zonen um jeden Knoten. Sie bestrafen den Knoten, wenn sich in den inneren Zonen bereits Spieler befinden, und belohnen Knoten, bei denen sich Spieler in der richtigen Entfernung befinden. Sie möchten das Laichen nahe genug bei anderen Spielern fördern, damit sie schnell Interesse finden, aber nicht so nahe, dass sie sich darauf stürzen, bevor sie die Gelegenheit haben, sich zu orientieren.
Sie werden benötigen die Kartengröße zu erhöhen , da die Zahl der Spieler wächst, aber die
k
Notwendigkeit , nicht mehr als 1 oder größer zu sein. Ihr schlimmster Fall wird immer noch sein, dass jeder Knoten in der Grafik mindestens einen Spieler hat. In diesem Fall gibt es keine guten Knoten, und Sie müssen diesen Fall erleiden und einen Spieler hervorbringen, der weiß, dass dies der Fall ist lande direkt auf einem anderen. Der Bewertungsalgorithmus sollte weiterhin die Knoten gewichten, damit Sie mit den wenigsten anderen Spielern auf dem Knoten erscheinen.Bedenken Sie, dass Ihr Kartendiagramm sorgfältig erstellt werden muss, mit Kenntnis der Karte, ihrer Routen, eventueller Engpässe und der effektiven Entfernung zwischen Knotenpunkten, nicht der tatsächlichen Entfernung. Verwenden Sie wie in etwa die gemessene Zeit, um zwischen Knoten und nicht die Entfernung zu wechseln, um schwierigeres Gelände zu berücksichtigen. Außerdem müssen Sie Offenheit und Deckung berücksichtigen. Zwei Knoten können physisch weit voneinander entfernt sein. Da sie jedoch sehr offen sind, kann das Laichen eines Spielers an jedem Knoten bedeuten, dass sie genauso anfällig sind, als hätten Sie sie direkt nebeneinander erzeugt.
Verfeinerungen:
quelle
Einige andere haben bereits die Einschränkungen Ihrer Anforderungen besprochen (die Karte muss irgendwann skaliert werden, um eine Überfüllung zu verhindern usw.) und sind letztendlich der Tatsache entgangen, dass es wahrscheinlich keinen "perfekten" Platzierungsalgorithmus gibt. Wenn es wahrscheinlich keinen "perfekten" Algorithmus gibt, schaue ich immer in Richtung Heuristik. Sie haben mehrere Kriterien, die entweder direkt oder indirekt im Widerspruch zueinander stehen, zusammen mit einem sehr komplizierten Suchraum. Eine optimale Lösung zu finden, ist vielleicht nicht machbar oder praktisch, aber mit ein wenig Abstimmung kann ein statistischer Ansatz die meiste Zeit sehr gut funktionieren.
Ansprechen Ihres dritten und vierten Kriteriums: "Die Karte sollte nicht erweitert werden müssen."
Ich würde am Anfang sicherstellen, dass Sie eine Überfülle an Knoten haben (dh: dicht wie ein Navigationsnetz für die Wegfindung). Dies verteuert die Berechnung der Distanz zu anderen Spielern (nicht direkt benachbarte Knoten), aber dies ist kein Vorgang, der mehr als einmal pro Runde stattfinden wird (nehme ich an). Ein Bonus davon ist, dass Sie für die meisten Ihrer Operationen eine vorgerollte Navigationsbibliothek verwenden können. Darüber hinaus wird das Umfahren von Hindernissen auf faire Weise respektiert, ohne dass es zu einer euklidischen Entfernung kommt (Spieler in einem Labyrinth könnten enger beieinander stehen als auf freiem Feld).
Berechnen Sie Heuristiken für Ihre gewünschten Spawn-Eigenschaften:
Nachdem Sie alle Spieler nach dem Zufallsprinzip platziert haben, berechnen Sie die Leistung der umliegenden Knoten anhand Ihrer Kriterien (Entfernung zu anderen Spielern, Entfernung zum Spawn usw.) Sie möchten in einem bereinigten Idealfall (flaches rechteckiges Gitter ohne Hindernisse), und die Leistung sollte ähnlich sein, wenn Sie die Welt wieder hinzufügen. Von dort aus können Sie entscheiden, wie viele Knoten durchsucht werden sollen, wie hoch der Schwellenwert für das Verschieben eines Startpunkts ist und wie viele Iterationen Sie durchführen möchten, bevor Sie den Spawn beenden und das Spiel beginnen.
quelle
Wenn es sich bei dem Spielfeld um einen topologischen Torus handelt (dh ein Rechteck, bei dem das Überschreiten der Grenzen das Betreten der gegenüberliegenden Seite bedeutet), ist dies wahrscheinlich eine gute Antwort: Der Spieler
j
spawnt beix = (pjW/N) mod W, y = (qjH/N) mod H
, woW,H
die Dimensionen des Rechtecks liegen,N
ist das Anzahl der Spieler undp,q
zu bestimmende ganze Zahlen; sie sind verschieden, (wahrscheinlich) relativ gut und nicht zu weit vonsqrt(N)
. Die Spawnpunkte bilden ein schräges Tapetenmuster.Dies setzt voraus, dass die Spieler nur zu Beginn des Spiels laichen. Wenn sie später erscheinen, sollten Sie sie so weit wie möglich von der aktuellen Position eines Spielers entfernt platzieren - an einem Scheitelpunkt des Voronoi-Diagramms, das von den anderen Spielern definiert wurde.
quelle
Wie wäre es mit:
Jeder Spieler ist von einer nicht laichenden Box (oder einem Kreis) umgeben.
Wie in gibt es ein Feld einer bestimmten Größe, das um jeden Spieler herum erscheint und diesem Spieler folgt - kein anderer Spieler kann in diesem Feld erscheinen.
Diese Felder wirken sich nur auf das Laichen und nicht auf andere Bewegungen während des Spiels aus.
Dies funktioniert entweder beim erstmaligen oder kontinuierlichen Laichen.
(Punkte zeigen Spieler an und grün zeigt möglichen Spawnbereich für neue Spieler an)
Um damit umzugehen, können Sie eines von zwei Dingen tun: (oder beides)
quelle