Jump to content

Goetz

Mitglieder
  • Gesamte Inhalte

    5984
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Goetz

  1. Erkläre ich im Posting darüber. Zumindest habe ich es versucht. Ist nicht ganz leicht in Worte zu fassen. Wenn ich wieder mehr Zeit habe, dann versuche ich vielleicht mal es im Rahmen einer Twitch Sendung zu erklären. Mir würde es sehr helfen, wenn du dir vorab mein Posting durchlesen und dann sagen könntest, an welcher Stelle du den Faden verlierst.
  2. Der Hauptgrund ist, dass Variablen verschiedenen Typs unterschiedlich viel Speicherplatz benötigen. Und ein Programm muss den Platz für dese Daten reservieren. Dabei geht es nicht nur um die Gesamtmenge an Platz, die zur Verfügung steht. (Davon haben wir alle heute reichlich.) Sondern auch darum, das ich den Ort des nächsten Speicherplatzes nur dann bestimmen kann, wenn ich weiß wo der vorherige endet. Ein weiterer Grund ist der, dass Daten unterschiedlichen Typs verschieden miteinander verbunden werden. Du kannst beispielsweise Zahlen addieren, wohingegen du Texte aneinander reihst. Und die boolschen Werte true und false kannst du mit "and", "or" und weiteren boolschen Operatoren verknüpfen. Drum brauchst du für unterschiedliche Zwecke auch unterschiedliche Typen. Booleans nimmst du für an und aus, wahr und falsch. Also für Bedingungen. Zahlen nimmst du, wenn du sie mathematisch verändern willst. Texte nimmst du, wenn du sie irgendwo anzeigen willst. Und dann, wenn du Texte geliefert bekommst. Fahrzeugnamen sind zum Beispiel Texte.
  3. Aber dann muss die Abfahrt des Zuges auch nicht an das Erreichen der Ausgangsposition gekoppelt sein. Ist es ja in der Realität auch nicht. Der Lokführer füllt noch ein paar Papiere aus, macht den Deckel auf seine Thermoskanne, wischt den Becher aus, bevor er ihn auf diesen Deckel stülpt, sammelt auf dem Smartphone die letzten drei Coins, die er sich mit einem "kostenlosen Onlinespiel" verdient hat, meldet dann über Funk, dass er bereit ist und kriegt von der Leitung die Erlaubnis zur Weiterfahrt. Das dauert alles in allem 10 Sekunden, egal ob der Kran schon früher die Startposition erreicht hat oder nicht. Mit anderen Worten. Es wirkt lebendiger und glaubwürdiger, wenn nicht eins das nächste auslöst, sondern beide unabhängig (und vielleicht auch zeitlich etwas überlappend) stattfinden. Und mit dem neuen "Aktion verzögern" kannst du die Abfahrt des Zuges ganz fantastisch etwas hinauszögern, ohne Klimmzüge in der EV zu machen. Im Filmschnitt ist der schlimmste Anfängerfehler der, dass Aktion an Aktion an Aktion geschnitten wird. Das wird steif und ergibt niemals eine flüssige Geschichte.
  4. Das deckt sich zumindest mit meiner Vermutung.
  5. Klick einfach aufs Profilbild eines Users, Claudia. Dann siehst du eine Auflistung all seiner Beiträge hier. Und mit einem Klick auf den blau hervorgehobenen Namen im Posting klappt es auch. Nachtrag: Auf meinem Profilbild siehst du auch, wo ich gerade bin. Ich hocke auf dem Fußboden und spiele
  6. Ich denke nicht, dass du einen Denkfehler machst, sondern dass Lua sich hier unorthodox verhält. Vielleicht liegt es daran, dass die erste Lücke sozusagen vor der Tabelle liegt. Die Lücken liegen in Lua nicht sortiert vor. Deshalb hast du keine Kontrolle darüber, welche Lücke Lua wann wählt. Beispiel = {"Eins"} Beispiel[4] = "Vier" Beispiel[5] = "Fünf" Beispiel[9] = "Neun" table.insert(Beispiel, "Zwei") table.insert(Beispiel, "Drei") table.insert(Beispiel, "Sechs") table.insert(Beispiel, "Sieben") table.insert(Beispiel, "Acht") table.insert(Beispiel, "Zehn") for i = 1, 10 do print(("%2d - %s"):format(i, Beispiel[i])) end Das Wort "Zehn" ist an Position 11 eingefügt worden und deshalb in der Auflistung gar nicht zu sehen.
  7. Der aufwändige Mechanismus zum Tauschen der Werte muss in Lua eigentlich nicht sein. Denn Lua erlaubt diese Schreibweisen: a, b = b, a a, b, c, d, e = b, c, d, e, a Aber beim Versuch das so zu vereinfachen bin ich vorhin gescheitert. Drum habe ich den Tauschmechanismus erst einmal ganz klassisch geschrieben.
  8. Es hat mir doch keine Ruhe gelassen Das ist mein Vorschlag für das Skript: Wuerfel = {$("Quader_1"), $("Quader_2"), $("Quader_3"), $("Quader_4"), $("Quader_5")} Tausch = { [1] = function(w1, w2, w3, w4, w5) local temp = w1.transformation.position w1.transformation.position = w2.transformation.position w2.transformation.position = w3.transformation.position w3.transformation.position = w4.transformation.position w4.transformation.position = w5.transformation.position w5.transformation.position = temp end, [2] = function(w1, w2, w3, w4, w5) local temp = w1.transformation.position w1.transformation.position = w2.transformation.position w2.transformation.position = temp temp = w3.transformation.position w3.transformation.position = w4.transformation.position w4.transformation.position = w5.transformation.position w5.transformation.position = temp end } function neueAufgabe() for i = #Wuerfel, 2, -1 do table.insert(Wuerfel,table.remove(Wuerfel, math.random(i))) end Tausch[math.random(2)](Wuerfel[1], Wuerfel[2], Wuerfel[3], Wuerfel[4], Wuerfel[5]) end Die Würfel dürfen eine beliebige Startposition haben. Sie tauschen immer nur ihre Plätze. Drückt man den blauen Knopf (rechts), dann wird bei Stellung 1 die Funktion neueAufgabe() aufgerufen. Nach einer kurzen Verzögerung wird der Knopf wieder in Stellung 0 zurückgesetzt. Die Beispielanlage habe ich angehängt. Viel Spaß damit Götz TimeSaver Shuffle 01.mbp
  9. Jetzt habe ich (endlich) die richtige Idee dazu gehabt. Mal schauen, ob ich es in verständliche Worte fassen kann, weil ich noch nicht die Ruhe habe es wirklich umzusetzen. Unser Enkelsohn meinte: "Schieb alle eins weiter. Dann hat jeder Klotz eine andere Position. So mach ich das immer." Für einen Neunjährigen fand ich das clever. Aber es wäre natürlich unbefriedigend, weil zu vorhersehbar und nicht zufällig genug. Deshalb hatte ich seinen Vorschlag gleich wieder verworfen. Zu Unrecht, wie ich gerade erkannte. Denn wenn man zuerst die fünf Würfel (mit ihren aktuellen Positionen!) in eine beliebige Reihenfolge bringt und dann den Ringtausch durchführt, dann kann jedes legitime Ergebnis herauskommen und garantiert kein Klotz an seinem Platz verbleiben. Nächste Woche probiere ich es gerne selbst aus. Aber wenn mir jemand zuvor kommen möchte: Nur zu. Ich würde mich freuen. Götz Korrektur: Auch wenn ich die Würfel vorab in eine beliebige Reihenfolge bringe und dann den Ringtausch durchführe, können nicht alle erdenklichen Lösungen entstehen. Denn bei diesem Ansatz können zwei Würfel nie ihre Plätze tauschen (was aber legitim wäre.) … Mist!!! Erweiterung der Methode: Im Prinzip kann es nur zwei Muster beim Positionswechsel geben. Entweder A: ein Ringtausch von 5 Positionen. Oder B: ein Ringtausch für drei Würfel und die verbleibenden zwei tauschen miteinander. Bitte dabei im Hinterkopf behalten, dass zuvor die Reihenfolge der Würfel zufällig geändert wurde. Die Tauschpartner sind also zufällig, aber die Positionsdaten werden anschließend nach einem der beiden genannten Muster weitergereicht. Alle legalen Ergebnisse stimmen mit einem der beiden Muster überein. Und die beiden Varianten verteilen sich (vermutlich) 50:50 auf die möglichen Ergebnisse. Wenn man also zufällig Muster A oder B auswählt und die Positionen der beliebig sortierten Würfel diesem Muster folgend weitergibt, dann müssten doch alle legitimen Ergebnisse dieselbe Chance haben und die nicht legitimen (mit Würfen am alten Platz) ausgeschlossen sein.
  10. Ist das wirklich ein Schloss? (engl. lock) Oder ein Eintrag in einer Liste? (engl. log) Oder ist die Lokomotive gemeint? (deutsche Kurzform: Lok) Ich tippe auf log, denn das passt am besten zu einem Eintrag, der z.B. den Zugnamen enthalten kann. (siehe Logbuch) Sorry - Zwischenfrage hat sich erledigt. Der erste, der sich einträgt, belegt die Variable und verriegelt dadurch etwas. Deshalb "lock".
  11. Your second version should work if you alter my code a little bit. Your first list produced an error because in Lua you may not leave a field empty. Your third list failed because in Lua an empty string is considered true (and equally a 0 is considered true too) I built the previous example according to your request and it only checked for a switch 3 value when one for switch 2 was present. Here's the fix, where every switch is checked individually: Pos = { T1 = {0, nil, 1}, T2 = {1, 0}, T3 = {1, 1, 0} T4 = {nil, 1, nil, nil, 0, 1} } trajet = vehicle.variables["Trajet"] if Pos[trajet][1] then $("SW1").state = Pos[trajet][1] end if Pos[trajet][2] then $("SW2").state = Pos[trajet][2] end if Pos[trajet][3] then $("SW3").state = Pos[trajet][3] end if Pos[trajet][4] then $("SW4").state = Pos[trajet][4] end if Pos[trajet][5] then $("SW5").state = Pos[trajet][5] end if Pos[trajet][6] then $("SW6").state = Pos[trajet][6] end Better build this in a loop. To do so, you need the switch objects in a table too: Pos = { T1 = {0, nil, 1}, T2 = {1, 0}, T3 = {1, 1, 0} T4 = {nil, 1, nil, nil, 0, 1} } SwitchList = {$("SW1"), $("SW2"), $("SW3"), $("SW4"), $("SW5"), $("SW6")} trajet = vehicle.variables["Trajet"] for k, v in pairs(SwitchList) do if Pos[trajet][k] then v.state = Pos[trajet][k] end end Please note that you must enter the switch objects into your list by typing the Dollar-Sign and then picking the item from the object list. The names are only a reminder and do not function as a reference! Hence you cannot copy the complete switch table from my example. My entire construct is not an ideal solution. I did my best to stay close to your attempt. My observation is that people learn best when they can build on what they already know.
  12. Hello André see if this works, please Pos = { T1 = {0} T2 = {1, 0} T3 = {1, 1, 0} } trajet = vehicle.variables["Trajet"] $("SW1").state = Pos[trajet][1] if Pos[trajet][2] then $("SW2").state = Pos[trajet][2] if Pos[trajet][3] then $("SW3").state = Pos[trajet][3] end end greets Goetz
  13. und die bringt großartige Resultate hervor.
  14. Versuch mal die Anlage in V4 zu exportieren und dann diese .mbp in V5 zu laden ... Geht das?
  15. Es wäre wirklich hilfreich, wenn du die betroffene Anlage samt Schalter in dem Zustand speicherst und hier anfügst, den sie hat bevor du den Schalter "verbindest oder in die EV einträgst". Und dann möglichst detailliert die Schritte beschreibst die du durchführst, um den Schalter zu verbinden bzw. in der EV einzutragen. Dann könnten wir deine einzelnen Schritte einen nach dem anderen genau so durchführen und schauen, an welcher Stelle sich das MBS aufhängt.
  16. hihihi - das trifft es gut
  17. That has no relation to your particular problem. A variable may be use as a counter when multiple tracks are crossed. It's to ensure that all trains have passed before the barrier opens again. It has nothing to do with stopping road traffic at a barrier or traffic light (which is what you're struggling with at the moment.) To stop any traffic, you need to use a track (in version 4) or a contact (in version 5) on the road at a distance to the actual signal or barrier. Use the event of a vehicle treading on that track element or contact to trigger the following: Make the status of the signal or barrier your condition. State that when the condition is met (i.e. the state is "stop", "close" or similar), the triggering vehicle has it's target speed set to 0.
  18. Nein, das heißt es nicht. Ein Ereignis löst einen Funktionsaufruf aus. All das, was du einem Ereignis zuweist, ist also zusammen der Body einer Funktion. Und es ist nicht sinnvoll in einem Funktionsbody eine weitere Funktion zu definieren. Es ist nur sinnvoll innerhalb dieser Funktion weitere Funktionen aufzurufen. Den Rest später, wenn ich den Kopf richtig frei habe. Aber deine Funktionsdefinition innerhalb einer Funktionsdefinition ist schon Teil des "Pferd von hinten aufzäumen" Problems.
  19. Du auch, Andy Wenn du deinen Versuch ausgeschlafen und bei Tage betrachtest. Zum Beispiel gehört die Funktionsdefinition nicht in das Schalterereignis, sondern nur ein Funktionsaufruf. Du willst doch die Funktion nicht jedes Mal, wenn der Schalter betätigt wird, neu bauen sondern nur erneut ausführen. Tabellen sind auch nicht "hartnäckig read only", wenn du das Pferd nicht von hinten aufzäumst.
  20. Zweiter Ansatz: Tausche zwei beliebige Positionen. Tausche von den verbliebenen drei wieder zwei Positionen. Tausche dann den letzten der fünf Klötze mit einem beliebigen der anderen vier. Das ergäbe langfristig alle verfügbaren Muster und für den nächsten Wurf wäre garantiert, dass keiner der fünf Klötze an seinem Platz verbleibt. Aber für jeden Wurf stünde mit dieser Methode nur ein Teil der denkbaren Ergebnisse zur Verfügung. Deshalb finde ich es unbefriedigend und steuere es nur als Denkansatz bei.
  21. Goetz

    V5 Kopfweh

    Ich habe meine erste Antwort mehrfach ergänzt und dabei nicht bedacht, dass du dann vielleicht nach Lesen der ersten Fassung keine Nachricht mehr bekommen hast, dass ich den Fehler lokalisieren und beheben konnte ... Sorry
  22. Kurz ein erster Einfall dazu: Es gibt insgesamt nur 120 mögliche Stellungen. (5 x 4 x 3 x 2 x 1) Die kann man alle in einer Tabelle auflisten und dann jeweils die ausschließen, die eine oder mehrere Positionen mit der aktuellen Stellung gemeinsam haben. Aus den verbliebenen würfelt man dann die neue Stellung. So sind Zufall und fünf neue Positionen immer garantiert. Das ist auf jeden Fall besser, als beliebige Zufallsergebnisse zu prüfen, ob sie eine gleiche Position enthalten und gegebenenfalls neu zu würfeln, bis man "Glück" hat.
  23. Okay, dann ist das natürlich richtig. Aber für die "kein Klotz darf an seiner alten Position verbleiben" Anforderung (die natürlich sinnvoll ist!) muss ich mir noch etwas überlegen. Das leistet meine "Lottoziehung" nicht. Die von dir vorgeschlagene Änderung kann das auch nicht. Wir müssen da eine grundsätzlich andere Methode stricken. Leider habe ich für die nächsten 8 Tage nur sporadisch Zeit, weil ich hier (zuhause) sehr in Anspruch genommen werde. Aber falls mir da in einer ruhigen Minute etwas einfällt, lasse ich es dich wissen.
  24. Okay, der Kern der Geschichte ist folgender: Alle 8 Möglichkeiten stehen in einer Tabelle. Da wir daraus fünf verschiedene haben wollen, müssen wir wie bei der Ziehung der Lottozahlen vorgehen. Wir spielen also 5 aus 8 statt 6 aus 49. Wir erzeugen eine Zufallszahl zwischen 1 und 8 und nehmen das Element aus der Tabelle. Jetzt sind nur noch 7 Elemente übrig. Also würfeln wir eine Zahl zwischen 1 und 7 und nehmen das Elemente ebenfalls raus. Dann würfeln wir eine Zahl zwischen 1 und 6 … Die aussortierten Elemente müssen wir der Reihe nach irgendwo aufbewahren. Und weil wir beim nächsten Spiel wieder die ganze Tabelle als Anfangsstadium nutzen wollen, ist es praktisch die gewürfelten Elemente der Reihe nach hinten an die selbe Tabelle anzuhängen. Die Zeile for i = #Tabelle, 2, -1 do erzeugt der Reihe nach Zahlen von 8 (#Tabelle enthält die Anzahl der Elemente in der Tabelle) runter bis 2. Das -1 an dritter Stelle sorgt dafür, dass bei jedem Durchgang eins runter gezählt wird und nicht - wie sonst üblich - rauf. Beim ersten Durchlauf der Schleife steht in i also eine 8. math.random(8) erzeugt eine zufällige ganze Zahl zwischen 1 und 8. table.remove() entnimmt der Tabelle, die im ersten Argument genannt wird, das Element, welches im zweiten Argument genannt wird. table.remove(Tabelle, math.random(8)) nimmt also ein zufälliges Element zwischen 1 und 8 aus der Tabelle namens "Tabelle". table.insert() setzt in der Tabelle, die als erstes Argument genannt wird, das ans Ende, was als zweites Argument genannt wird. Und an zweiter Stelle steht die Funktion table.remove(). Damit wird das zufällige Element, welches table.remove rausholt, am Ende derselben Tabelle wieder angehängt. Das 8. Element der Tabelle ist jetzt nicht mehr wichtig. Zur Auswahl stehen nur noch die ersten 7 Elemente der Tabelle. Beim zweiten Schleifendurchlauf steht deshalb in i eine 7. Wir würfeln eine zufällige Zahl zwischen 1 und 7, picken dieses Element aus der Tabelle und hängen es wieder hinten an. Dann machen wir das Spiel mit den ersten 6 Elementen der Tabelle noch einmal. Und so weiter, bis wir alle 8 Elemente in zufälliger Reihenfolge in der Tabelle stehen haben. Jetzt können wir die ersten 5 Elemente dieser Tabelle als unsere "Ziehung" präsentieren. (Wer genau verstanden hat, was passiert, der erkennt dass ich vergessen habe zum Schluss das erste Element nach hinten zu schieben. Da dieses Element aber jedes der 8 ursprünglichen Elemente sein kann, macht es für das Ergebnis keinen Unterschied.) Die 8 Elemente der Tabelle sind in diesem Fall selber kleine Tabellen, welche die x, y und z Koordinaten enthalten. Deshalb muss die Liste 8 Koordinatengruppen enthalten. Du musst auch den 3 Würfeln einen (versteckten) Platz zuweisen, die diesmal am Ende der Auswahl gelandet sind und somit nicht mitspielen. Bitte, lass mich wissen wie weit dir das hilft und wo du weiteren Erklärungsbedarf hast.
×
×
  • Neu erstellen...