Jump to content

Abrufen eines zufälligen Zuges aus dem SB


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Phrontistes
PS eingefügt
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Roter Brummer
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Goetz
Schreibfehler korrigiert
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Phrontistes
Wort fehlte
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier was passiert mit meiner Logik und einem Zug:

Screenshot2023-05-09205341.thumb.jpg.cda5aa0380c434e209b59c0861149780.jpg

@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").

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von HaNNoveraNer
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...