• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

While Schleife

izaseba

Geomaster
Hallo,
Ich hab schon wieder ein Problem/Frage :roll:

Und zwar möchte ich eine while Schleife in mein Programm einbinden, nur wie?
Der Builder bietet mir sowas nicht an (earwigo) und so wie ich mich errinern kann war das bei dem GS Builder auch nicht bei :???:

Also ganz kurz skizziert
while (a<3) {
if (.....)
a++;
else
message("...");
}
message("a ist größer als 3");

Ich weiß, es ist nicht ganz gramatisch richtig, sollte aber mein Vorhaben richtig darstellen :eek:ps:

Muß ich das zu Fuß ausprogrammieren?
Quasi als User Code?

Danke und Lieben Gruß

Sebastian
 

TeamBunteBlitze

Geocacher
Hallo,

Ich kann dir nur mit dem originalen Builder helfen.

Dort musst du es meines Wissens zu Fuss machen. Sag mal grob was du vorhast und dann sehen wir weiter.
 
OP
izaseba

izaseba

Geomaster
Hallo,
vielen Dank für Eure Antworten :^^:

Bei Earwigo kannst du in LUA programmieren. Damit sollte es gehen.

Jep, das geht sogar sehr gut!
Die Schleife klappt wunderbar, auch wenn der Simulator zum Schluß mit einem Bluescreen abkackt :roll:

Das ist aber wegzubekommen, hatte leider noch nicht die Zeit mich damit weiter auseinanderzusetzen.

Sag mal grob was du vorhast und dann sehen wir weiter.

Ich versuche es, wahrscheinlich ist die Lösung zum Schluß viel einfacher, als ich denke ;)

Es geht sich um den Finalen Kampf gegen wenn auch immer um was auch immer zu bekommen, damit man die Koordinaten bekommt um die Büchse endlich loggen zu dürfen ;)
Und da wir ja was gegen Gewalt haben und das ganze mal Kindertauglich bleiben soll, kämpfen wir nicht mit Waffen, sondern mit Worten :???: ( Stichwort "Monkey Island")

Also unser "Monster" versucht uns mit einem Spruch zu beleidigen, worauf der Spieler eine Auswahl an 5 möglichen Antworten bekommt, wo eine passend zu der Beleidigung wäre und die 4 anderen nicht.
Beispiel
Monster : Hast Du eine Idee, wie Du lebend hier rauskommst?
Spieler :Wieso? Die könntest Du viel eher gebrauchen!

Soll der Spieler 3 mal hintereinander die richtige Antwort geben, hat der den "Kampf" gewonnen :irre:

Die Antworten habe ich in einem Input eingebaut, ausgewertet werden sie in einem On Input Event und es klappt an sich wunderbar, nur wie gesagt, das Spielchen soll solange gehen, bis man es geschafft hat 3 Mal richtig zu antworten.

Und dafür eignet sich so eine while Schleife meiner Meinung nach perfekt :^^:

Und wie gesagt, das klappt soweit schon gut nur irgendwie stürzt das ganze noch ab :sad2:


Puh...

Viel Text, aber ich wüßte nicht, wie man das ganze kürzer beschreiben könnte :???:

Danke schon mal fürs Lesen und für die Antwort :D

Gruß Sebastian
 

sax76

Geocacher
Eine while Schleife wird hier wahrscheinlich nicht wie Gedacht funktionieren.
Wenn ein Dialog, eine Message oder ein Input aufgerufen wird, wird das entsprechende Fenster angezeigt, dieses ist jedoch ein eigenständiges Objekt und stoppt den Ablauf des aufrufenden Scripts nicht. Das Fenster "lebt" solange, bis der Spieler es durch eine Eingabe schließt oder bis ein ein neues Fenster der genannten Arten geöffnet wird.
Deshalb wirst du z.B. bei einem derartigen Skript:
Code:
message("  ")
getInput(...)
im Player nur den Input zu sehen bekommen, da durch den Input das message Fenster gleich wieder abgeschossen wird.
Dasselbe passiert in der while Schleife, die Schleife läuft ohne Unterbrechung wieder und wieder durch und öffnet dabei jeweils ein neues message Fenster, das alte (identische) wird abgeschossen.
Statt der while Schleife kannst du aber die Inputs verketten. Wenn Frage eins richtig beantwortet wurde inkrementiere a und rufe dann, egal ob die Antwort richtig war oder nicht, Frage zwei auf. Analog rufst du mit Frage 2 Frage 3.
Im OnInput Skript von Frage 3 wertest du am Ende a aus. Ist a=3 geht es weiter, ist a kleiner 3 setzt du a=0 und rufst dann Frage 1 erneut auf. Da die Fenster nicht zur aufrunden Funktion zurückspringen ist diese Vorgehensweise keine Rekursion und birgt somit auch nicht die Gefahr eines Stack Überlaufs.


PS: Ich hatte Anfang des Jahres fast das gleiche Problem (es war ein Kampf), da ich die
Code:
while Schleife praktischer fand versuchte ich folgendes
while(a<3) {
   warten=true;
   message(...) (mit Buttonscript, das beim beenden der Message warten=false setzt )
   while(warten) {
      tmp=0 (es gibt keinen no operation befehl oder?)
   }
}
Dies endete immer mit einem bluescreen, weshalb ist mir bis heute nicht klar.
 
OP
izaseba

izaseba

Geomaster
Danke für die Antwort sax76.

Irgendwie verstehe ich es noch nicht so ganz :sad2:

Die Inputs verketten ist noch klar, muß ich das ganze dann als eigenständige Funktion schreiben?

Weil
ist a kleiner 3 setzt du a=0 und rufst dann Frage 1 erneut auf.
Sieht mir wieder nach eine While Schleife, oder zumindest

Code:
if a<3 then funktion()

Ich stelle mich hier doch ein wenig blöd an, glaub ich.

Gruß Sebastian
 

sax76

Geocacher
Ich versuche es mal an einem Beispiel zu erläutern:

- Der Spieler sieht den Charackter "fürchterlicher Pirat".
- "fürchterlicher Pirat" hat ein Script "ansprechen"
- Dieses skript ruft Frage 1 auf
- Das onInput script von Frage setzt als erstes a=0,
es erhöt a um 1 eins wenn die Antwort richtig war, dann ruft es Frage 2 auf.
- Das onInput script von Frage 2 erhöt a um eins wenn die Antwort richtig war,
dann ruft es Frage 3 auf.
- Das oninput script von Frage 3 erhöt wieder a um eins, wenn die Antwort richtig war,
danach fragt es ab ob a=3 ist, wenn nein ruft es Frage eins auf, wenn ja endet der Kampf

Dieses vorgehen beendet den Kampf, wenn alle drei Fragen am Stück richtig beantwortet werden. Wenn nicht geht es wieder mit der ersten Frage los.

Vom Prinzip her passiert das selbe wie bei einer while Schleife, aber hier tritt das Problem nicht auf, dass das aufrufende Script einfach immer weiter läuft und nicht darauf wartet das im Input Fenster etwas passiert.
 

sTeamTraen

Geocacher
sax76 schrieb:
PS: Ich hatte Anfang des Jahres fast das gleiche Problem (es war ein Kampf), da ich die
Code:
while Schleife praktischer fand versuchte ich folgendes
while(a<3) {
   warten=true;
   message(...) (mit Buttonscript, das beim beenden der Message warten=false setzt )
   while(warten) {
      tmp=0 (es gibt keinen no operation befehl oder?)
   }
}
Dies endete immer mit einem bluescreen, weshalb ist mir bis heute nicht klar.
Sorry, my German isn't good enough to answer this, I hope you can understand it in English.

You're programming in Lua, which is a cooperative (not pre-emptive) multitasking environment. This makes the code nice and small so it can fit into a handheld device, but it means that you can't use "busy waits", which is what your loop does.

If you want to display a message, wait for input, and then call function X, you do it like approximately this (assuming that you want to force the player to enter a zone 3 times before anything happens):

Code:
function cartridge:onStart ()
 count = 0
end

function zone:onEnter ()
 Wherigo.MessageBox('hello, please press a button', Buttons={'OK','OK2'}, Callback=cb1)
end

function cb1 ()
 count = count + 1
 if (count > 3)
-- you entered the zone 3 times, so do something exciting
 end
end

So it's not like coding in C, where "message()" would probably display the message, wait for user input, and return only when the user hits Enter. The call to Wherigo.MessageBox() returns immediately, and once you get to the end of the current event handler, all the waiting is done for you by Lua. Your program will "wake up" again when another event happens.

Now, writing all these callback routines is a lot of work in the Groundspeak builder. One advantage of Earwigo is that you can put this code in a Function and then just call the function with a single line. That can often save you from having to write Lua code at all; you can use regular builder functions to assemble the statements in a Function.

Feel free to ask for more help in the Earwigo support group. Das geht auch auf Deutsch. :)
 
OP
izaseba

izaseba

Geomaster
Danke für Eure Antworten :2thumbs:

So wie es sax76 beschrieben hat klappt es wurderbar!

Gruß

Sebastian
 
Oben