Ich mache gerade ein Verteidigungsspiel, in dem Feinde erscheinen und die Armee des Spielers angreifen. Es ähnelt einem Tower Defense-Spiel, nur dass es nur ein Level gibt. Die Feinde werden so lange laichen, bis der Benutzer schließlich stirbt oder eine Armee zusammenstellt, die groß genug ist, um jeden Feind auszulöschen, der sofort erscheint (hoffentlich ist es schwierig genug, dass dies nicht passiert).
Was ich im Moment zu kämpfen habe, ist, wie man dieses Spiel zunehmend schwieriger macht und die Wahrscheinlichkeit, dass ein Feind laicht, letztendlich 100% erreicht.
Bisher habe ich etwas Ähnliches wie das Folgende
if(Math.random() < 1 - (1/elapsed_time) && spawnTimer <= 0 ){
spawnEnemy()
spawnTimer = rand(); // random number between 1 and 3
}
Aber es scheint zunächst zu einheitlich. Im Moment spawne ich nur eine Art von Feind. Die Idee ist, dass im Laufe der Zeit auch härtere Feinde erzeugt werden.
Ich denke auch, dass ich meine spawnTimer
etwas mehr randomisieren und das mit der Zeit schneller machen muss, aber ich kann einfach nicht sehen, wie meine Logik für diesen ganzen Abschnitt wirklich aussehen sollte. Kann jemand mit einer groben Vorstellung von dieser Art von Formel helfen?
Ich benutze derzeit Javascript, um das Spiel zu schreiben, aber offensichtlich geht es mehr um das Konzept.
Antworten:
Die von Ihnen gewählte Funktion ist wahrscheinlich nicht für Ihren Zweck geeignet. Wenn Sie diesen Weg gehen, sollte eine fehlgeschlagene zufällige Bedingung zu einer Verzögerung führen, bevor Sie das nächste Mal würfeln. Es ist auch unwahrscheinlich, dass es für Ihr Ziel gut ist, den Spawn-Timer in einem konstanten Bereich zu halten.
Sei
thresh
eine Schwierigkeitsschwelle, die du für hoch hältst. Wir verwenden das später, um zu entscheiden, wann das Tempo, mit dem das Spiel schwieriger wird, verlangsamt werden soll.Sei
rate
die Anzahl der Monster, die in jeder Minute (oder Runde) kommen sollen.Sei
GROWTH_RATE
die Geschwindigkeit, mit der sich der Schwierigkeitsgrad erhöht (vorerst wird es so sein0.2
).Angenommen, Sie beginnen mit
rate = 10
. Jetzt hat der Spieler5
Monster getötet, damit du die Rate nachGROWTH_RATE * 5 = 1.0
und nach erhöhen kannstrate = 11
.So implementieren Sie eine Bedingung, die
rate
jede Minute Monster erzeugt :Set Spawn - Timer auf eine Zahl zwischen
0.5
zu Rundzeitrate1.0
multiplied by 60 seconds or
0.25` Chance , dass kein Monster hervorgebracht wird , wenn der Timer 0 erreicht und die Zeit wieder randomisiert.and divided by
. Also leave a
Wenn Sie
rate
jemals erreichenthresh
, müssen Sie langsamer fahren. Anstatt nun zu erhöhenrate
durchGROWTH_RATE
, können Sie es durch erhöhen1 / math.sqrt(rate)
. Auf diese Weise wird der Spieler in der schwierigeren Umgebung nicht sofort zerstört.Sie können
thresh
auf ungefähr 80% des Wertes zurücksetzen ,rate
bei dem der Spieler das Spiel verloren hat.Wenn du die Stärke des Monsters zufällig bestimmen willst, sei vorsichtig mit dem Timer. Wenn Sie beispielsweise entscheiden, dass
player-score
(bestimmt durch bisher getötete Monster) die maximale Stärke eines Monsters bestimmt wird, das erscheinen könnte, können Sie Folgendes tun :max-monster-strength = player-score / 1000
. Dann zufällig einfloat
oderdouble
zwischen0.0
auf1.0
und multiplizieren Sie das Ergebnis für sich.Wenn Sie nun den Timer zufällig auswählen, sollten Sie wahrscheinlich die Leistungsstufe berücksichtigen. Zum Beispiel könnten Sie das Timer-Ergebnis mit der Quadratwurzel der nächsten Monster-Kraft multiplizieren.
quelle
Es gibt viele Optionen, zwei mit Ihrem aktuellen Setup:
Dann mehr mit zusätzlichen Funktionen:
Für die Erstellung einer Schwierigkeitskurve gibt es wirklich keine richtige Antwort. Es wird eine Menge Spieltests und Optimierungen erfordern, um es richtig zu machen. Es hängt davon ab, wie lange das Spiel dauern soll und wie schwierig es sein soll. Ich schlage vor, Sie verwenden Excel oder eine Site wie WolframAlpha und sehen, welche Art von Kurve verschiedene Funktionen erstellen. Versuchen Sie es mit exponentiellen Erhöhungen, linearen Erhöhungen usw. Finden Sie eine, die für Sie funktioniert.
quelle
Anstatt eine feste Anzahl von Feinden (einen) mit variabler Wahrscheinlichkeit erscheinen zu lassen, könnten Sie es umdrehen und eine variable Anzahl von Feinden mit einer festen Wahrscheinlichkeit erscheinen lassen.
Auf Schwierigkeitsgrad 1 hat dies eine Chance von 1%, einen Gegner pro Tick hervorzubringen.
Im Schwierigkeitsgrad 1000 werden bis zu 1000 Feinde mit einer separaten Chance von 1% erzeugt. Dies bedeutet, dass durchschnittlich 10 pro Tick erscheinen, aber es kann auch mehr oder weniger sein. Es besteht die Möglichkeit, dass eine Zahl, die sich stark von 10 unterscheidet, sofort erscheint, vielleicht sogar alle 1000. Dies ist jedoch aufgrund der Funktionsweise der Wahrscheinlichkeit ein sehr unwahrscheinliches Ereignis (vgl. Gesetz der großen Zahlen ).
Wenn Sie mehr verschiedene Feinde mit unterschiedlichen Verhaltensweisen und Statistiken hinzufügen, möchten Sie vielleicht, dass einige der härteren Feinde erst auf höheren Schwierigkeitsgraden und selbst dann mit einer geringen Dichte anfangen zu laichen. Dazu können Sie einen Schwierigkeitsgrad-Modifikator hinzufügen, der vom aktuellen Schwierigkeitsgrad abgezogen wird. Auf diese Weise wird der Feind nicht erscheinen, bevor dieser Schwierigkeitsgrad erreicht ist, und selbst dann zunächst nur mit einer geringeren Chance:
quelle