^3Ŀ ^3^0The Real Adok's Way to QBASIC^3 ^3^0 A new Method Step by Step ^3 ^3 ^3^4 ^3 ^3^4 ^3 ^3^4 ^3 ^3 Willkommen in der fnften Folge von The Real Adok's Way to QBASIC! Gleich als erstes zu den ^4Hausaufgaben^5, die im Prinzip mit etwas logischem Denken leicht zu lsen waren. Es gibt zwei Mglichkeiten, um den Schleifenzhler am Anfang auf 1 und nicht auf 0 zu setzen. Die naheliegendere ist, bei der Zuweisung vor der Schleife ganz einfach 0 in 1 zu verndern. Das Listing sieht dann folgen- dermaen aus: ^0'Zhlschleife ^0COLOR 14, 1 ^0CLS ^0Zaehler = 1 ^0DO ^0 PRINT "Schleife wird zum"; Zaehler; ". Mal durchlaufen." ^0 Zaehler = Zaehler + 1 ^0LOOP UNTIL Zaehler = 10 ^0PRINT "Wert des Schleifenzhlers ist"; Zaehler; "=> PROGRAMMABBRUCH." Na, war doch ganz einfach! Es gibt aber noch eine zweite, nicht ganz so nahe- liegende Mglichkeit: Man kann den Befehl mit der Erhhung des Schleifen- zhlers gleich hinter DO zu schreiben! Das sieht dann so aus: ^0'Zhlschleife ^0COLOR 14, 1 ^0CLS ^0Zaehler = 0 ^0DO ^0 Zaehler = Zaehler + 1 ^0 PRINT "Schleife wird zum"; Zaehler; ". Mal durchlaufen." ^0LOOP UNTIL Zaehler = 10 ^0PRINT "Wert des Schleifenzhlers ist"; Zaehler; "=> PROGRAMMABBRUCH." Diese Variante hat allerdings eine Besonderheit: Wenn wir das Programm starten, erkennen wir, da die Schleife nun auch ein zehntes Mal durchlaufen wird. Man sollte sich auch beim Coden in der Praxis klar sein, da es unter Umstnden zu anderen Ergebnissen fhrt, wenn man eine Wertzuweisung - und das ist eine Werterhhung im Grunde genommen auch - an den Anfang der Schleife schreibt, als wenn sie am Ende steht! Es ist oft wichtig, diesen Umstand zu kennen. So, jetzt mchte ich euch noch kurz die ^4FOR/NEXT-Schleife^5 zeigen. Hier gleich ein Beispielprogramm: ^0'Zhlschleife mit FOR/NEXT ^0COLOR 14, 1 ^0CLS ^0FOR Zaehler = 1 TO 10 STEP 1 ^0 PRINT "Schleife wird zum"; Zaehler; ". Mal durchlaufen." ^0NEXT ^0PRINT "Wert des Schleifenzhlers ist"; Zaehler; "=> PROGRAMMABBRUCH." Wie ihr seht, erspart das Verwenden der FOR/NEXT-Schleife eine Menge Schreib- arbeit. Die 6. Zeile ist der Schleifenanfang (wie DO) und die 8. das Schleifenende (wie LOOP). In der 6. Zeile wird angegeben, da die Variable Zaehler als Schleifenzhler verwendet werden soll. Der Startwert soll 1 und der Endwert 10 sein. ^4STEP^5 gibt die Schrittweite an. Wenn STEP weggelassen wird, ist die Schrittweite automatisch 1. Was bewirkt nun der Schleifenanfang? Beim ersten Durchlauf wird der Schleifen- zhler auf den Startwert gesetzt. Danach werden alle Befehle zwischen FOR und NEXT ausgefhrt. NEXT erhht nun den Schleifenzhler um die Schrittweite. Wenn der Schleifenzhler gleich oder grer dem Endwert ist, dann wird die Schleife abgebrochen und der nchste Befehl ausgefhrt. Ansonsten wird zu FOR zurckge- sprungen und die Befehle zwischen FOR und NEXT erneut ausgefhrt. Ihr seht, das Ganze verhlt sich so hnlich wie DO/LOOP. Auch Verschachtelung ist mglich. Sogar verschiedenartige Schleifenarten lassen sich verschachteln! Das gilt auch fr den IF/THEN/ELSE/ENDIF-Block, obwohl dieser keine Schleife, sondern eine Verzweigung ist. Wir werden diesen etwas umfangreicheren, aber sehr wichtigen Befehl jetzt besprechen. Der ^4IF/THEN/ELSE/ENDIF-Block^5 dient dazu, Verzweigungen zu realisieren. Wenn eine bestimmte Bedingung erfllt ist, wird der Programmteil zwischen THEN und ENDIF ausgefhrt. Ansonsten wird zu dem Befehl hinter ENDIF gesprungen. Die Bedingung ist meist ein Vergleich zweier Variablen oder einer Variablen und eines Werts. Ein Beispielprogramm demonstriert die mglichen Varianten. ^0'Vergleiche ^0COLOR 14, 1 ^0CLS ^0PRINT "Gib eine Zahl ein!" ^0INPUT Zahl ^0PRINT "Diese Zahl erfllt folgende Bedingungen:" ^0IF Zahl < 100 THEN ^0 PRINT "Sie ist kleiner als 100." ^0END IF ^0IF Zahl <= 100 THEN ^0 PRINT "Sie ist kleiner oder gleich 100." ^0END IF ^0IF Zahl = 100 THEN ^0 PRINT "Sie ist gleich 100." ^0END IF ^0IF Zahl >= 100 THEN ^0 PRINT "Sie ist grer oder gleich 100." ^0END IF ^0IF Zahl > 100 THEN ^0 PRINT "Sie ist grer als 100." ^0END IF Jetzt mten die meisten Vergleichoperatoren klar sein. Grer-oder-Gleich und Kleiner-oder-Gleich werden zwar nur bei Fliekommaoperationen bentigt (und auch da nicht so oft), doch der Vollstndigkeit zuliebe listete ich sie auch auf. Dann gibt es da noch so nette kleine Befehle wie AND, OR usw. Mit ihrer Hilfe lassen sich mehrere Bedingungen miteinander verketten. Wenn zwei Bedingungen mit ^4AND^5 verknpft werden, wird der zwischen THEN und ENDIF stehende Code nur dann abgearbeitet, wenn BEIDE Bedingungen erfllt sind. Richtig, das lt sich auch durch zwei verschachtelte IF/THEN/ELSE/ENDIF-Blcke realisieren! Auerdem werden verschachtelte Blcke etwas schneller abgearbeitet als AND-Ver- knpfungen, weshalb von letzteren eher abzuraten ist. ^4OR^5 macht schon mehr Sinn. Hier wird der Code hinter THEN schon dann abgearbeitet, wenn mindestens eine Bedingung erfllt ist. ^4XOR^5 bedeutet woviel wie 'Entweder-Oder'. Nomen est Omen! Der hinter THEN stehende Code wird hier nur ausgefhrt, wenn NUR EINE Bedingung erfllt ist. Wenn beide oder gar keine erfllt sind, springt QBasic zu dem Befehl nach ENDIF. Um das Ganze zu demonstrieren, wieder ein Beispiel- programm: ^0'Vergleiche mit AND, OR und XOR ^0COLOR 14, 1 ^0CLS ^0PRINT "Gib die erste Zahl ein!" ^0INPUT Zahl1 ^0PRINT "Gib die zweite Zahl ein!" ^0INPUT Zahl2 ^0PRINT "Es werden folgende Bedingungen erfllt:" ^0IF Zahl1 = 100 OR Zahl2 = 100 THEN ^0 PRINT "Mindestens eine der beiden Zahlen ist 100." ^0END IF ^0IF Zahl1 = 100 AND Zahl2 = 100 THEN ^0 PRINT "Beide Zahlen sind 100." ^0END IF ^0IF Zahl1 = 100 XOR Zahl2 = 100 THEN ^0 PRINT "Genau eine der beiden Zahlen ist 100." ^0END IF ^0IF Zahl1 <> 100 AND Zahl2 <> 100 THEN ^0 PRINT "Keine der beiden Zahlen ist 100." ^0END IF Ach ja, 'Ungleich' wird in QBasic wie '<>' geschrieben. Das hatte ich vergessen, euch zu sagen. Wozu ist nun der ^4ELSE-Zweig^5 gut? Normalerweise wird, wenn die Bedingung nicht erfllt ist, die Programmausfhrung direkt beim nchsten Befehl hinter ENDIF fortgesetzt. Kommt nun ein ELSE-Zweig vor, wird bei einer nicht erfllten Bedingung zuerst der Code zwischen ELSE und ENDIF ausgefhrt! (Bei einer erfllten Bedingung wird dann nur der Code zwischen THEN und ELSE ausgefhrt.) Das Ganze lt sich mit Worten ziemlich schwer erklren, doch in Wirklichkeit ist es berhaupt nicht kompliziert. Am besten, wir nehmen wieder ein Beispiel- programm zur Hand (schon ^4KURS0015.BAS^5!). ^0'Vergleiche mit ELSE ^0COLOR 14, 1 ^0CLS ^0PRINT "Gib eine Zahl ein!" ^0INPUT Zahl1 ^0PRINT "Gib eine zweite Zahl ein!" ^0INPUT Zahl2 ^0PRINT ^0IF Zahl1 = Zahl2 THEN ^0 PRINT "Die beiden Zahlen sind identisch." ^0ELSE ^0 PRINT "Die beiden Zahlen sind NICHT identisch." ^0END IF Zum Spa habe ich dieses Programm optimiert. Die optimierte Version ist zwar zum Verstndnis dieses Kurses nicht notwendig, knnte aber sehr interessant sein. ^0'Vergleiche mit ELSE ^0COLOR 14, 1 ^0CLS ^0PRINT "Gib eine Zahl ein!" ^0INPUT Zahl1 ^0PRINT "Gib eine zweite Zahl ein!" ^0INPUT Zahl2 ^0PRINT ^0PRINT "Die beiden Zahlen sind "; ^0IF Zahl1 <> Zahl2 THEN ^0 PRINT "NICHT "; ^0END IF ^0PRINT "identisch." Das wre jetzt der IF/THEN/ELSE/ENDIF-Block. Wie gesagt, lt er sich wie alle Blcke verschachteln. Diese Verschachtelung ist auch EXTREM wichtig fr die strukturierte Programmierung. Am Ende dieser Folge folgt ein Beispiel, jetzt aber noch schnell der ^4SELECT/CASE-Block^5. Wenn man schnell eine Variable auf mehrere Werte prfen will, ist dieser Block wesentlich besser geeignet als ein IF/THEN/ELSE/ENDIF-Block. Wo sonst 'IF ... THEN' steht, mu man 'SELECT CASE Variable' schreiben. 'Variable' steht hier fr den Namen der Variablen, auf die sich die nachfolgenden Vergleiche beziehen. Ein Vergleich wird immer mit CASE eingeleitet. Daneben steht der Wert, mit dem die am Blockanfang angegebene Variable verglichen werden soll. Es lassen sich auch mehrere, durch Beistriche getrennte Werte, neben CASE angeben, was dann soviel wie eine OR-Verknpfung bedeutet. Ist nun die Variable gleich einem der neben CASE angegebenen Werte, so wird der Code hinter CASE ausgefhrt, bis zum nchsten CASE. Ansonsten wird gleich zum nchsten CASE gesprungen. Abgeschlossen wird der SELECT/CASE-Block mit END SELECT. Am besten gleich ein Beispiel, wie das Ganze funktioniert. Es demonstriert gut, wie man die Eingabe bei Adventures mit dem SELECT/CASE-Block leicht realisieren kann. ^0'Einfaches Adventure-Spiel mit SELECT/CASE ^0COLOR 14, 1 ^0CLS ^0PRINT "Willkommen zum Mysterious QBASIC Adventure. Du mut immer die Zahl" ^0PRINT "eingeben, die neben der gewhlten Option steht. 'aT' steht fr" ^0PRINT "eine beliebige andere Taste." ^0PRINT ^0PRINT "Du stehst vor einem Schlo. Wagst Du Dich, es zu betreten?" ^0PRINT ^0PRINT " ( 1) Ja" ^0PRINT " (aT) N" ^0PRINT ^0LINE INPUT Eingabe$ ^0CLS ^0SELECT CASE Eingabe$ ^0 CASE "1" ^0 PRINT "Jetzt bist Du im Schlo. Du hast die Wahl, ob Du nach Westen oder" ^0 PRINT "nach Osten gehst. Natrlich kannst Du auch das Schlo verlassen" ^0 PRINT "(Feigling!) Wofr entscheidest Du Dich, oh edler Ritter?" ^0 PRINT ^0 PRINT " ( 1) Westen" ^0 PRINT " ( 2) Osten" ^0 PRINT " (aT) Schlo verlassen" ^0 PRINT ^0 LINE INPUT Eingabe$ ^0 CLS ^0 SELECT CASE Eingabe$ ^0 CASE "1" ^0 PRINT "Da ist ein bser Drache, den Du, edler Ritter, mit Deinem Schwert" ^0 PRINT "zu Hackfleisch verarbeitest! Du hast die holde Prinzessin" ^0 PRINT "gerettet und darfst sie jetzt zur Belohnung zur Frau nehmen (und" ^0 PRINT "mit ihr 'ne Menge Spa haben)! Ende." ^0 END ^0 CASE "2" ^0 PRINT "Oh, Du armer Held. Kaum gehst Du nach Osten, fllst Du in einen" ^0 PRINT "bodenlosen Abgrund! Und wenn er nicht gestorben ist, dann fllt er" ^0 PRINT "noch heute. Ende." ^0 END ^0 CASE ELSE ^0 PRINT "Kaum hast Du das Schlo verlassen, fllt das Tor hinter Dir zu. Du" ^0 PRINT "hast Deine Chance vertan, denn 'rein kannst Du nimmer! Ende." ^0 END ^0 END SELECT ^0 CASE ELSE ^0 PRINT "Na gut, dann nicht. Starte lieber Excel und erledige langweilige" ^0 PRINT "Tabellenkalkulationen! Ende." ^0END SELECT Hier wird auch die Verschachtelung demonstriert. CASE ELSE entspricht brigens dem ELSE des IF/THEN/ELSE/ENDIF-Blocks, und END beendet das Programm an einer beliebigen Stelle. Hier nun das Ganze mit dem IF/THEN/ELSE/ENDIF-Block. ^0'Einfaches Adventure-Spiel mit IF/THEN/ELSE/ENDIF ^0COLOR 14, 1 ^0CLS ^0PRINT "Willkommen zum Mysterious QBASIC Adventure. Du mut immer die Zahl" ^0PRINT "eingeben, die neben der gewhlten Option steht. 'aT' steht fr" ^0PRINT "eine beliebige andere Taste." ^0PRINT ^0PRINT "Du stehst vor einem Schlo. Wagst Du Dich, es zu betreten?" ^0PRINT ^0PRINT " ( 1) Ja" ^0PRINT " (aT) N" ^0PRINT ^0LINE INPUT Eingabe$ ^0CLS ^0IF Eingabe$ = "1" THEN ^0 PRINT "Jetzt bist Du im Schlo. Du hast die Wahl, ob Du nach Westen oder" ^0 PRINT "nach Osten gehst. Natrlich kannst Du auch das Schlo verlassen" ^0 PRINT "(Feigling!) Wofr entscheidest Du Dich, oh edler Ritter?" ^0 PRINT ^0 PRINT " ( 1) Westen" ^0 PRINT " ( 2) Osten" ^0 PRINT " (aT) Schlo verlassen" ^0 PRINT ^0 LINE INPUT Eingabe$ ^0 CLS ^0 IF Eingabe$ = "1" THEN ^0 PRINT "Da ist ein bser Drache, den Du, edler Ritter, mit Deinem Schwert" ^0 PRINT "zu Hackfleisch verarbeitest! Du hast die holde Prinzessin" ^0 PRINT "gerettet und darfst sie jetzt zur Belohnung zur Frau nehmen (und" ^0 PRINT "mit ihr 'ne Menge Spa haben)! Ende." ^0 END ^0 END IF ^0 IF Eingabe$ = "2" THEN ^0 PRINT "Oh, Du armer Held. Kaum gehst Du nach Osten, fllst Du in einen" ^0 PRINT "bodenlosen Abgrund! Und wenn er nicht gestorben ist, dann fllt er" ^0 PRINT "noch heute. Ende." ^0 END ^0 ELSE ^0 PRINT "Kaum hast Du das Schlo verlassen, fllt das Tor hinter Dir zu. Du" ^0 PRINT "hast Deine Chance vertan, denn 'rein kannst Du nimmer! Ende." ^0 END ^0 END IF ^0ELSE ^0 PRINT "Na gut, dann nicht. Starte lieber Excel und erledige langweilige" ^0 PRINT "Tabellenkalkulationen! Ende." ^0END IF Wie man sieht, ist das Listing zwar etwas krzer, aber komplizierter! Letztendlich bleibt aber dem Programmierer berlassen, ob er SELECT/CASE oder IF/THEN/ELSE/ENDIF verwendet. Ich persnlich bevorzuge SELECT/CASE. Nchstes Mal werden wir nher auf die Programmierung von Adventures eingehen. Es sollten sich aber auch Leute, die mit Spielen nichts am Hut haben, die nchste Folge besorgen, weil wir einige Techniken kennenlernen, die auch in anderen Programmieraufgaben ntzlich sein knnen. Bis zur nchsten Ausgabe! ^1 Euer The Real Adok.