jloos Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Guten Morgen, ich komme mal wieder an meine Grenzen. Ich möchte aus einem SB einen beliebigen zufälligen Zug abrufen. Bei meinem Beispiel wird immer nur die Lok im unteren Gleis abgerufen, wenn alle Gleise besetzt sind. Ich hänge das Beispiel an und bitte Euch mir Tipps zur Lösung zu geben, Gruß Jürgen 20230506_Ausfahrt_SB.mbp
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 (bearbeitet) Hallo @jloos, Du gehst im Ereignis "beliebige Lok starten" immer die gleiche Liste von oben nach unten durch. Dort steht an erster Stelle das Sig5, welches immer geöffnet wird, wenn eine Lok auf diesem Kontakt steht, was ja immer der Fall ist, wenn die Lok einmal rum ist. In Deinem Konstrukt fehlt das Zufallselement. Anbei eine ein Konstrukt mit Zufallselement. Den Timer habe ich auf 5 runtergesetzt damit Du siehst, dass Du den Abschnitt von den Ausfahrtsignalen bis zum ersten Blocksignal noch nicht abgesichert hast. Da können deshalb derzeit zwei (oder mehrere) Loks hintereinander fahren. 20230506_Ausfahrt_SB mit Zufallsgenerator.mbp Beste Grüße Phrontistes PS: Ich habe das auf die Schnelle mit Lua gemacht. Falls Du nur die graphische EV-Oberfläche nutzen willst, könnte ich es auch damit machen. Bearbeitet 9. Mai 2023 von Phrontistes PS eingefügt
jloos Geschrieben 9. Mai 2023 Autor Geschrieben 9. Mai 2023 Hallo @Phrontistes, danke für Deinen Vorschlag. Ich bin zwar nicht so gut in Lua aber das werde ich schon in meiner Anlage umsetzen können. Im Original werden auch keine Signale angesteuert, sondern die entsprechende Fahrstraße freigegeben. In diesem Beispiel hatte ich auf einmal alle Loks hintereinander hängen und habe deshalb die Blockstrecken aufgebaut. Jetzt ärgere ich mich darüber, dass ich nicht auch die Fahrstraßen vom Ausgangssignal zum ersten Blocksignal definiert habe. Dann wäre meine Steuerung jetzt schon fertig. Vielen Dank Gruß Jürgen
Goetz Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 4 Minuten schrieb jloos: Ich bin zwar nicht so gut in Lua Deine Situation ist einer der Fälle, die sich mit Lua wirklich besser handhaben lassen. Deshalb würde ich gerne noch ein weiteres Skript beisteuern. Meines Erachtens ist es klüger, zuerst aus der Liste aller Signale eine zweite Liste zu generieren, die nur die besetzten Plätze enthält. Und dann geht man im nächsten Schritt hin und greift sich aus dieser neuen Liste zufällig ein Signal heraus. Damit ist sicher gestellt, dass immer ein wartender Zug gefunden wird. local WarteListe = {} local SignalListe = {$("Sig 01"), $("Sig 02"), $("Sig 03"), $("Sig 04"), $("Sig 05")} for i, Signal in ipairs(SignalListe) do if #layout:getVehiclesOn(Signal) > 0 then table.insert(WarteListe, Signal) end end local Anzahl = #WarteListe if Anzahl > 0 then local Zufall = math.random(1, Anzahl) local Signal = WarteListe[Zufall] Signal.state = 1 end Ich habe das Skript ausführlicher als üblich (= mit mehr Zwischenschritten) geschrieben weil ich hoffe, dass so deutlicher wird was an jeder Stelle passiert und wofür es benötigt wird. Viele Grüße Götz
jloos Geschrieben 9. Mai 2023 Autor Geschrieben 9. Mai 2023 Hallo @Phrontistes und @Goetz, zur Vollständigkeit des Thread habe ich beide Vorschläge für mich statt der direkten Ansteuerung der Signale mit der Aktivierung der Fahrstraßen umgesetzt. von @Phrontistes local Signalliste = {$("Sig 05"), $("Sig 04"), $("Sig 03"), $("Sig 02"), $("Sig 01")} -- Zufallszahl zwischen 1 und 5 auswürfeln local Zufallszahl = math.random(5) for key, Signal in ipairs(Signalliste) do if key == Zufallszahl then if #layout:getVehiclesOn(Signal) > 0 then Signal.variables["nächste FS"].autoActivate = true Signal.variables["nächste FS"].active = true end end end von @Goetz local WarteListe = {} local SignalListe = {$("Sig 01"), $("Sig 02"), $("Sig 03"), $("Sig 04"), $("Sig 05")} for i, Signal in ipairs(SignalListe) do if #layout:getVehiclesOn(Signal) > 0 then table.insert(WarteListe, Signal) end end local Anzahl = #WarteListe if Anzahl > 0 then local Zufall = math.random(1, Anzahl) local Signal = WarteListe[Zufall] Signal.variables["nächste FS"].autoActivate = true Signal.variables["nächste FS"].active = true end Wunderbar, vielen Dank für Eure Antworten. Gruß Jürgen
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 2 Stunden schrieb jloos: statt der direkten Ansteuerung der Signale mit der Aktivierung der Fahrstraßen umgesetzt. Schön! Schick' doch mal das mbp (inkl. Code von @Goetz, denn der ist natürlich mathematisch sauberer und es geht auch flüssiger). vor 3 Stunden schrieb jloos: Ich bin zwar nicht so gut in Lua Auch wenn's mit Lua hier sicher einfacher geht, will ich mal übungshalber vielleicht sehen, ob ich das graphisch hinbekomme. Geht bestimmt, wird aber etwas Fummelei. vor 3 Stunden schrieb jloos: ärgere ich mich darüber, dass ich nicht auch die Fahrstraßen vom Ausgangssignal zum ersten Blocksignal definiert habe Ja, das wäre es schöner. Beste Grüße Phrontistes
Goetz Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Gerade eben schrieb Phrontistes: Geht bestimmt Ich denke, nein. Zumindest habe ich keinen zufriedenstellenden Weg gefunden. Deshalb meine Anmerkung, dass solche Situationen sich mit Lua besser handhaben lassen.
Hawkeye Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 27 Minuten schrieb Phrontistes: Geht bestimmt, wird aber etwas Fummelei. Hallo @Phrontistes, versuch mal diese einfache Lua-Zeile in der grafischen Ansicht zu realisieren. vor 3 Stunden schrieb jloos: local Anzahl = #WarteListe Dann wirst du sehen, das das Götz das nicht grundlos empfiehlt. vor 29 Minuten schrieb Goetz: Deshalb meine Anmerkung, dass solche Situationen sich mit Lua besser handhaben lassen. VG, Hawkeye
Roter Brummer Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 (bearbeitet) Hallo zusammen, mit einer grundsätzlich anderen Herangehensweise geht es auch über die grafische Oberfläche der EV. Zufällige Zugwahl.mbp Zunächst wird eine Variable ausgewürfelt, wenn der Zug am Signal angekommen ist. Wenn die Strecke weiter ausgebaut würde, ginge auch ein früherer Auslöser. Dann wird der Wert der Variablen ausgelesen und geprüft, ob ein Zug am Signal wartet. Wenn dass der Fall ist, wird die entsprechende Fahrstraße geschaltet, ansonsten wird erneut gewürfelt und das Spiel geht solange von vorne los, bis die Bedingung erfüllt ist. HG Brummi P.S.: Bitte nicht wundern: Die Variable kann auch per Zufall mehrfach hintereinander denselben Wert annehmen. Wie bei einem echten Würfel eben auch. Bearbeitet 9. Mai 2023 von Roter Brummer
Goetz Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Hallo @Roter Brummer, die Idee, bei nicht besetztem Gleis neu zu würfeln, ist clever! Das war der Trick, der mir nicht einfallen wollte. Wenn du jetzt die Signale und Fahrstraßen in Listen parat hältst, kannst du die gewürfelte Zahl als Listenindex verwenden: Zufällige Zugwahl mit Listen.mbp
Roter Brummer Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Hallo @Goetz, das mit den Listen sollte mir langsam mal leichter von der Hand gehen. Verstehe ich das richtig, dass eine ausgewürfelte Zahl mit dem Wert "x" automatisch aus den beiden Listen die Einträge an der Position "x" aufruft? HG Brummi
Goetz Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 (bearbeitet) vor 7 Minuten schrieb Roter Brummer: Verstehe ich das richtig ..? fast ... Die Elemente einer Liste sind durchnummeriert. Diese Platznummern heißen Index Du kannst ein einzelnes Element aus einer Liste entnehmen, indem du den Namen der Liste und den Index angibst. Ich verwende deine Variable, welche die gewürfelte Zahl enthält, für den Index. Und das zweimal: Einmal hole ich mir das Signal aus einer Liste und danach dann die zugehörige Fahrstraße aus einer zweiten Liste Damit das so funktioniert, müssen die beiden Listen zusammenpassen. Will heißen: Signal und zugehörige Fahrstraße müssen in den Listen denselben Index haben. Bearbeitet 9. Mai 2023 von Goetz Schreibfehler korrigiert
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 1 Stunde schrieb Goetz: die Idee, bei nicht besetztem Gleis neu zu würfeln, ist clever! In der Tat genial! Jetzt überlege ich auch nicht mehr weiter, mein von @Goetz erweitertes Lua-Konstrukt in Graphik zu übersetzen. vor 2 Stunden schrieb Roter Brummer: Bitte nicht wundern: Die Variable kann auch per Zufall mehrfach hintereinander denselben Wert annehmen. Wenn das nicht gewünscht ist, einfach weiterwürfeln. Habe das anbei (natürlich inkl. der hilfreichen "gleichlaufenden" Listen von @Goetz) mal umgesetzt. Braucht noch eine Variable mehr, in der man sich merkt, was zuletzt "erfolgreich" ausgewürfelt wurde. Zufällige Zugwahl mit Listen ohne gleicher Zug erneut.mbp Beste Grüße Phrontistes
jloos Geschrieben 9. Mai 2023 Autor Geschrieben 9. Mai 2023 genial die Idee, die Gleisauswahl neu zu starten und damit das selbe Ereignis noch mal auszulösen. Vor allem solange, bis es passt. Das ist die Rücksprungfunktion, die ich in der EV immer vermisst habe . Ich danke Euch Gruß Jürgen
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 23 Minuten schrieb jloos: das selbe Ereignis noch mal auszulösen Etwas Vorsicht ist mit so etwas aber schon geboten, weil es in einer Endlos-Rekursion und damit im Nirwana enden könnte.
Roter Brummer Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 18 Minuten schrieb Phrontistes: Endlos-Rekursion und damit im Nirwana enden könnte Das kann in meinem Beispiel nicht passieren, weil der Auslöser ein Zug ist, der am Signalkontakt angehalten wird. Es befindet sich also garantiert mindestens ein Zug im Schattenbahnhof.
Goetz Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 8 Minuten schrieb Roter Brummer: Es befindet sich also garantiert mindestens ein Zug im Schattenbahnhof. Aber theoretisch könnte auch bei einhundert und mehr Würfen der einzig besetzte Platz nicht dabei sein. Der Zufall ist nicht gerecht. Und er hat kein Gedächtnis. Praktisch kann man diesen Ausnahmefall dennoch vernachlässigen.
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 (bearbeitet) Ja klar, hier nicht. Es ging mir nur darum, dass man generell bei "das selbe Ereignis noch mal auszulösen" mit etwas Vorsicht zu Werke geht. Mit meiner Erweiterung Deiner Logik dahingehend, dass der Zug sich nicht selbst wieder starten soll vor 1 Stunde schrieb Phrontistes: einfach weiterwürfeln ist nämlich schon nicht mehr gewährleistet, dass sie einen Zug findet, den sie starten soll. Bearbeitet 9. Mai 2023 von Phrontistes Wort fehlte
Roter Brummer Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor 3 Minuten schrieb Phrontistes: ist nämlich schon nicht mehr gewährleistet, dass einen Zug findet, den er starten soll. Er wird gar keinen finden können. Wenn es nur einen Zug gibt, der angenommener Maßen auf Gleis 1 steht, dann ist die 1 vorgemerkt und die wird in deinem Beispiel nie gewürfelt.
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Gerade eben schrieb Roter Brummer: Er wird gar keinen finden können. Wenn es nur einen Zug gibt Genau das ist ja das Problem.
Roter Brummer Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Naja, ein Schattenbahnhof mit nur einem Zug drin macht ja auch nicht wirklich Sinn, oder?
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 Hier was passiert mit meiner Logik und einem Zug: @Neo beendet das Theater irgendwann ohne dass das ganze MBS in den Wald läuft. Hoffentlich kommt das nicht irgendwann als "unerklärliches Phänomen" aus der Community zurück. Es passiert halt einfach - nichts ("Zug kommt nicht aus dem SBf, weiß auch nicht warum").
Phrontistes Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 vor einer Stunde schrieb jloos: damit das selbe Ereignis noch mal auszulösen. Vor allem solange, bis es passt. Hallo @jloos, also nochmal: So generell darfst Du das nur mit Vorsicht machen. Wenn es 25 mal nicht "passt", landest Du programmtechnisch in einen Stack Overflow und an der Oberfläche passiert - erwartungswidrig - gar nichts. Beste Grüße Phrontistes
Goetz Geschrieben 9. Mai 2023 Geschrieben 9. Mai 2023 (bearbeitet) Jetzt versteht ihr vielleicht besser, warum ich (in meinem Lua Beispiel!) zuerst eine Liste aller belegten Plätze anlege und dann zielsicher und mit nur einem Versuch einen zufälligen Platz aus dieser zweiten Liste greife? Bearbeitet 9. Mai 2023 von Goetz
HaNNoveraNer Geschrieben 10. Mai 2023 Geschrieben 10. Mai 2023 (bearbeitet) Alternativ kann man die Zufallszahl auch als Startindex nehmen und die ganze Liste ab da durchlaufen, bis man ein besetztes Gleis findet. Am Ende der Liste einfach an den Anfang springen und weitersuchen. Negative Rückmeldung wenn man kein belegtes Gleis findet bis man wieder am Start ankommt. Bearbeitet 10. Mai 2023 von HaNNoveraNer
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen.
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden