Random Trigger Targets II

Aus EnigmaWiki

Wechseln zu: Navigation, Suche
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
  • targets sind die Namen der Ziele.
  • yet_used Nimmt die elemente auf, die schon vergeben sind. Somit wird verhindert, dass ein Ziel von 2 Schaltern geschteuert werden kann.
  • num_targets Die 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.)

  1. i=0
  2. repeat
  3. i = i+1
  4.  
  5. repeat
  6. r = random(1,num_targets)
  7. until yet_used[r] ~= 1
  8. yet_used[r] = 1
  9.  
  10. enigma.SetAttrib(enigma.GetNamedObject("my_trigger"..tostring(i)),"target",targets[r])
  11. until i == num_targets
Persönliche Werkzeuge