AMIGA-RESISTANCE https://forum.amiga-resistance.info/ |
|
Anfänger: Wie vermeide ich Spaghetticode https://forum.amiga-resistance.info/viewtopic.php?f=38&t=3529 |
Seite 1 von 2 |
Autor: | Mr_Blues [ 23 Mai 2017, 08:48 ] |
Betreff des Beitrags: | Anfänger: Wie vermeide ich Spaghetticode |
Endlich kommt ein deutsches Handbuch und ich versuche mich mal mit Programmieren. Bin blutiger Anfänger seit meinen C64- Zeiten. Ziel ist ein Quiz für meine Schulungen zum Thema Demenz zu erstellen. Beim Lernen muß ich aber jeden einzelnen Schritt verstehen, deswegen sind einfache Lösungen besser für mich als die "beste". Um Buttons zu kreieren habe ich RapaGUI gewählt, da hat das jedenfalls auf Anhieb geklappt. Mein Problem ist, daß ich gerade "Spaghetticode" schreibe, weil ich neue Fragen bei einer richtigen Antwort nachladen möchte und es schon bei der zweiten Frage unübersichtlich wird, da ich anscheinend bei jeder neuen Frage eine neue Funktion schreiben muß. Neue Fragen zu laden, muß doch auch einfacher zu machen sein, als meine Chaos-Lösung, oder? Hier einmal das hws-Script: Code: Alles auswählen ;Hollywood-Version @VERSION 6,1 ;Einbinden von RAPAGUI @REQUIRE "RapaGUI" ;Progranmminfo @APPTITLE "Silviahemmet-Quiz" @APPCOPYRIGHT "(C) 2017 Arnim Wolff" @APPAUTHOR "Arnim Wolff" @APPDESCRIPTION "Fragen zur Silviahemmet-Schulung" ;Bildschirm ;Festlegung der Brushes ;Festlegung der Sounds @SAMPLE 1, "Good.wav" @SAMPLE 2, "Poor.wav" @SAMPLE 3, "True.wav" @SAMPLE 4, "False.wav" ;Beenden des Programmes EscapeQuit(True) ;Intro ;Score score=0 ;Fragen moai.CreateApp(FileToString("silvia.xml")) Function p_Frage1(msg) Switch msg.action Case "RapaGUI": Switch msg.attribute Case "Pressed": If msg.id = "bt2" ;richtige Antwort PlaySample(3) moai.Request("", "Glückwunsch! Das ist richtig!" , "OK") moai.Request("", "Die Silviahemmet Stiftung wurde 1996 in Schweden durch die Königin Silvia ins Leben gerufen" , "OK") score=score+1 moai.CreateApp(FileToString("silvia2.xml")) Function p_Frage2(msg) Switch msg.action Case "RapaGUI": Switch msg.attribute Case "Pressed": If msg.id = "bt2" ;richtige Antwort PlaySample(3) moai.Request("", "Glückwunsch! Das ist richtig!" , "OK") moai.Request("", "Das Nervensystem unterteilt sich in ein autonomes und peripheres" , "OK") score=score+1 moai.CreateApp(FileToString("silvia2.xml")) ElseIf msg.id = "bt1" ;falsche Antwort PlaySample(4) moai.Request("", "leider falsch" , "OK") ElseIf msg.id = "bt3" ;falsche Antwort PlaySample(4) moai.Request("", "leider falsch" , "OK") ElseIf msg.id = "bt4" ;falsche Antwort PlaySample(4) moai.Request("", "leider falsch" , "OK") ElseIf msg.id = "bt5" ;Lernen PlaySample(4) moai.Request("", "leider falsch" , "OK") EndIf EndSwitch EndSwitch EndFunction InstallEventHandler({RapaGUI = p_Frage2}) ElseIf msg.id = "bt1" ;falsche Antwort PlaySample(4) moai.Request("", "leider falsch" , "OK") ElseIf msg.id = "bt3" ;falsche Antwort PlaySample(4) moai.Request("", "leider falsch" , "OK") ElseIf msg.id = "bt4" ;falsche Antwort PlaySample(4) moai.Request("", "leider falsch" , "OK") ElseIf msg.id = "bt5" ;Lernen PlaySample(4) moai.Request("", "leider falsch" , "OK") EndIf EndSwitch EndSwitch EndFunction InstallEventHandler({RapaGUI = p_Frage1}) ; Hauptschleife Repeat WaitEvent Forever liefert zusammen mit folgenden xml-Dateien Silvia.xml <?xml version="1.0" encoding="iso-8859-1"?> <application id="app"> <window title="Frage 1"> <hgroup> <vgroup frame="true" frametitle="Wann wurde die Silviahemmet-Stiftung gegründet?" id="frage1"> <vgroup> <button id="bt1">1994</button> <button id="bt2">1996</button> <button id="bt3">1999</button> <button id="bt4">2002</button> <button id="bt5">2004</button> <rectangle/> </vgroup> </vgroup> </hgroup> </window> </application> Silvia2.xml <?xml version="1.0" encoding="iso-8859-1"?> <application id="app2"> <window title="Frage 2"> <hgroup> <vgroup frame="true" frametitle="Wie ist das Nervensystem eingeteilt?" id="frage2"> <vgroup> <button id="bt1">peripher und autonom</button> <button id="bt2">autonom und zentral</button> <button id="bt3">es gibt nur ein Nervensystem</button> <button id="bt4">zentral und peripher</button> <button id="bt5">die Frage nervt</button> <rectangle/> </vgroup> </vgroup> </hgroup> </window> </application> Für jede Hilfe bin ich dankbar.... |
Autor: | HelmutH [ 23 Mai 2017, 17:19 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Hi Mr_Blues Erstmal ein herzliches willkommen hier in der Deutschen Hollywood Ecke. Hab mir mal erlaubt deinen Quelltext in die Code Zeichen zu packen, damit der besser erkennbar ist. Leider kann ich dir da nicht weiterhelfen, weil ich bis jetzt noch nicht dazu gekommen bin mal mehr in die Programierung mit Hollywood reinzuschuppern. Aber es gibt hier ein paar (Tipsi, Murmel, msu, ...) die echt fit im Umgang mit Hollywood sind und dir sicherlich da was zu schreiben können sobald sie es hier lesen. |
Autor: | Tipsi [ 23 Mai 2017, 22:58 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues RapaGUI ist leider auch für mich absolutes Neuland. Ich habe mich bis jetzt nicht mit dieser GUI befasst, darum kann ich Dir nicht 100% helfen. Aber mal schauen, was das Handbuch uns mitteilen kann. Wenn ich das richtig gelesen habe, kann man den Text von einem Knopf/Taster (Button) während der Laufzeit mit folgendem Befehl ändern: Code: Alles auswählen moai.Set(id$, attr1$, val1$, ...) Zeile: Code: Alles auswählen moai.Set("bt1", "Text", "Das ist der neue Text") Frage mit folgender Zeile geändert werden können: Code: Alles auswählen moai.Set("frage1", "Title", "Und hier die neue Frage") Die Fragen, Antworten und welche Antwort die richtige ist, würde ich alles extern vom Programm in eine Datei schreiben. So kann dann Dein Programm die Frage und die möglichen Antworten Zeile für Zeile aus der Datei laden. Aber ich muss nun ins Bett und ich erkläre das gerne nach dem Schlafen. Griessli Tipsi |
Autor: | Tipsi [ 24 Mai 2017, 20:01 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues Ich kämpfe im Moment gerade damit, dass der Fragetext, der als Titel in der vgroup geschrieben ist, nicht mit MUI unter Version 4.0 geändert werden kann. Auch die Möglichkeit, den Titel des Fensters zu ändern, versteckt sich vor mir. Hab noch etwas Geduld. Griessli Tipsi |
Autor: | Tipsi [ 24 Mai 2017, 21:06 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues So auf die schnelle fand ich nicht die richtigen Möglichkeiten, um die Fragen in einem guten Objekt unterzubringen. Ich war so frei und habe mal Buttons dafür misbraucht. Ist aber nicht die Lösung. Trotzdem denke ich, dass es Dir helfen kann, die richtigen Objekte zu finden. Ausserdem kannst Du damit mal Arbeiten und schauen, wie die Fragen geladen werden. Ich habe mehrere Funktionen geschrieben und Dein Code ein wenig umgemodelt. Schaue ihn in aller Ruhe an. Hier mal der Hollywood-Code: Code: Alles auswählen ;Hollywood-Version @VERSION 6,1 ;Einbinden von RAPAGUI @REQUIRE "RapaGUI" ;Progranmminfo @APPTITLE "Silviahemmet-Quiz" @APPCOPYRIGHT "(C) 2017 Arnim Wolff" @APPAUTHOR "Arnim Wolff" @APPDESCRIPTION "Fragen zur Silviahemmet-Schulung" ;Bildschirm ;Festlegung der Brushes ;Festlegung der Sounds @SAMPLE 1, "Good.wav" @SAMPLE 2, "Poor.wav" @SAMPLE 3, "True.wav" @SAMPLE 4, "False.wav" ;Intro ;Fragen moai.CreateApp(FileToString("silvia3.xml")) ; ----------------- ;----------------------- Globale Variablen ------------------------- ; ----------------- ;Score score=0 ;Fragen und Antworten Frage = {} ;mit = {} werden Tabellen deklariert RichtigeAntwort = {} AntwortZusatz = {} Antwort1 = {} Antwort2 = {} Antwort3 = {} Antwort4 = {} Antwort5 = {} AntwortRichtig1 = False ;wird auf True gesetzt, falls es.. AntwortRichtig2 = False ;..die richtige Antwort ist. AntwortRichtig3 = False AntwortRichtig4 = False AntwortRichtig5 = False ;Zähler AktuelleFrage = 0 FragenZaehler = 0 ;Die Felder in Tabellen fangen.. ;..bei 0 an ; ---------- ;----------------------- Funktionen ----------------------- ; ---------- Function p_FragenLaden() Local Vorhanden = False ;Alle lokalen Variablen werden beim.. Local Datei = "Fragen.txt" ;..Verlassen der Funktion p_FragenLaden().. Local Leerzeile = "" ;..aus dem Speicher gelöscht Local Weiter = 0 Vorhanden=Exists(Datei) If Vorhanden=True ;Wenn Datei vorhanden, wird sie geöffnet OpenFile(1,Datei,#MODE_READ) While Not Eof(1) Frage[FragenZaehler] = ReadLine(1) RichtigeAntwort[FragenZaehler] = ReadLine(1) AntwortZusatz[FragenZaehler] = ReadLine(1) Antwort1[FragenZaehler] = ReadLine(1) Antwort2[FragenZaehler] = ReadLine(1) Antwort3[FragenZaehler] = ReadLine(1) Antwort4[FragenZaehler] = ReadLine(1) Antwort5[FragenZaehler] = ReadLine(1) If Not Eof(1) ;Falls am Ende der Datei die Leerzeile.. Leerzeile = ReadLine(1) ;..vergessen wurde, wird kein Fehler.. EndIf ;..gemeldet FragenZaehler = FragenZaehler+1 Wend CloseFile(1) Else ;Datei ist nicht vorhanden Weiter = SystemRequest("Fehler","Datei mit Fragen nicht gefunden!","Programm beenden") End() EndIf EndFunction Function p_NaechsteFrage() Local FrageNummer = AktuelleFrage+1 moai.Set("fbt1", "Text", "Frage "..FrageNummer.." von "..FragenZaehler) moai.Set("fbt2", "Text", Frage[AktuelleFrage]) moai.Set("bt1", "Text", Antwort1[AktuelleFrage]) moai.Set("bt2", "Text", Antwort2[AktuelleFrage]) moai.Set("bt3", "Text", Antwort3[AktuelleFrage]) moai.Set("bt4", "Text", Antwort4[AktuelleFrage]) moai.Set("bt5", "Text", Antwort5[AktuelleFrage]) If RichtigeAntwort[AktuelleFrage] = "1" AntwortRichtig1 = True Else AntwortRichtig1 = False EndIf If RichtigeAntwort[AktuelleFrage] = "2" AntwortRichtig2 = True Else AntwortRichtig2 = False EndIf If RichtigeAntwort[AktuelleFrage] = "3" AntwortRichtig3 = True Else AntwortRichtig3 = False EndIf If RichtigeAntwort[AktuelleFrage] = "4" AntwortRichtig4 = True Else AntwortRichtig4 = False EndIf If RichtigeAntwort[AktuelleFrage] = "5" AntwortRichtig5 = True Else AntwortRichtig5 = False EndIf EndFunction Function p_Richtig() PlaySample(3) moai.Request("", "Glückwunsch! Das ist richtig!" , "OK") moai.Request("", AntwortZusatz[AktuelleFrage] , "OK") score = score+1 AktuelleFrage = AktuelleFrage+1 p_NaechsteFrage() EndFunction Function p_Falsch() PlaySample(4) moai.Request("", "leider falsch" , "OK") ;AktuelleFrage = AktuelleFrage+1 ;falls nächste Frage (;) entfernen ;p_NaechsteFrage() ;falls nächste Frage (;) entfernen EndFunction Function p_AntwortAuswertung(msg) Switch msg.action Case "RapaGUI": Switch msg.attribute Case "Pressed": If msg.id = "bt1" If AntwortRichtig1 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt2" If AntwortRichtig2 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt3" If AntwortRichtig3 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt4" If AntwortRichtig4 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt5" If AntwortRichtig5 = True p_Richtig() Else p_Falsch() EndIf EndIf EndSwitch EndSwitch EndFunction ; ------------- ;----------------------- Hauptprogramm ----------------------- ; ------------- ;Beenden des Programmes EscapeQuit(True) InstallEventHandler({RapaGUI = p_AntwortAuswertung}) p_FragenLaden() p_NaechsteFrage() ; Hauptschleife Repeat WaitEvent Forever unter silvia3.xml ab: Code: Alles auswählen <?xml version="1.0" encoding="iso-8859-1"?> <application id="app"> <window title="Hier muss noch ein guter Fenstertitel rein"> <hgroup> <vgroup frame="true" frametitle=" " id="frage1"> <vgroup> <button id="fbt1">-</button> <button id="fbt2">-</button> <text> </text> <button id="bt1">-</button> <button id="bt2">-</button> <button id="bt3">-</button> <button id="bt4">-</button> <button id="bt5">-</button> <rectangle/> </vgroup> </vgroup> </hgroup> </window> </application> nichts anfangen, liess es aber drinnen. Als Textdatei im ASCII-Format kannst Du mal folgenden Text nehmen und unter dem Dateinamen Fragen.txt abspeichern: Code: Alles auswählen Wann wurde die Silviahemmet-Stiftung gegründet? 2 "Die Silviahemmet Stiftung wurde 1996 in Schweden durch die Königin Silvia ins Leben gerufen" 1994 1996 1999 2002 2004 Wie ist das Nervensystem eingeteilt? 2 Das Nervensystem unterteilt sich in ein autonomes und peripheres peripher und autonom autonom und zentral es gibt nur ein Nervensystem zentral und peripher die Frage nervt Wir testen nun den ersten Knopf: 1 Jawoll Richtig Falsch Falsch Falsch Falsch Wir testen nun den zweiten Knopf: 2 Geht doch Falsch Richtig Falsch Falsch Falsch Wir testen nun den dritten Knopf: 3 Potz donner Falsch Falsch Richtig Falsch Falsch Wir testen nun den vierten Knopf: 4 Das läuft ja so, wie es soll Falsch Falsch Falsch Richtig Falsch Wir testen nun den fünften Knopf: 5 Und auch Nummer 5 funktioniert Falsch Falsch Falsch Falsch Richtig Anspruch genommen werden. Zeile 1: Das ist die Frage Zeile 2: Hier steht die Nummer für die richtige Antwort Zeile 3: Das ist der Text, welcher nach der richtigen Antwort als ---- Ergänzung/Erklärung erscheint Zeile 4: Die erste Antwortmöglichkeit Zeile 5: Die zweite Antwortmöglichkeit Zeile 6: Die dritte Antwortmöglichkeit Zeile 7: Die vierte Antwortmöglichkeit Zeile 8: Die fünfte Antwortmöglichkeit Zeile 9: Leerzeile, damit die Fragen optisch von einander getrennt sind Ich hoffe, Du kannst etwas damit anfangen. Hier noch die direkten Links zu den von mir verwendeten Befehlen: .. CloseFile(1) End() Eof() Exists() Lokale Variablen Local Not OpenFile() ReadLine() SystemRequest() Tabellen Wend While Soodeli, viel Vergnügen beim Testen. Griessli Tipsi Tante Edit: Die Links wieder auf den neusten Stand gebracht. |
Autor: | Mr_Blues [ 25 Mai 2017, 09:41 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
erst einmal vielen Dank für die tollen Antworten . Ich werde so übers Wochenende mir das mal in Ruhe ansehen und mich nochmal melden. Danke! Arnim |
Autor: | Tipsi [ 25 Mai 2017, 09:57 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues Bitte, gern geschehen. Veilleicht noch ein paar Gedanken allgemein zu Deiner Frage, wie Du Spaghetticode vermeiden kannst: a) Verwende nie und nimmer den Befehl Goto. Er steht zwar noch in Hollywood zur Verfügung, ist aber seit Version 2.0 veraltet. b) Schreibe Präprozessorbefehle an den Anfang des Skripts. Das hast Du so gemacht. Sehr gut. c) Deklariere alle globalen Variablen auch am Anfang des Skripts. Wenn Du während dem Programmieren eine neue Variable einfürst, welche global ist, dann schreibe auch diese an den Anfang des Skripts. d) Verwende so oft als möglich lokale Variablen. Diese werden automatisch aus dem Speicher gelöscht, wenn die Funktion oder der Block verlassen wird. Globale Variablen musst Du bei RAM-Mangel von Hand aus dem Speicher löschen. Bei diesem Punkt muss ich mich auch selber an der Nase nehmen, da globale Variablen am Anfang viel bequemer sind, dafür aber auch Fehleranfälliger. Ausserdem sind globale Variablen bei grösseren Programmen langsamer, da Hollywood im ganzen Programm danach sucht und nicht nur z.B. in der Funktion. e) Definiere Funktionen immer vor dem Hauptprogramm. Wenn es sich vermeiden lässt, dann definiere diese Funktionen nicht in einer anderen Funktion. Das führt zu unübersichtlichen Verschachtelungen bei längeren Skripts. Wenn das Skript länger wird, kann es gut helfen, wenn die Definitionen der Funktionen sortiert sind (z.B. alphabetisch). f) Versuche nach Deinen Vorstellungen den Code optisch fürs Auge zu unterteilen. Dafür eignet sich der Strichpunkt (;) für die Einleitung eines Kommentars. Code: Alles auswählen ; ----------------- ;----------------------- Globale Variablen ------------------------- ; ----------------- ;----------------------- Alle Berechnungen ------------------------- ;************** Verschiedene Formen zeichen ************* zwischen was auch immer. Das Auge dankt Dir. So würde ich zum Beispiel Dein Code am Anfang Code: Alles auswählen ;Hollywood-Version @VERSION 6,1 ;Einbinden von RAPAGUI @REQUIRE "RapaGUI" ;Progranmminfo @APPTITLE "Silviahemmet-Quiz" @APPCOPYRIGHT "(C) 2017 Arnim Wolff" @APPAUTHOR "Arnim Wolff" @APPDESCRIPTION "Fragen zur Silviahemmet-Schulung" ;Bildschirm ;Festlegung der Brushes ;Festlegung der Sounds @SAMPLE 1, "Good.wav" @SAMPLE 2, "Poor.wav" @SAMPLE 3, "True.wav" @SAMPLE 4, "False.wav" ;Intro ;Fragen moai.CreateApp(FileToString("silvia3.xml")) Code: Alles auswählen ;Hollywood-Version @VERSION 6,1 ;Einbinden von RAPAGUI @REQUIRE "RapaGUI" ;Progranmminfo @APPTITLE "Silviahemmet-Quiz" @APPCOPYRIGHT "(C) 2017 Arnim Wolff" @APPAUTHOR "Arnim Wolff" @APPDESCRIPTION "Fragen zur Silviahemmet-Schulung" ;Bildschirm ;Festlegung der Brushes ;Festlegung der Sounds @SAMPLE 1, "Good.wav" @SAMPLE 2, "Poor.wav" @SAMPLE 3, "True.wav" @SAMPLE 4, "False.wav" ;Intro ;Fragen moai.CreateApp(FileToString("silvia3.xml")) Karten von meinem Programm KoKa eingelesen werden. Hier mal das schlechte Beispiel: Code: Alles auswählen Karten25000=ReadLine(2) Karten25000Z=ReadLine(2) Karten25000TZ=ReadLine(2) Karten25000SwissMap=ReadLine(2) Karten33333T=ReadLine(2) Karten50000=ReadLine(2) Karten50000Z=ReadLine(2) Karten50000T=ReadLine(2) Karten50000TZ=ReadLine(2) Karten50000S=ReadLine(2) Karten50000SwissMap=ReadLine(2) Karten75000=ReadLine(2) Karten100000=ReadLine(2) Karten100000Z=ReadLine(2) Karten100000Veloland2008=ReadLine(2) KartenCoopVelorouten2008=ReadLine(2) KartenCoopHistorische2008=ReadLine(2) KartenVeloThurgau=ReadLine(2) Karten200000=ReadLine(2) KartenBurgen=ReadLine(2) KartenBurgenDetail=ReadLine(2) Karten200000Strasse=ReadLine(2) Karten25000Alt=ReadLine(2) Karten25000ZAlt=ReadLine(2) Karten25000Siegfried=ReadLine(2) Karten25000SiegfriedZ=ReadLine(2) Karten25000TZAlt=ReadLine(2) Karten50000Alt=ReadLine(2) Karten50000ZAlt=ReadLine(2) Karten50000Siegfried=ReadLine(2) Karten50000SiegfriedZ=ReadLine(2) Karten50000TAlt=ReadLine(2) Karten50000TZAlt=ReadLine(2) Karten50000SAlt=ReadLine(2) Karten50000HalbAlt=ReadLine(2) Karten100000ZAlt=ReadLine(2) Karten100000Dufour=ReadLine(2) Karten100000DufourZ=ReadLine(2) Karten100000Veloland2002=ReadLine(2) Karten100000Veloland1998=ReadLine(2) KartenVeloThurgauAlt=ReadLine(2) KartenBurgen4=ReadLine(2) KartenBurgenDetail4=ReadLine(2) Karten250000General=ReadLine(2) Karten250000Eisenbahn=ReadLine(2) KartenKulturgueter1995=ReadLine(2) KartenKulturgueter1970=ReadLine(2) KartenKulturgueter1964=ReadLine(2) KartenMuseumAlt=ReadLine(2) KartenZehnSchoene=ReadLine(2) KartenZehnSchoeneVelo=ReadLine(2) KartenGeplante25=ReadLine(2) KartenAndereNamen50=ReadLine(2) KartenAareWanderVeloAlt=ReadLine(2) Programmstart=ReadLine(2) TasteNeu=ReadLine(2) Quit=ReadLine(2) Schliessknopf=ReadLine(2) ESC=ReadLine(2) TastaturSteuerung=ReadLine(2) TastaturKuerzel=ReadLine(2) TastaturKuerzelGroesse=ReadLine(2) TastaturKuerzelFeld=ReadLine(2) TastaturKuerzelTrennzeichen=ReadLine(2) TastaturKuerzelDateirequester=ReadLine(2) ProgrammstartName=ReadLine(2) TasteNeuName=ReadLine(2) KoordinatenSystemLV=ReadLine(2) WaitEventDoppel=ReadLine(2) Code: Alles auswählen ;Karten Karten25000=ReadLine(2) Karten25000Z=ReadLine(2) Karten25000TZ=ReadLine(2) Karten25000SwissMap=ReadLine(2) Karten33333T=ReadLine(2) Karten50000=ReadLine(2) Karten50000Z=ReadLine(2) Karten50000T=ReadLine(2) Karten50000TZ=ReadLine(2) Karten50000S=ReadLine(2) Karten50000SwissMap=ReadLine(2) Karten75000=ReadLine(2) Karten100000=ReadLine(2) Karten100000Z=ReadLine(2) Karten100000Veloland2008=ReadLine(2) KartenCoopVelorouten2008=ReadLine(2) KartenCoopHistorische2008=ReadLine(2) KartenVeloThurgau=ReadLine(2) Karten200000=ReadLine(2) KartenBurgen=ReadLine(2) KartenBurgenDetail=ReadLine(2) Karten200000Strasse=ReadLine(2) ;alte Karten Karten25000Alt=ReadLine(2) Karten25000ZAlt=ReadLine(2) Karten25000Siegfried=ReadLine(2) Karten25000SiegfriedZ=ReadLine(2) Karten25000TZAlt=ReadLine(2) Karten50000Alt=ReadLine(2) Karten50000ZAlt=ReadLine(2) Karten50000Siegfried=ReadLine(2) Karten50000SiegfriedZ=ReadLine(2) Karten50000TAlt=ReadLine(2) Karten50000TZAlt=ReadLine(2) Karten50000SAlt=ReadLine(2) Karten50000HalbAlt=ReadLine(2) Karten100000ZAlt=ReadLine(2) Karten100000Dufour=ReadLine(2) Karten100000DufourZ=ReadLine(2) Karten100000Veloland2002=ReadLine(2) Karten100000Veloland1998=ReadLine(2) KartenVeloThurgauAlt=ReadLine(2) KartenBurgen4=ReadLine(2) KartenBurgenDetail4=ReadLine(2) Karten250000General=ReadLine(2) Karten250000Eisenbahn=ReadLine(2) KartenKulturgueter1995=ReadLine(2) KartenKulturgueter1970=ReadLine(2) KartenKulturgueter1964=ReadLine(2) KartenMuseumAlt=ReadLine(2) KartenZehnSchoene=ReadLine(2) KartenZehnSchoeneVelo=ReadLine(2) KartenGeplante25=ReadLine(2) KartenAndereNamen50=ReadLine(2) KartenAareWanderVeloAlt=ReadLine(2) ;Diverses Programmstart=ReadLine(2) TasteNeu=ReadLine(2) Quit=ReadLine(2) Schliessknopf=ReadLine(2) ESC=ReadLine(2) TastaturSteuerung=ReadLine(2) TastaturKuerzel=ReadLine(2) TastaturKuerzelGroesse=ReadLine(2) TastaturKuerzelFeld=ReadLine(2) TastaturKuerzelTrennzeichen=ReadLine(2) TastaturKuerzelDateirequester=ReadLine(2) ProgrammstartName=ReadLine(2) TasteNeuName=ReadLine(2) KoordinatenSystemLV=ReadLine(2) WaitEventDoppel=ReadLine(2) mit Skripts erleichtern können: Gestaltungsrichtlinien Ein Profiprogrammierer hätte sicher noch weitere Vorschläge. Aber eben, es sind Vorschläge, nicht Gesetze. Aber es kann vor allem bei längeren Skripts sehr hilfreich sein, auch wenn das Gehirn zeitweise mehr in Anspruch genommen werden muss. So, nun gehe ich die Sonne geniessen. Griessli Tipsi Tante Edit: URL zu den Gestaltungsrichtlinien angepasst. |
Autor: | Mr_Blues [ 26 Mai 2017, 11:10 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Vierlen Dank für die Hilfe. Jetzt ist es mir gelungen ein Quiz aufzubauen, nur mit dem Spielende hapert es noch. Ich habe eine Funtion p_Spielende() geschrieben, die ich aufrufen möchte, wenn der FragenZaehler bei 25 liegt. Nach diversen Versuchen bricht das Script nach der 25ten Frage mit Fehlermeldung ab. Was mache ich falsch? ; ---------------- ;----------------------- Voreinstellungen ---------------------------- ; ---------------- ;Hollywood-Version @VERSION 6,1 ;Einbinden von RAPAGUI @REQUIRE "RapaGUI" ;Progranmminfo @APPTITLE "Silviahemmet-Quiz" @APPCOPYRIGHT "(C) 2017 Arnim Wolff" @APPAUTHOR "Arnim Wolff" @APPDESCRIPTION "Fragen zur Silviahemmet-Schulung" ;Bildschirm ;Festlegung der Brushes ;Festlegung der Sounds @SAMPLE 1, "Good.wav" @SAMPLE 2, "Poor.wav" @SAMPLE 3, "True.wav" @SAMPLE 4, "False.wav" ;Intro ;Fragen moai.CreateApp(FileToString("silvia3.xml")) ; ----------------- ;----------------------- Globale Variablen ------------------------- ; ----------------- ;Score score=0 ;Fragen und Antworten Frage = {} ;mit = {} werden Tabellen deklariert RichtigeAntwort = {} AntwortZusatz = {} Antwort1 = {} Antwort2 = {} Antwort3 = {} Antwort4 = {} Antwort5 = {} AntwortRichtig1 = False ;wird auf True gesetzt, falls es die richtige Antwort ist. AntwortRichtig2 = False AntwortRichtig3 = False AntwortRichtig4 = False AntwortRichtig5 = False ;Zähler AktuelleFrage = 0 FragenZaehler = 0 ;Die Felder in Tabellen fangen bei 0 an ; ---------- ;----------------------- Funktionen ----------------------- ; ---------- Function p_FragenLaden() Local Vorhanden = False ;Alle lokalen Variablen werden beim Verlassen der Funktion p_FragenLaden() aus dem Speicher gelöscht Local Datei = "Fragen.txt" Local Leerzeile = "" Local Weiter = 0 Vorhanden=Exists(Datei) If Vorhanden = True ;Wenn Datei vorhanden, wird sie geöffnet OpenFile(1,Datei,#MODE_READ) While Not Eof(1) Frage[FragenZaehler] = ReadLine(1) RichtigeAntwort[FragenZaehler] = ReadLine(1) AntwortZusatz[FragenZaehler] = ReadLine(1) Antwort1[FragenZaehler] = ReadLine(1) Antwort2[FragenZaehler] = ReadLine(1) Antwort3[FragenZaehler] = ReadLine(1) Antwort4[FragenZaehler] = ReadLine(1) Antwort5[FragenZaehler] = ReadLine(1) If Not Eof(1) ;Falls am Ende der Datei die Leerzeile vergessen wurde, wird kein Fehler gemeldet Leerzeile = ReadLine(1) EndIf FragenZaehler = FragenZaehler+1 If FragenZaehler = 25 p_Spielende() EndIf Wend CloseFile(1) EndIf EndFunction Function p_NaechsteFrage() Local FrageNummer = AktuelleFrage+1 moai.Set("fbt1", "Text", "Frage "..FrageNummer.." von "..FragenZaehler) moai.Set("fbt2", "Text", Frage[AktuelleFrage]) moai.Set("bt1", "Text", Antwort1[AktuelleFrage]) moai.Set("bt2", "Text", Antwort2[AktuelleFrage]) moai.Set("bt3", "Text", Antwort3[AktuelleFrage]) moai.Set("bt4", "Text", Antwort4[AktuelleFrage]) moai.Set("bt5", "Text", Antwort5[AktuelleFrage]) If RichtigeAntwort[AktuelleFrage] = "1" AntwortRichtig1 = True Else AntwortRichtig1 = False EndIf If RichtigeAntwort[AktuelleFrage] = "2" AntwortRichtig2 = True Else AntwortRichtig2 = False EndIf If RichtigeAntwort[AktuelleFrage] = "3" AntwortRichtig3 = True Else AntwortRichtig3 = False EndIf If RichtigeAntwort[AktuelleFrage] = "4" AntwortRichtig4 = True Else AntwortRichtig4 = False EndIf If RichtigeAntwort[AktuelleFrage] = "5" AntwortRichtig5 = True Else AntwortRichtig5 = False EndIf EndFunction Function p_Richtig() PlaySample(3) moai.Request("", "Glückwunsch! Das ist richtig!" , "OK") moai.Request("", AntwortZusatz[AktuelleFrage] , "OK") score = score+1 AktuelleFrage = AktuelleFrage+1 p_NaechsteFrage() EndFunction Function p_Falsch() PlaySample(4) moai.Request("", "leider falsch" , "OK") moai.Request("", AntwortZusatz[AktuelleFrage] , "OK") AktuelleFrage = AktuelleFrage+1 p_NaechsteFrage() EndFunction Function p_AntwortAuswertung(msg) Switch msg.action Case "RapaGUI": Switch msg.attribute Case "Pressed": If msg.id = "bt1" If AntwortRichtig1 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt2" If AntwortRichtig2 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt3" If AntwortRichtig3 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt4" If AntwortRichtig4 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt5" If AntwortRichtig5 = True p_Richtig() Else p_Falsch() EndIf EndIf EndSwitch EndSwitch EndFunction Function p_Spielende() If score = 25 /* wenn der score 25 =alle Fragen richtig ist */ moai.Request("","Das ist der Hammer, Du hast von 25 Fragen alle richtig beantwortet. Sehr gut" , "OK") PlaySample(1) ElseIf score >= 20 /* ist der score größer gleich 20 */ moai.Request("","Richtig gut!, Du hast mehr als 20 Fragen richtig beantwortet. Schlaufuchs!" , "OK") PlaySample(1) ElseIf score >= 13 /* ist der score größer gleich 50 */ moai.Request("","Du hast mehr als 13 Fragen richtig beantwortet. Da geht sicher noch mehr" , "OK") PlaySample(1) Else /* ist der score schlechter als 13 */ moai.Request("","Du hast weniger als 13 Fragen richtig beantwortet. Bitte übe noch einmal" , "OK") PlaySample(2) EndIf moai.Request("","Drücke die ESC Taste oder den linken Mausknopf zum Beenden" , "OK") WaitLeftMouse End EndFunction ; ------------- ;----------------------- Hauptprogramm ----------------------- ; ------------- ;Beenden des Programmes EscapeQuit(True) InstallEventHandler({RapaGUI = p_AntwortAuswertung}) p_FragenLaden() p_NaechsteFrage() ; Hauptschleife Repeat WaitEvent Forever |
Autor: | Mr_Blues [ 26 Mai 2017, 11:18 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
oder ist das eine Möglichkeit? If FragenZaehler = 25 p_Spielende() Else p_NaechsteFrage() EndIf Aber irgendwie bin ich da nicht erfolgreich. |
Autor: | Tipsi [ 26 Mai 2017, 15:00 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues Wenn Du Code mit Einrückungen hier abbilden möchtest, dann setzte diesen Code zwischen die beiden Tags Code: Alles auswählen [code] Du kannst auch dein Skript hier hinein kopieren, nur das Skript markieren und oben auf den Knopf "Code" drücken. Oder Du drückst zuerst auf den Knopf "Code", und kopierst Dein Skript da hinein (der Cursor sollte schon zwischen den beiden eckigen Klammern ][ stehen). Zum Beenden von Deinem Programm. Die Variable FragenZaehler enthält die Gesammtzahl der Fragen, die geladen wurden. Die Variable AktuelleFrage beinhaltet die Zahl der gerade gestellten Frage. Wenn die Datei Fragen.txt 31 Fragen enthält, wird die Funktion p_FragenLaden() diese 31 Fragen alle in den Speicher laden und der FragenZaehler erhält am Schluss die Zahl 31. Wenn nun die erste Frage auf dem Bildschirm erscheint, ist die Variable AktuelleFrage auf Null gesetzt (Tabellen fangen bei 0 an). Damit aber der Benutzer nicht verwirrt dreinschaut, wird ihm durch die Zeile Local FrageNummer = AktuelleFrage+1 die Frage Nr.1 gestellt. Wenn Du somit das Quiz nach der letzten Frage beenden möchtest, dann musst Du das in etwa so schreiben: Code: Alles auswählen If AktuelleFrage=FragenZaehler p_Spielende() EndIf Du kannst in der Datei Fragen.txt mehrere neue Fragen hinzufügen, ändern oder gar entfernen. Dein Programm lädt die Fragen (egal wie viele), zählt diese und setzt die Zahl in die Variable FragenZaehler. Darum musst Du in Deinem Skript nie die Gesammtzahl der Fragen von Hand eintragen. Jetzt müssen diese drei Zeilen nur noch am richtigen Ort im Skript hineinkopiert werden. Du rufst die Funktion p_Spielende() beim Laden der Fragen auf. Dann würde eigentlich das Programm beendet, nachdem alle Fragen geladen wurden. Der Benutzer wird nie eine Frage zu Gesicht bekommen. Also lösche folgende Zeilen aus der Funktion p_FragenLaden(): Code: Alles auswählen If FragenZaehler = 25 p_Spielende() EndIf Code: Alles auswählen If AktuelleFrage=FragenZaehler p_Spielende() EndIf Code: Alles auswählen Function p_NaechsteFrage() Local FrageNummer = AktuelleFrage+1 If AktuelleFrage=FragenZaehler p_Spielende() EndIf moai.Set("fbt1", "Text", "Frage "..FrageNummer.." von "..FragenZaehler) dabei die Fehlernummer, Fehlertext und die Zeilennummer. Falls Dein Editor keine Fehlermeldung ausspuckt (ist leider ab und zu bei CubicIDE der Fall), dann starte Dein Programm über die Hollywood-GUI. Griessli Tipsi |
Autor: | Mr_Blues [ 28 Mai 2017, 11:10 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Vielen Dank für die Hilfe. Also Fragen laden funktioniert schon einmal, bewertet mit einem Score wird die Sache auch. Also das Grundprogramm steht schon einmal, vielen Dank für die Hilfe! Jetzt bin ich am Herumprobieren: -Ich würde gerne ein Intro implementieren. So in einem ersten Versuch hat es geklappt (ohne den Quiz Code), jetzt sagt mir allerdings die Hollywood IDE "Done", es zeigt sich aber nichts. Hat das vielleicht mit RapaGUI zu tun? -Auch hätte ich gerne ein Hauptmenü, um von dort aus weitere Fragen zu schreiben. -Gerne hätte ich einen "FullScreen", das scheint gar nicht zu funktiuonieren -Und auch noch wichtig: Zu jeder Frage hätte ich gerne ein Bild geladen. Ich habe da überhaupt keine Idee wie das funktionieren soll Hier jetzt einmal der funktionierende Code, mit der neuen Funktion p_Intro() Code: Alles auswählen [color=#008040]; ---------------- ;----------------------- Voreinstellungen ---------------------------- ; ---------------- ;Hollywood-Version @VERSION 6,1 ;Einbinden von RAPAGUI @REQUIRE "RapaGUI" ;Progranmminfo @APPTITLE "Silviahemmet-Quiz" @APPCOPYRIGHT "(C) 2017 Arnim Wolff" @APPAUTHOR "Arnim Wolff" @APPDESCRIPTION "Fragen zur Silviahemmet-Schulung" ;Bildschirm ;Festlegung der Bilder (Intro) @BRUSH 1, "Title.png" @BRUSH 2, "0.jpg" @BRUSH 3, "1.jpg" @BRUSH 4, "2.jpg" ;Festlegung der Sounds @SAMPLE 1, "Good.wav" @SAMPLE 2, "Poor.wav" @SAMPLE 3, "True.wav" @SAMPLE 4, "False.wav" ;Intro ;Fragen moai.CreateApp(FileToString("silvia3.xml")) ; ----------------- ;----------------------- Globale Variablen ------------------------- ; ----------------- ;Score score=0 ;Fragen und Antworten Frage = {} ;mit = {} werden Tabellen deklariert RichtigeAntwort = {} AntwortZusatz = {} Antwort1 = {} Antwort2 = {} Antwort3 = {} Antwort4 = {} Antwort5 = {} AntwortRichtig1 = False ;wird auf True gesetzt, falls es die richtige Antwort ist. AntwortRichtig2 = False AntwortRichtig3 = False AntwortRichtig4 = False AntwortRichtig5 = False ;Zähler AktuelleFrage = 0 FragenZaehler = 0 ;Die Felder in Tabellen fangen bei 0 an ; ---------- ;----------------------- Funktionen ----------------------- ; ---------- Function p_Intro() DisplayBrush(2, 0, 0, {Width = 640, Height = 480}) MoveBrush(4,640,400,-200,200,1) MoveBrush(3,-200,200,640,100,1) Print ("Silviahemmet-Quiz...Linke Maustaste drücken...") WaitLeftMouse EndFunction Function p_FragenLaden() Local Vorhanden = False ;Alle lokalen Variablen werden beim Verlassen der Funktion p_FragenLaden() aus dem Speicher gelöscht Local Datei = "Fragen.txt" Local Leerzeile = "" Local Weiter = 0 Vorhanden=Exists(Datei) If Vorhanden = True ;Wenn Datei vorhanden, wird sie geöffnet OpenFile(1,Datei,#MODE_READ) While Not Eof(1) Frage[FragenZaehler] = ReadLine(1) RichtigeAntwort[FragenZaehler] = ReadLine(1) AntwortZusatz[FragenZaehler] = ReadLine(1) Antwort1[FragenZaehler] = ReadLine(1) Antwort2[FragenZaehler] = ReadLine(1) Antwort3[FragenZaehler] = ReadLine(1) Antwort4[FragenZaehler] = ReadLine(1) Antwort5[FragenZaehler] = ReadLine(1) If Not Eof(1) ;Falls am Ende der Datei die Leerzeile vergessen wurde, wird kein Fehler gemeldet Leerzeile = ReadLine(1) EndIf FragenZaehler = FragenZaehler+1 Wend CloseFile(1) EndIf EndFunction Function p_NaechsteFrage() Local FrageNummer = AktuelleFrage+1 If AktuelleFrage=FragenZaehler p_Spielende() EndIf moai.Set("fbt1", "Text", "Frage "..FrageNummer.." von "..FragenZaehler) moai.Set("fbt2", "Text", Frage[AktuelleFrage]) moai.Set("bt1", "Text", Antwort1[AktuelleFrage]) moai.Set("bt2", "Text", Antwort2[AktuelleFrage]) moai.Set("bt3", "Text", Antwort3[AktuelleFrage]) moai.Set("bt4", "Text", Antwort4[AktuelleFrage]) moai.Set("bt5", "Text", Antwort5[AktuelleFrage]) If RichtigeAntwort[AktuelleFrage] = "1" AntwortRichtig1 = True Else AntwortRichtig1 = False EndIf If RichtigeAntwort[AktuelleFrage] = "2" AntwortRichtig2 = True Else AntwortRichtig2 = False EndIf If RichtigeAntwort[AktuelleFrage] = "3" AntwortRichtig3 = True Else AntwortRichtig3 = False EndIf If RichtigeAntwort[AktuelleFrage] = "4" AntwortRichtig4 = True Else AntwortRichtig4 = False EndIf If RichtigeAntwort[AktuelleFrage] = "5" AntwortRichtig5 = True Else AntwortRichtig5 = False EndIf EndFunction Function p_Richtig() PlaySample(3) moai.Request("", "Glückwunsch! Das ist richtig!" , "OK") moai.Request("", AntwortZusatz[AktuelleFrage] , "OK") score = score+1 AktuelleFrage = AktuelleFrage+1 p_NaechsteFrage() EndFunction Function p_Falsch() PlaySample(4) moai.Request("", "leider falsch" , "OK") moai.Request("", AntwortZusatz[AktuelleFrage] , "OK") AktuelleFrage = AktuelleFrage+1 p_NaechsteFrage() EndFunction Function p_AntwortAuswertung(msg) Switch msg.action Case "RapaGUI": Switch msg.attribute Case "Pressed": If msg.id = "bt1" If AntwortRichtig1 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt2" If AntwortRichtig2 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt3" If AntwortRichtig3 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt4" If AntwortRichtig4 = True p_Richtig() Else p_Falsch() EndIf ElseIf msg.id = "bt5" If AntwortRichtig5 = True p_Richtig() Else p_Falsch() EndIf EndIf EndSwitch EndSwitch EndFunction Function p_Spielende() If score = 25 /* wenn der score 25 =alle Fragen richtig ist */ moai.Request("","Sehr Gut!Von 25 Fragen hast Du richtig beantwortet:",(score), "OK") PlaySample(1) ElseIf score >= 20 /* ist der score größer gleich 20 */ moai.Request("","Gut!Von 25 Fragen hast Du richtig beantwortet:",(score), "OK") PlaySample(1) ElseIf score >= 13 /* ist der score größer gleich 50 */ moai.Request("","Da geht noch was! Von 25 Fragen hast Du richtig beantwortet:",(score), "OK") PlaySample(1) Else /* ist der score schlechter als 13 */ moai.Request("","Übe noch einmal! Von 25 Fragen hast Du richtig beantwortet:",(score), "OK") PlaySample(2) EndIf moai.Request("","Zum Beenden ESC-Taste drücken, für noch mehr Fragen Button drücken" , "OK") End EndFunction ; ------------- ;----------------------- Hauptprogramm ----------------------- ; ------------- ;Beenden des Programmes EscapeQuit(True) InstallEventHandler({RapaGUI = p_AntwortAuswertung}) p_FragenLaden() p_NaechsteFrage() ; Hauptschleife Repeat WaitEvent Forever [/color] |
Autor: | Tipsi [ 28 Mai 2017, 14:15 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues Wünsche hast Du. Wegen dem Intro. Versuche mal das Intro vor dem RapaGUI-Aufbau aufzurufen. Verschiebe die Zeile moai.CreateApp(FileToString("silvia3.xml")) von Code: Alles auswählen ;Fragen moai.CreateApp(FileToString("silvia3.xml")) ; ----------------- ;----------------------- Globale Variablen ------------------------- ; ----------------- p_Intro() ein. Dann sollte das Hauptprogramm so aussehen: Code: Alles auswählen ; ------------- ;----------------------- Hauptprogramm ----------------------- ; ------------- ;Beenden des Programmes EscapeQuit(True) InstallEventHandler({RapaGUI = p_AntwortAuswertung}) p_Intro() moai.CreateApp(FileToString("silvia3.xml")) p_FragenLaden() p_NaechsteFrage() ; Hauptschleife Repeat WaitEvent Forever Griessli Tipsi |
Autor: | Mr_Blues [ 29 Mai 2017, 09:19 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Nein leider nicht. Hollywood scheint aber zufrieden zu sein und gibt aus: Loading sample Good.wav...done Loading sample Poor.wav...done Loading sample True.wav...done Loading sample False.wav...done Preparing display...done And Action! Aber es tut sich...nichts. Ich habe aber herausgefunden, daß wenn ich @REQUIRE RAPAGUI auskommentiere es funktioniert (dann alerdings nur das Intro), also scheint meine Vermutung richtig, daß es mit dem GUI zu tun hat. Hmm Hast Du noch eine Idee zum Bilder einbinden? |
Autor: | Tipsi [ 29 Mai 2017, 10:30 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues Mist, dann musst Du mal Andreas per Mail fragen, wie das Intro da mit RapaGUI eingebunden werden kann. Ich habe zwar einige Beispiele in RapaGUI angeschaut, komme aber nicht hinter das "Geheimnis". Ich bin ja leider auch ein völliger Neuling dieser GUI. Auch das mit dem Vollbildschirm habe ich noch nicht gelüftet. Aber vielleicht hat auch da Andreas eine Antwort. Wenn es für jede Frage ein anderes Bild sein soll, dann würde ich die Dateinamen in die Datei Fragen.txt bei der jeweiligen Frage aufnehmen. Aber wie und wo das Bild angezeigt wird, weiss ich noch nicht. Ich muss mich auch durch die Dokumentation von RapaGUI kämpfen, da Englisch alles andere als meine Stärke ist. Griessli Tipsi |
Autor: | Tipsi [ 30 Mai 2017, 16:22 ] |
Betreff des Beitrags: | Re: Anfänger: Wie vermeide ich Spaghetticode |
Salli Mr_Blues RapaGUI hat die Möglichkeit, Bilder anzuzeigen. Füge in die XML-Datei folgende Zeile ein: Code: Alles auswählen <image id="bild1" brush="1"/> Code: Alles auswählen <vgroup> <image id="bild1" brush="1"/> <button id="fbt1">-</button> <button id="fbt2">-</button> Nun müssen wir das Format der Datei Fragen.txt ändern. Für dieses Unterfangen kopiere folgenden Code und führe das Programm aus. Es konvertiert Dein altes Dateiformat in ein neues. Bitte benutze einen anderen Dateinamen und überprüfe dann das Ergebnis. Entweder Du löschst die alte Datei und nennst die neue um oder Du änderst den Dateinamen im Programm auf den neuen Namen. Hier das Konverterprogramm: Code: Alles auswählen ; ---------------- ;----------------------- Voreinstellungen ---------------------------- ; ---------------- ;Hollywood-Version @VERSION 6,1 ;Bildschirm @DISPLAY {Color = #WHITE} ; ----------------- ;----------------------- Globale Variablen ------------------------- ; ----------------- ;Fragen und Antworten Frage = {} ;mit = {} werden Tabellen deklariert RichtigeAntwort = {} AntwortZusatz = {} Antwort1 = {} Antwort2 = {} Antwort3 = {} Antwort4 = {} Antwort5 = {} ;Zähler AktuelleFrage = 0 FragenZaehler = 0 ;Die Felder in Tabellen fangen bei 0 an ; ---------- ;----------------------- Funktionen ----------------------- ; ---------- Function p_FragenLaden() Local Vorhanden = False ;Alle lokalen Variablen werden beim Verlassen der Funktion p_FragenLaden() aus dem Speicher gelöscht Local Datei = "" Local Leerzeile = "" Local Weiter = 0 Datei=FileRequest("Wähle die Datei aus","",#REQ_NORMAL,GetCurrentDirectory(),"") If Datei="" Weiter = SystemRequest("Fehler","Keine Datei oder Abbruchtaste gewählt","Programm beenden") End() Else Vorhanden=Exists(Datei) If Vorhanden = True ;Wenn Datei vorhanden, wird sie geöffnet OpenFile(1,Datei,#MODE_READ) While Not Eof(1) Frage[FragenZaehler] = ReadLine(1) RichtigeAntwort[FragenZaehler] = ReadLine(1) AntwortZusatz[FragenZaehler] = ReadLine(1) Antwort1[FragenZaehler] = ReadLine(1) Antwort2[FragenZaehler] = ReadLine(1) Antwort3[FragenZaehler] = ReadLine(1) Antwort4[FragenZaehler] = ReadLine(1) Antwort5[FragenZaehler] = ReadLine(1) If Not Eof(1) ;Falls am Ende der Datei die Leerzeile vergessen wurde, wird kein Fehler gemeldet Leerzeile = ReadLine(1) EndIf FragenZaehler = FragenZaehler+1 Wend CloseFile(1) Weiter = SystemRequest("Fragen zählen","Es wurden "..FragenZaehler.." Fragen geladen","OK") Else Weiter = SystemRequest("Fehler","Datei ist nicht vorhanden","Programm beenden") End() EndIf EndIf EndFunction Function p_DateiSpeichern() NeuerDateiName=FileRequest("Neue Datei auswählen", "", #REQ_SAVEMODE) If NeuerDateiName="" Weiter = SystemRequest("Fehler","Keine Datei oder Abbruchtaste gewählt","Programm beenden") End() Else If Exists(NeuerDateiName) Weiter = SystemRequest("Datei vorhanden","Datei "..Chr(10)..NeuerDateiName..Chr(10).."ist bereits vorhanden. Überschreiben?","Ja, überschreiben|Nein, nicht überschreiben") If Weiter = 1 DeleteFile(NeuerDateiName) p_FragenSpeichern() Else End() EndIf Else p_FragenSpeichern() EndIf EndIf EndFunction Function p_FragenSpeichern() OpenFile(2,NeuerDateiName,#MODE_WRITE) For AktuelleFrage=0 To FragenZaehler-1 WriteLine(2,Frage[AktuelleFrage]) WriteLine(2,RichtigeAntwort[AktuelleFrage]) WriteLine(2,AntwortZusatz[AktuelleFrage]) WriteLine(2,Antwort1[AktuelleFrage]) WriteLine(2,Antwort2[AktuelleFrage]) WriteLine(2,Antwort3[AktuelleFrage]) WriteLine(2,Antwort4[AktuelleFrage]) WriteLine(2,Antwort5[AktuelleFrage]) WriteLine(2,"Ersatzbild.jpg") WriteLine(2,"-") WriteLine(2,"-") WriteLine(2,"-") WriteLine(2,"-") WriteLine(2,"-") WriteLine(2,"-") Next CloseFile(2) Weiter = SystemRequest("Datei vorhanden","Datei "..Chr(10)..NeuerDateiName..Chr(10).."wurde gespeichert","Programm beenden") EndFunction ; ------------- ;----------------------- Hauptprogramm ----------------------- ; ------------- EscapeQuit(True) p_FragenLaden() p_DateiSpeichern() End() Bei den Globalen Variablen musst Du folgende Zeile einfügen: Code: Alles auswählen FrageBild = {} Whiile-Wend-Schleife mit folgendem Code: Code: Alles auswählen While Not Eof(1) Frage[FragenZaehler] = ReadLine(1) RichtigeAntwort[FragenZaehler] = ReadLine(1) AntwortZusatz[FragenZaehler] = ReadLine(1) Antwort1[FragenZaehler] = ReadLine(1) Antwort2[FragenZaehler] = ReadLine(1) Antwort3[FragenZaehler] = ReadLine(1) Antwort4[FragenZaehler] = ReadLine(1) Antwort5[FragenZaehler] = ReadLine(1) FrageBild[FragenZaehler] = ReadLine(1) For i=1 To 6 If Not Eof(1) ;Falls am Ende der Datei die Leerzeile vergessen wurde, wird kein Fehler gemeldet Leerzeile = ReadLine(1) EndIf Next FragenZaehler = FragenZaehler+1 If FragenZaehler = 25 p_Spielende() EndIf Wend raus. Ausserdem lesen wir noch die restlichen Leerzeilen raus und ignorieren sie anschliessend. Falls jemals in der Datei eine neue Zeile zum herauslesen dazukommt, dann muss die Zahl der Leerzeilen von aktuell 6 auf 5 reduziert werden (bei der Zeile For i=1 To 6 ). In der Funktion p_NaechsteFrage() fügst Du zwischen Code: Alles auswählen If AktuelleFrage=FragenZaehler p_Spielende() EndIf Code: Alles auswählen moai.Set("fbt1", "Text", "Frage "..FrageNummer.." von "..FragenZaehler) Du ihn eingeprägt hast: Code: Alles auswählen ;Wechsle zuerst immer in das Hauptverzeichnis, wo ;Dein Programm hockt. Mache das immer, bevor Du in ;ein Unterverzeichnis wechselst. In diesem kleinen ;Programm spielt das villeicht noch keine Rolle. ;Bei einem Programm mit mehreren Unterverzeichnissen ;kann das aber zu Fehlern führen. ChangeDirectory(Programmverzeichnis) ChangeDirectory("Bilder") LoadBrush(2,FrageBild[AktuelleFrage]) moai.Set("bild1", "brush", "2") Verzeichnis mit dem Namen Bilder erstellen. Diese Zeilen wechseln zuerst ins Programmverzeichnis (falls Du vorher irgend wo anderst warst) und von da aus ins Verzeichnis Bilder. Mit der Zeile moai.Set("bild1", "brush", "2") wird das Bild geändert. Somit bist Du in der Lage, zu jeder Frage ein eigenes Bild zu wählen. Dieser Bilddateiname musst Du in die Fragedatei anstelle vom Namen Ersatzbild.jpg einsetzen. Um Fehler zu vermeiden, wähle ein Bild aus, nene es Ersatzbild.jpg und speichere es im Programmverzeichnis (nicht bei den Bildern). Somit wird nach dem Konvertieren der Datei das Ersatzbild angezeigt, falls Du vergessen hast, den Bildernamen zu ändern. Das Programm wird dadurch nicht abgebrochen. So, und zum Schluss füge im Hauptprogramm zwischen den Zeilen Code: Alles auswählen ;Beenden des Programmes EscapeQuit(True) Code: Alles auswählen ;Fragen moai.CreateApp(FileToString("silvia3.xml")) Code: Alles auswählen ;Bild: CreateBrush(1,500,200) Fehler meldet, da er den Pinsel nicht finden kann. Bei den Bildern musst Du eine einheitliche Grösse wählen, da sonst das Programmfenster wahrscheinlich ständig die Grösse ändern wird. Übrigens, die Fenstergrösse ist auf das Bild beschränkt. Das heisst, Du kannst das Fenster nicht grösser als die Bildbreite ziehen. Warum das so ist, weiss ich nicht. So, nun teste mal die ganze Geschichte. Ich hoffe, das funktioniert so. Da kommen mir noch wichtige Fragen in den Sinn: - Mit was Entwickelst Du deine Hollywoodprogramme? - Auf welcher Plattform/mit welchem OS? - Auf wlecher Zielplattform wirst Du Dein Programm vorführen? Griessli Tipsi |
Seite 1 von 2 | Alle Zeiten sind UTC |
Powered by phpBB® Forum Software © phpBB Limited Deutsche Übersetzung durch phpBB.de |