Random Trigger Targets II
Aus EnigmaWiki
Verfügbare Sprachen: Deutsch, English, Русский
Inhaltsverzeichnis |
Problemstellung
Es ist eine gewisse Anzahl Schalter und die gleiche Anzahl Ziele vorhanden. Es soll bei Levelstart ein zufällige Zuordnung zwischen je einem Schalter und einem Ziel geben.
Lösungsansatz
Wir speichern alle Namen der Ziele in einem Array. Dann wählen wir zufällig ein Element des Array aus, und vergeben es als Ziel unserem ersten Schalter. Damit wir das Ziel nicht nocheinmal vergeben, wird es als gebraucht markiert. Dann wählen wir ein neues zufälliges Ziel etc ...
Lösungsbeispiel
targets = {"target1","target2","target3","target4","target5","target6"} yet_used = {} num_targets = 6 for i=1,num_targets do set_stone("st-switch",i,2,{name="my_trigger"..tostring(i), action="openclose"}) end for i=1,num_targets do set_stone("st-door_a",i,5,{name=targets[i]}) end i=0 repeat i = i+1 repeat r = random(1,num_targets) until yet_used[r] ~= 1 yet_used[r] = 1 enigma.SetAttrib(enigma.GetNamedObject("my_trigger"..tostring(i)),"target",targets[r]) until i == num_targets
Analyse
Zuerst ein paar Variablen definieren:
targets = {"target1","target2","target3","target4","target5","target6"} yet_used = {} num_targets = 6
-
targetssind die Namen der Ziele.
-
yet_usedNimmt die elemente auf, die schon vergeben sind. Somit wird verhindert, dass ein Ziel von 2 Schaltern geschteuert werden kann.
-
num_targetsDie Anzahl der Ziele (und der Schalter ...)
Als nächstes setzen wir die Schalter. Wir geben hier erst die action an, aber noch kein target.
for i=1,num_targets do set_stone("st-switch",i,2,{name="my_trigger"..tostring(i), action="openclose"}) end
Nun setzten wir die Ziele (hier sind das Türen). Wir geben ihnen in beliebiger Reihenfolge die Namen, die in targets festgehalten sind.
for i=1,num_targets do set_stone("st-door_a",i,5,{name=targets[i]}) end
Erst jetzt kommt das grosse Mischen. Es ist durch 2 verschachtelte Schleifen gemacht. In der äusseren Schleifen wählen wir für jeden Schalter ein zufälliges Ziel. Das Ziel wird dem Schalter dann auf Zeile 10 zugewiesen. Die innere Schleife stellt sicher, dass wir keine Ziel ein 2. Mal vergeben. Sie wählt solange ein Ziel aus, bis das Ziel noch nicht vergeben ist. Wenn bei vielen Zielen nur noch wenige frei sind, kann das entsprechende lange gehen. (Allerdings ist es immer noch schnell genug, dass man meist nichts davon merkt.)
i=0 repeat i = i+1 repeat r = random(1,num_targets) until yet_used[r] ~= 1 yet_used[r] = 1 enigma.SetAttrib(enigma.GetNamedObject("my_trigger"..tostring(i)),"target",targets[r]) until i == num_targets

