Wie entscheiden die Arbeiter in einem RTS, in dem Arbeiter beauftragt sind, z. B. Mauern zu bauen, welche Mauern gebaut werden sollen?
Der Spieler entscheidet, welche Wände wo gebaut werden sollen, aber er ordnet einzelne Arbeiter nicht einzelnen Wandfeldern zu. In vielen RTS-Spielen erledigen Mitarbeiter einfach Aufgaben, die sich in ihrer Nähe befinden. In meinem RTS möchte ich jedoch die strategische Ausführung expliziter Aufgaben auf bestimmten Feldern als Hauptstrategie verwenden, damit sich dumme Mitarbeiter nicht irgendwo zusammenschließen und Aufgaben weiter verlassen weg nicht getan.
Ich benutze die Beispielbauwand; Es könnte Stein abbauen, eine Straße bauen, Holz sammeln oder was auch immer. Der Schlüssel ist, dass der Benutzer wählt, wo, aber nicht wer.
Arbeiter können nur auf Feldern arbeiten, die an zugängliche Plätze angrenzen. Die Quadrate, an denen sie selbst arbeiten, können unpassierbar sein, bis die Arbeit abgeschlossen ist.
Die Arbeiter 1 und 2 sollen die Felder A, B, C und D abbauen.
Sie können ein Feld pro Spiel-Tick bewegen, und für das Minen eines Quadrats werden 10 Ticks benötigt.
Wie entscheiden Sie, welche Arbeiter welchen Platz abbauen?
Es liegt auf der Hand, dass 1 A und 2 C abbauen sollte.
1 ist 4 Felder von A entfernt, hat also den Abbau in 14 Zecken beendet. Wohin soll ich als nächstes gehen und warum?
Und was wäre, wenn ein weiteres Quadrat - E - direkt über B abgebaut würde?
Welche Logik verwendet ein Mitarbeiter, um zu entscheiden, wo er als nächstes vorgehen soll?
Antworten:
Markieren Sie den Ressourcenknoten als ausgelastet, oder begrenzen Sie die Anzahl der Worker, von denen ein Baum verwendet werden kann. Wenn eine Arbeit an einem bestimmten Punkt gesammelt werden soll, sagen Sie ihnen wirklich, dass sie den nächstgelegenen verfügbaren Baum ernten sollen.
Zwei Hauptpfade hierfür: Ein realistischer Ansatz wäre die Bewertung und Markierung von Ressourcennummern, bevor sie eintreffen. Geben Sie den Mitarbeitern einen Sichtbereich zur Bewertung von Bäumen, um seltsame Warteschlangenprobleme zu vermeiden. Auf diese Weise kann sich der Worker einem bestimmten Ressourcenknoten nähern, während er zum Patch geht. Dies gibt einen begrenzten Optimierungsgrad.
Bei vielen RTS (SC und SC2) bewerten Mitarbeiter einen Knoten jedoch erst, wenn sie eintreffen. Dies führt die Arbeiter dazu, herumzuwandern, bis ein Ressourcenknoten gefunden wird. Dies ermöglicht mehr Belohnungen für Fertigkeiten / Optimierungen.
Die genaue Implementierung hängt davon ab, wie die Ressourcen gruppiert sind. In AoE sind Bäume und Fische ununterbrochene Flächen, so dass Sammler im Verlauf des Spiels möglicherweise ziemlich weit weg landen. In Spielen wie SC und Red Alert befinden sich die Ressourcen jedoch in diskreten Patches. Ein Arbeiter muss sich also nur um diesen bestimmten Patch kümmern.
BEARBEITEN nach der Bearbeitung: Machen Sie sich nicht zu viele Gedanken über Ineffizienzen der Mitarbeiter. Jedes RTS, an das ich denken kann, weist Ineffizienzen bei den Arbeitnehmern auf. Dinge wie Arbeitersplits entstehen dadurch, dass der Spieler seine Arbeiter besser verwaltet als das Spiel. Ich denke, Sie nehmen diesbezüglich eine Programmiererperspektive ein und keine Designer. Das Problem mit dem einzigen Häkchen links kann umgangen werden, indem nur die Zahlen angepasst werden und die Knoten in einer diskreten Anzahl von Fahrten geerntet werden können. Ineffizienzen bei Arbeitnehmern sind für Sie von großer Bedeutung, da Sie das dahinter stehende System kennen. Wenn Ihre Spieletester es jedoch nicht bemerken, verweilen Sie nicht zu lange.
quelle
Lösung und ein Gedanke:
Lösung: Sie können die Sammelknoten beim Klicken in eine Warteschlange stellen und dann, wenn ein Job an den Anfang einer Warteschlange steigt, den gewichteten Aufgabenwarteschlangenwert für die Mitarbeiter ermitteln und dann den nächsten Nachbarn mit dem am besten gewichteten Aufgabenwarteschlangenwert finden ( Warteschlangenwert).
In Ihrem Beispiel könnte der optimale Warteschlangenwert 0 sein (was bedeutet, dass keine aktuellen Aufgaben vorhanden sind). Addieren Sie 1 zum Warteschlangenwert für jedes Quadrat, das sie zurücklegen müssten (Reisezeit), und 10 für jede Aufgabe (Zeit, um die Aufgabe zu erledigen). Entfernen Sie 1 aus dem Warteschlangenwert jedes Arbeiters für jede verstrichene Zeiteinheit (wenn der Wert der Startwarteschlange 10 ist, beträgt der Warteschlangenwert nach 3 Zeiteinheiten 7). Dann suchen Sie den nächsten Nachbarn (falls mehrere Mitarbeiter gleichwertige Warteschlangenwerte haben), um den Mitarbeiter zu finden, der diese Aufgabe ausführen soll.
Angenommen, die Erfassungsknoten werden in alphabetischer Reihenfolge (AD) aus der Aufgabenwarteschlange entfernt und es wird keine Bewegung ausgeführt, während die Warteschlange angezeigt wird:
Nachteil dabei: hoch rechnerisch.
Habe gedacht:
Wie wird Ihr Spiel damit umgehen, von Ressourcen blockiert zu werden? Wenn es also ein 4x4-Raster gibt, in dem jeder Knoten eine Ressource ist, können die Mitarbeiter die inneren 4 Knoten erhalten? Wenn nicht, stellen Sie sicher, dass die Mitarbeiter nicht nur im Leerlauf sind, um zu ihnen zu gelangen, sondern ihnen möglicherweise eine andere Aufgabe zuweisen und einen der Mitarbeiter, die einen der äußeren Knoten sammeln, den inneren Knoten zuweisen, sobald der äußere Knoten fertig ist (put es in einer Aufgabenwarteschlange für den Arbeiter).
quelle
Versuchen Sie, ein Gewichtssystem zu haben, das, wenn der Baum gesammelt wird, eine Art Stapelstrafe und auch eine Art Distanzbonus berechnet. (Wie lange dauert es, bis Punkt A-> B mit dem Holz erreicht ist, und so weiter? Dann können Sie einen Algorithmus ausführen, der nach dem nächstgelegenen Holz sucht, dessen Gewicht überprüft und dann vergleicht, ob es vorhanden ist wünschenswert. und verwenden Sie dann die mit dem niedrigsten Gewicht.
Dies erfordert natürlich eine Feinabstimmung. aber die idee ist einfach.
quelle
Jeder Job sollte a) eine Wichtigkeit b) einen Zuweisungsstatus (Anzahl der zugewiesenen Arbeitnehmer) haben
Ein Arbeiter könnte sich dann für den Job entscheiden, der ihm die meiste "Belohnung" pro Zeit gibt. Die Belohnung wird berechnet durch die Wichtigkeit geteilt durch die Anzahl der zugewiesenen Arbeiter geteilt durch die Zeit, die er investieren muss (Gehen und Arbeiten). Wenn sich Ihr Mitarbeiter auf Arbeiten spezialisieren kann (z. B. Holzhacken), bevorzugt er tatsächlich Aufgaben, die er effizient erledigen kann. Jobs sollten natürlich nur vergeben werden, wenn sie zum richtigen Zeitpunkt fortgesetzt werden können (zB müssen benötigte Ressourcen verfügbar sein).
Um zu vermeiden, dass einige Jobs für längere Zeit rückgängig gemacht werden (z. B. weil sie weit entfernt sind). Die Bedeutung sollte mit der Zeit zunehmen. Im Falle einer Ernte sollte die Bedeutung auch davon abhängen, wie viele Ressourcen dieser Art derzeit verfügbar sind / benötigt werden (z. B. produzierte Einheiten geteilt durch Einheiten, die in einem bestimmten Zeitraum angefordert wurden).
Um zu vermeiden, dass Arbeitnehmer ihren Arbeitsplatz zu schnell wechseln, lassen Sie sie ihren aktuellen Arbeitsplatz nur wechseln, wenn die Belohnung deutlich besser wird (um einen bestimmten Schwellenwert). Sie können auch die doppelten Kosten für das erste Gehen zum Job anwenden, wenn Sie die Werte für die Belohnung pro Zeit berechnen. Darüber hinaus sollten Sie die optimale Arbeit der Mitarbeiter nacheinander neu berechnen lassen, nicht alle gleichzeitig.
Fügen Sie den berechneten Belohnungen außerdem eine gewisse Zufälligkeit hinzu. Dies führt zu einer besseren Verteilung der Arbeitnehmer auf verschiedene Jobs (auf diese Weise erledigen nicht nur "alle" den gleichen Job). Dieser Effekt wird jedoch bereits verringert, indem der nächste optimale Arbeitsplatz für einen Arbeitnehmer seriell neu berechnet und die Anzahl der bereits zugewiesenen Arbeitnehmer angepasst wird (mehr Arbeitnehmer am selben Arbeitsplatz verringern die erwartete Belohnung).
Der Algorithmus muss möglicherweise etwas angepasst werden, wenn Ihre Jobs nur einem Mitarbeiter zugewiesen werden können. Wenn dies der Fall ist, gehen Sie wie folgt vor: Ein Mitarbeiter wählt den Job mit der höchsten Belohnung pro Zeit (Wichtigkeit geteilt durch die benötigte individuelle Zeit). Wenn ein anderer Mitarbeiter denselben Job mit einer höheren erwarteten Belohnung pro Zeit ausführen kann, startet er den aktuell zugewiesenen Mitarbeiter. Der neue "arbeitslose" Arbeiter versucht dann, einen anderen Job zu finden. In Ihrem Beispiel könnte dies so aussehen:
quelle