Game Design/Theorie, Loot Drop Chance - /Spawn-Rate
Ich habe eine sehr spezielle und langwierige Frage für Euch alle. Diese Frage ist sowohl über die Programmier-und Spiel-Theorie. Vor kurzem habe ich spawnbare Erz zu meiner Biegen Sie-Basierte Strategie-Spiel: http://imgur.com/gallery/0F5D5Ij (Für diejenigen von Ihnen, die Aussehen, bitte verzeihen Sie die Entwicklung Texturen).
Nun, auf die enigma, die ich bisher betrachten. In meinem Spiel, Erz generiert jedes mal eine neue Karte erstellt wird. 0-8 Erz-Knoten erzeugt pro level-Erstellung. Ich habe bereits diese arbeiten; außer es erzeugt nur "Emeraldite" an diesem Punkt, das bringt mich zu meiner Frage.
Wie würde ich, der Programmierer, die es so machen, Knoten bestimmten Rarität? Betrachten Sie dieses kurze Modell ist nicht wirklich Spiel-Daten:
(Pseudo Chancen, dass ein Knoten eine der folgenden)
Bloodstone 1 in 100
Default(Empty Node) 1 in 10
Copper 1 in 15
Emeraldite 1 in 35
Gold 1 in 50
Heronite 1 in 60
Platinum 1 in 60
Shadownite 1 in 75
Silver 1 in 35
Soranite 1 in 1000
Umbrarite 1 in 1000
Cobalt 1 in 75
Iron 1 in 15
Möchte ich es so machen, dass ein Knoten generiert werden könnten, theoretisch, alle der oben genannten, allerdings mit der Verschiedenheit betrachtet. Ich hoffe, die Frage ist klar genug. Ich habe versucht, Sie zu wickeln meinem Kopf herum, und selbst zu schreiben versucht, aus ein paar if-Anweisungen mit randoms, aber, ich halten kommen mit leeren Händen.
Im Grunde will ich nur von Euch zu sehen, mein Problem ist, und hoffentlich geben Sie mir einen Einblick, wie konnte ich diesen Ansatz in einer dynamischen Art und Weise.
Wenn keine Klärung erforderlich ist, Fragen Sie bitte; sorry nochmal, wenn das war verworren.
(Ich bin hinzufügen von C# - wie ein tag nur, weil das die Sprache ist, die ich benutze für dieses Projekt)
- Eine zufällige Ansammlung von if-Anweisungen mit randoms, die ich schon verschämt beiseite gefegt.
- Sollten Sie einige code, die Sie versucht haben. Das hilft, um Ihre Probleme lösen schneller
- Auch ist diese nicht besser geeignet für gamedev.stackexchange.com statt direkt stackoverflow? Wie es korreliert direkt mit Spiel-Programmierung und auch etwas Spieltheorie
- Wahrscheinlich sollte ich ihn da drüben, du hast Recht. Noch, wenn jemand will, um zu werfen Ihre zwei-Cent werde ich gerne empfangen.
- Ihre Statistiken nicht addieren -- Sie haben angegeben, dass 90% der Zeit, die Sie wollen ein nicht-leerer Knoten .. aber die Chancen, die Erze nicht hinzufügen bis zu 90%
- Dies nennt man die fitness-Anteil/roulette-radauswahl - en.wikipedia.org/wiki/Fitness_proportionate_selection
- Als eine Angelegenheit von real world " - Beispiel, das nützlich sein könnte: diablo2.diablowiki.net/Treasure_Classes
- Suchen für geladene Würfel-algorithmen, hier eine nette Antwort mit ein paar nützlichen links.
- Kann ein Knoten mehr als einen geben? Kann es einen zusätzlichen Knoten am gleichen Ort? Wollen Sie eine inverse Korrelation zwischen einem Knoten-Typ und andere, oder sollten Sie unabhängig sein? Haben Sie Sorge, über "wie viele Eisen Knoten pro Spiel anzeigen" oder "wie viele Eisen Knoten pro Ressource-Knoten" mehr? Sind es Familien, die von node-Typen? Da ist jede Bestellung (auch nur teilweise) auf die node-Typen, wobei X ist besser als Y? Ist die Anzahl der Knoten fest pro Karte, oder zufällig? Wie zufällig soll es sein? Können Sie befassen sich mit Werten, die außerhalb von 0-8 leicht?
- Die Knoten werden erzeugt, indem man die Welt Breite * 2, Welt Höhe *2, mit, dass, wie x und z, und dann die Schleife durch jeden Voxel zu finden, wenn es ein top-Nachbarn; wenn false, nehmen wir voxels y-Wert += 2.0 f und den Knoten platziert wird es durch den Vergleich, dass Voxels Lage durch einen epsilon-Wert. Es ist mathematisch unmöglich, dass zwei Knoten haben dieselben Koordinaten. Noch war das gewünschte.
- ... huh? Warum
*2
die Größe der Welt? Was meinen Sie mit "Vergleich durch einen epsilon-Wert"? (Und ich nehme an, die Antworten zu meinem vorherigen post sind "Nein", "Nein", "nicht geantwortet", "nicht geantwortet", "nicht geantwortet", "nicht geantwortet", "random", "das wissen Sie nicht: Sie schrieb-code und akzeptiert das Ergebnis, wie es schien vernünftig", "ja")? Können Sie bestätigen, dass die Auslegung und eindeutige Antworten oder "weiß ich nich"der "nicht beantworteten" Fragen? Danke. - Das gemeinsame Thema zu drehen, die verschiedene Nenner Wahrscheinlichkeiten in einigen gemeinsamen Nenner (z.B., Astrotrain Antwort) bringt mich wieder zurück zu D&D ' s loot-Tabelle-mechanik: dandwiki.com/wiki/SRD:Treasure
- Ich fragte eine sehr ähnliche Frage an den Autor.SE über Datenstrukturen für diese Art von Zufall. Die Antworten dort sind wohl zutreffend für Ihre situation.
- Für Epsilon zu sehen: pastebin.com/3HhxZAW4 ich will nicht zu offenbaren, die ganze Welt-generator-Quelle, aber das Beispiel sollte genügen, zu zeigen, wie Vergleiche ich die grobe Schätzung, bei der die Suche nach der mineral-Lage. Für deine anderen Fragen, Sie wird unbeantwortet bleiben, leider, denn die Antwort ist bereits gegeben und es ist überflüssig zu erklären, keine weiteren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde zunächst stellen die Wahrscheinlichkeit jedes loot geben als eine einfache Zahl.
Die Wahrscheinlichkeit, in der reinen Mathematik ist konventionell ausgedrückt als Gleitkomma-Zahl im Bereich von 0 bis 1, aber für die Effizienz, die Sie verwenden können, ganze zahlen in beliebigen (ausreichend großen) Bereich (jeder Wert ist der 0-1-Wert multipliziert mit dem maximum (was ich rufe MaxProbability hier)).
Ich gehe davon aus, dass 'Standard (Leere Knoten)' bedeutet, dass die Wahrscheinlichkeit, dass keine der anderen.
In diesem Fall ist der einfachste Weg, ist nicht zu definieren - Sie bekommen es, wenn keiner von den anderen gewählt werden.
Wenn 'Standard' enthalten war, die Summe all dieser Wahrscheinlichkeiten wäre 1 (d.h. 100%) (oder MaxProbability, wenn mit ganzen zahlen).
1/10 Wahrscheinlichkeit von 'Default' in deinem Beispiel ist eigentlich ein Widerspruch, denn die Summe all dieser Wahrscheinlichkeiten ist nicht 1 (es ist 0.38247619 - die Summe der Wahrscheinlichkeit berechnet werden, in meinem Beispiel oben).
Dann würden Sie wählen Sie eine Zufallszahl im Bereich 0 bis 1 (oder MaxProbability, wenn mit ganzen zahlen), und die gewählte Beute-Typ ist der ersten in der Liste, so dass die Summe der Wahrscheinlichkeiten von es und alle bisherigen ("kumulierte Wahrscheinlichkeit") ist größer als wird die Zufallszahl.
z.B.
z.B. Wenn Ihr Zufallszahl im Bereich von 0 bis 999 (inklusive) war 184 (oder irgendetwas im Bereich von 172 bis 199), würden Sie wählen Sie "Silber" (die erste mit der kumulierten Wahrscheinlichkeit größer als diese).
Könnten Sie halten die kumulativen Wahrscheinlichkeiten in einem array und eine Schleife durch, bis Sie einen finden, höher als die zufällige Zahl, oder das Ende erreichen.
Die Reihenfolge der Liste ist egal.
Sie wählte eine zufällige Zahl, die nur einmal pro Instanz.
Einschließlich 'Default (Leere Knoten)' in der Liste bedeutet, dass das Letzte kumulative Wahrscheinlichkeit wird immer MaxProbability und die Schleife, die sucht, es würde nie vorbei gehen dem Ende zu. (Alternativ, 'Default' kann weggelassen werden, und Sie wählen es, wenn die Schleife erreicht das Ende der Liste.)
Beachten Sie, dass die Auswahl einer Zufallszahl für jede man wiederum z.B. eine 1/10 chance, 'Blutstein', dann eine 1/15 chance von Kupfer, wenn nicht Blutstein, verzerrt die Wahrscheinlichkeiten in Richtung der früheren Artikel:
Die tatsächliche Wahrscheinlichkeit von Kupfer wäre (1/15) * (1 - (1/10)) - 10% weniger als 1/15.
Hier der code, es zu tun (die eigentliche Wahl ist 5 Aussagen - in der Methode Wählen Sie ).
10..76
Rendite Kupfer, nicht10..77
. Die Lösung ist praktisch das gleiche wie andere, aber mir gefällt die Programmierung Probe. Es ist sehr einfach zu definieren lootTypes/lootProbabilities in der falschen Reihenfolge und schwer zu astually überprüfen Sie die probabiltiy aus einem einzigen Element (wirklich, versuchen Sie, schnell sagen Sie mir, was ist die Wahrscheinlichkeit, Gold?). Und es erfordert ein Tabellenblatt zu generieren, die Werte!Könnte man umschreiben, alle Chancen, so dass Sie verwenden die gleichen divisor (z.B. 1000), die Ihre Chancen dann werden
Als Nächstes erstellen Sie ein array mit 1000 Elementen, und füllen Sie es mit
10 Blutstein Elementen
100 Leere Elemente
20 Gold-Elemente
etc.
Schließlich generieren eine zufällige Zahl zwischen 0 und 1000, und verwenden, die als index in das array-element, das wird geben
Sie bei Ihren zufälligen element.
Haben Sie vielleicht, um mit zu spielen, die Chancen ein wenig, da Sie wahrscheinlich wollen, alle 1000 array-Elementen gefüllt werden, aber dies ist die Allgemeine Idee.
Bearbeiten das ist aber nicht die effizienteste Implementierung (zumindest in Bezug auf die Speichernutzung, seine Laufzeit sollte gut sein), aber ich wählte dieses, da Sie es ermöglicht, eine präzise Erklärung nicht erforderlich ist, ist eine ganze Menge Mathematik.
Zunächst die Angabe der default-leeren Knoten die Wahrscheinlichkeit ist unnötig. Die anderen Wahrscheinlichkeiten definiert werden sollte, in einer solchen Weise, dass der leere Knoten wird erstellt, wenn kein anderer Typ wird erstellt.
Wie dies zu tun und sorgen für die generation probabiltiies sind gleich denen, die Sie angegeben? Kurz gesagt:
Für dein Beispiel:
Nun die Klasse implementiert werden kann in mindestens zwei Möglichkeiten. Meine option verbraucht viel Speicher, macht die Berechnungen nur einmal, sondern es auch Runden die Wahrscheinlichkeitswerte, die möglicherweise stellen einige Fehler. Beachten Sie, dass der Fehler hängt von der
arrSize
variable - je größer es ist, desto kleiner ist der Fehler.Die andere option ist, wie in Bogusz ' s Antwort. Es ist genauer, aber benötigt mehr Operationen pro jeder generierten element.
Option vorgeschlagen von Thomas erfordert eine Menge von sich wiederholenden code für jede option ist daher nicht vielseitig. Shellshock Antwort haben ungültige effektive Wahrscheinlichkeiten.
Astrotrain Idee zu zwingen, sich zu verwenden, der denselben divisor ist praktisch die gleiche wie meine eigene, obwohl die Umsetzung würde etwas anders sein.
Hier ein Beispiel für die Umsetzung meiner Idee (in java, aber sollte portiert werden sehr leicht):
Dies stellt sicher, dass die Wahrscheinlichkeiten sind eigentlich einheitlich. Wenn Sie überprüft für den ersten Knoten spawn, dann die andere, dann die anderen - Sie würden auch falsche Ergebnisse: Knoten zuerst geprüft hätte erhöhte Wahrscheinlichkeit.
Probe Gefahren:
Ich denke, dass es einfach ist, zu verstehen, wie es funktioniert.
(Kobalt, 20: Mittel 1 von 20 -> 5%)
Edit:
Füge ich Abschnitt "Add Common Erz und Sortieren Wörterbuch".
Ich kürzlich hatte, etwas ähnliches zu tun, und ich landete mit diesem generischen "spawn-generator".
Und Sie würde es nutzen, wie:
Offenbar der spawn-Algorithmus wurde nicht als kritisch betrachtet-code, so dass der Aufwand für diese Umsetzung war nicht von Belang, wenn im Vergleich zu der Leichtigkeit der Nutzung. Laicht ausgeführt wurden, auf die Erschaffung der Welt und es war einfach mehr als schnell genug.
Astrotrain schon gab meine Antwort, aber da ich codiert es schon werde ich es posten. Sorry für die Schreibweise, ich arbeite meist in der Powershell und das ist der Kontext, die derzeit in meinem Kopf. Betrachten Sie dieses psuedo-code:
Random.Neben http://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs. 110).aspx:
Den minimalen Wert sollte immer 1, der maximale Wert ist, die Verschiedenheit der Laichzeit das Element + 1 (minValue ist inclusive, maxValue ist exklusive). Testen Sie immer den Rückgabewert 1, z.B. für Bloodstone ist es eine 1 in 100 chance, dass die zufällig generierte Zahl ist 1. Natürlich, diese verwendet einen pseudo-Zufallszahlengenerator, der sollte gut genug sein für ein Spiel.
if
weniger wahrscheinlich, von einem Faktor abhängig von den Wahrscheinlichkeiten des vorherigen ifs. Wenn Sie eine Prüfung auf die Ergebnisse dieses Algorithmus für eine ausreichend große Anzahl von versuchen, werden Sie sehen, dass die Wahrscheinlichkeiten, die deutlich unterscheiden sich von den angegebenen.Einen etwas anderen Ansatz Astrotrains Idee wäre, dass statt eines Arrays verwenden, wenn Aussagen . Der Vorteil ist dann, dass Sie brauchen weniger Speicher, der Nachteil ist, dass es braucht mehr cpu-Zeit zu calc den Wert des Knotens.
Also:
Auch ein Nachteil dieser Variante im Verhältnis zu den array-Variante ist, dass das braucht mehr Platz codewise an der Stelle, wo Sie es verwenden und ist anfälliger für Fehler /Korrekturen (versuchen Sie, fügen Sie etwas im inneren, müssen Sie es zu aktualisieren alle Varianten).
Also das hier ist metnioned für Vollständigkeit Willen, aber das array vairant (memory-Nutzung abgesehen) ist weniger anfällig für die Probleme, die die if-Variante hat.