^1 The Real Adok's Way to QBASIC ^1 A new Method Step by Step Willkommen zum dritten Teil meines QBasic-Kurses! Heute m”chte ich euch zeigen, wie man mit einfachen grafischen und musikalischen Effekten seine Programme aufwerten kann. Doch zun„chst zu unserer Hausaufgabe. Ihr muátet unter Verwendung des INPUT-Befehls das Programm Kurs0002.BAS so ver„ndern, daá der Benutzer die Zahlen selbst eingeben kann. Hier eine m”gliche L”sung: ^0 CLS ^0 PRINT "Wie lautet die erste Zahl"; ^0 INPUT zahl1 ^0 PRINT "Wie lautet die zweite Zahl"; ^0 INPUT zahl2 ^0 CLS ^0 PRINT "Zahl 1:"; ^0 PRINT zahl1 ^0 PRINT "Zahl 2:"; ^0 PRINT zahl2 ^0 PRINT "Addition:"; ^0 PRINT zahl1 + zahl2 ^0 PRINT "Subtraktion:"; ^0 PRINT zahl1 - zahl2 ^0 PRINT "Multiplikation:"; ^0 PRINT zahl1 * zahl2 ^0 PRINT "Division:"; ^0 PRINT zahl1 / zahl2 Ihr seht, daá der Befehl INPUT fast genauso wie LINE INPUT funktioniert. Wenn INPUT ausgefhrt wird, erscheint auf dem Bildschirm ein Fragezeichen. Das Pro- gramm verlangt nun, daá der Benutzer einen Text oder eine Zahl eingibt. Die Eingabe wird mit der ENTER-Taste best„tigt, und der eingegebene Text bzw. die eingegebene Zahl wird in der Variablen gespeichert, die im Listing neben INPUT steht. Die Unterschiede zwischen INPUT und LINE INPUT bestehen also darin, daá INPUT ein Fragezeichen ausgibt und der Benutzer nicht nur Zeichenketten, sondern auch Zahlen eingeben kann. Dann muá 'INPUT' aber auch eine String- variable als Parameter bergeben bekommen. (Um Miáverst„ndnissen vorzubeugen: Zeichenketten k”nnen auch Ziffern enthalten!) Wenn ihr das obenstehende Programm gestartet habt, werdet ihr bemerkt haben, daá das Fragezeichen, das INPUT auf dem Bildschirm ausgibt, direkt neben den Ausgaben der PRINT-Anweisungen erscheint. Das heiát im Klartext, daá sich das Semikolon nicht nur auf die n„chste PRINT-, sondern berhaupt auf die n„chste Anweisung, die eine Bildschirmausgabe bewirkt, bezieht. Auch LINE INPUT bewirkt eine Bildschirmausgabe (der Cursor und die eingegebenen Zeichen werden auf dem Bildschirm ausgegeben)! ^1Nun zu dem Thema dieser Folge: Wie kann man einfache Grafik- und Soundeffekte ^1realisieren, um die eigenen Programme aufzuwerten? Dazu gibt es mehrere ^1Befehle, die ich jetzt aufz„hlen und n„her erkl„ren m”chte. - Es ist vielleicht nicht so sch”n, wenn bei einem Programm die Textausgaben nacheinander folgen. Deshalb gibt es den Befehl LOCATE. Mit ihm kann man den Cursor an einer beliebigen Stelle des Bildschirms plazieren. Die "Syntax" des Befehls, das heiát, seine Schreibweise, lautet: ^0 LOCATE zeile, spalte Diese Syntax verwenden brigens alle Basic-Dialekte auf dem PC. Auf den meisten anderen Computern wird zuerst die Spalte angegeben. Der Textmodus, auf den wir uns (vorl„ufig) beschr„nken, hat eine Aufl”sung von 80 Spalten mal 25 Zeilen. Mit dem LOCATE-Befehl positionieren wir quasi den Cursor auf die durch die Variablen zeile und spalte angegebene Position. Die n„chste Bildschirmausgabe findet an dieser Position statt, was sehr praktisch ist. Man kann auch wahlweise zeile oder spalte weglassen. Der nicht angegebene Wert wird dann automatisch eingefgt. Beispiel: Wenn wir uns in Zeile 12, Spalte 10 befinden und den Befehl ^0 LOCATE , 40 verwenden, wird der Cursor an die Position Zeile 12, Spalte 40 gesetzt. Hier wurde also die Zeile nicht angegeben, dafr aber die aktuelle Zeile auto- matisch eingesetzt. Um die F„higkeiten des 'LOCATE'-Befehls zu demonstrieren, hier eine erweiterte Version unserer Hausaufgabe: ^0 CLS ^0 LOCATE 2, 2 ^0 PRINT "Wie lautet die erste Zahl"; ^0 INPUT zahl1 ^0 LOCATE 5, 2 ^0 PRINT "Wie lautet die zweite Zahl"; ^0 INPUT zahl2 ^0 CLS ^0 LOCATE 2, 2 ^0 PRINT "Zahl 1:"; ^0 PRINT zahl1; ^0 LOCATE , 60 ^0 PRINT "Zahl 2:"; ^0 PRINT zahl2 ^0 LOCATE 3, 1 ^0 PRINT "--------------------------------------------------------------------"; ^0 PRINT "------------" ^0 LOCATE 5, 2 ^0 PRINT "Addition:"; ^0 LOCATE , 17 ^0 PRINT zahl1 + zahl2 ^0 LOCATE 6, 2 ^0 PRINT "Subtraktion:"; ^0 LOCATE , 17 ^0 PRINT zahl1 - zahl2 ^0 LOCATE 7, 2 ^0 PRINT "Multiplikation:"; ^0 LOCATE , 17 ^0 PRINT zahl1 * zahl2 ^0 LOCATE 8, 2 ^0 PRINT "Division:"; ^0 LOCATE , 17 ^0 PRINT zahl1 / zahl2 Damit ihr keine Tippfehler macht: In der Zeile 16 befinden sich 68 Minusse, in der Zeile 17 10 Minusse. Man k”nnte zwar auch die insgesamt 78 Minuszeichen in einer PRINT-Anweisung zusammenfassen, jedoch ist die Zeile dann so lang, daá sie ber den Bildschirmrand hinaus geht. Dieses Programm werden wir noch ”fters ver„ndern. Speichert es also unter Kurs0004.BAS. - Bisher hatten alle Programme eine einheitliche Farbkombination: weiáer Text auf schwarzem Hintergrund. Da dies mit der Zeit sehr eint”nig werden kann, gibt es in QBasic einen Befehl, um eine andere Farbkombination einzustellen: COLOR. Seine Syntax lautet: ^0 COLOR vordergrundfarbe, hintergrundfarbe Die Vordergrundfarbe ist hierbei die Farbe, in der der Text geschrieben werden soll, w„hrend die Hintergrundfarbe, wie der Name schon sagt, die Farbe des Hintergrunds ist. Wie bei 'LOCATE' kann auch ein Parameter weggelassen werden. Wie gibt man nun die Vordergrundfarbe und die Hintergrundfarbe an? Das ist leider nicht ganz so einfach. Zu jeder Farbe geh”rt ein sogenannter Farbcode. Dieser Farbcode ist eine Zahl von 0 bis einschlieálich 31. Jede Zahl von 0 bis einschlieálich 7 steht fr eine "dunkle" Farbe. Z„hlt man zu einer dieser Zahlen 8 dazu, so erh„lt man die dazugeh”rige "helle" Farbe. Beispiel: Der Farbcode der Farbe Dunkelblau ist 1. Daher ist der Farbcode der Farbe Hellblau 9. Nur die Farbe mit der Nummer 8 ist hier eine Ausnahme, denn diese ist Grau. Z„hlt man zu einer der Farben von 0 bis einschlieálich 15 nun 16 hinzu, erh„lt man eine "blinkende" Farbe. Man kommt nicht darum, die Farbcodes auswendig zu lernen. Da ich euch aber jetzt die "Philosophie" hinter der Reihenfolge der Farbcodes erkl„rt habe, wird es euch sicherlich leicht fallen. Hier nun die vollst„ndige Tabelle der Farbcodes: ^0 0 Schwarz 8 Grau 16 Blink-Schwarz 24 Blink-Grau ^0 1 Dunkelblau 9 Hellblau 17 Blink-D.-Blau 25 Blink-H.-Blau ^0 2 Dunkelgrn 10 Hellgrn 18 Blink-D.-Grn 26 Blink-H.-Grn ^0 3 Dunkelzyan 11 Hellzyan 19 Blink-D.-Zyan 27 Blink-H.-Zyan ^0 4 Dunkelrot 12 Hellrot 20 Blink-D.-Rot 28 Blink-H.-Rot ^0 5 Dunkelviolett 13 Hellviolett 21 Blink-D.-Violett 29 Blink-H.-Violett ^0 6 Braun 14 Gelb 22 Blink-Braun 30 Blink-Gelb ^0 7 Weiá 15 Leucht-Weiá 23 Blink-Weiá 31 Blink-Leucht-Weiá Wenn man eine Farbe ”fters verwendet, k”nnte man sie auch in einer Variablen speichern. Wird z.B. die Farbe Dunkelgrn ”fters ben”tigt, so k”nnte man ihren Farbcode der Variablen gruen zuweisen. Statt COLOR 2 braucht man dann nur mehr COLOR gruen zu schreiben. QBasic ersetzt dann w„hrend der Ausfhrung auto- matisch den Platzhalter gruen durch den Wert 2. Man k”nnte auch einer Variablen hell den Wert 8 und einer Variable blink den Wert 16 zuweisen. Will man dann die Vordergrundfarbe auf Blink-Hellgrn umschalten, schreibt man einfach COLOR blink + hell + gruen. Ihr seht, das ist unserer Umgangssprache schon sehr „hnlich! Doch nun zu unserem Beispielpro- gramm. Es ist eine Weiterentwicklung von Kurs0004.BAS, und deshalb speichern wir es unter Kurs0005.BAS. ^0 blau = 1 ^0 gelb = 14 ^0 weiss = 7 ^0 hell = 8 ^0 COLOR , blau ^0 CLS ^0 COLOR hell + weiss ^0 LOCATE 2, 2 ^0 PRINT "Wie lautet die erste Zahl"; ^0 COLOR gelb ^0 INPUT zahl1 ^0 COLOR hell + weiss ^0 LOCATE 5, 2 ^0 PRINT "Wie lautet die zweite Zahl"; ^0 COLOR gelb ^0 INPUT zahl2 ^0 CLS ^0 COLOR hell + weiss ^0 LOCATE 2, 2 ^0 PRINT "Zahl 1:"; ^0 COLOR gelb ^0 PRINT zahl1; ^0 COLOR hell + weiss ^0 LOCATE , 60 ^0 PRINT "Zahl 2:"; ^0 COLOR gelb ^0 PRINT zahl2 ^0 COLOR hell + weiss ^0 LOCATE 3, 1 ^0 PRINT "--------------------------------------------------------------------"; ^0 PRINT "------------" ^0 COLOR hell + weiss ^0 LOCATE 5, 2 ^0 PRINT "Addition:"; ^0 COLOR gelb ^0 LOCATE , 17 ^0 PRINT zahl1 + zahl2 ^0 COLOR hell + weiss ^0 LOCATE 6, 2 ^0 PRINT "Subtraktion:"; ^0 COLOR gelb ^0 LOCATE , 17 ^0 PRINT zahl1 - zahl2 ^0 COLOR hell + weiss ^0 LOCATE 7, 2 ^0 PRINT "Multiplikation:"; ^0 COLOR gelb ^0 LOCATE , 17 ^0 PRINT zahl1 * zahl2 ^0 COLOR hell + weiss ^0 LOCATE 8, 2 ^0 PRINT "Division:"; ^0 COLOR gelb ^0 LOCATE , 17 ^0 PRINT zahl1 / zahl2 ^1In den Zeilen 6 und 7 wird gezeigt, daá CLS den Bildschirm nicht immer schwarz ^1macht, sondern ihn in der aktuellen Hintergrundfarbe ausfllt. Auáerdem seht ^1ihr, daá ich in diesem Programm einige Leerzeilen eingefgt habe. Das dient ^1schlicht und einfach dazu, daá das Programm bersichtlicher wird. - Zur šbersichtlichkeit ist es auch ntzlich, wenn man den Befehl REM einsetzt. Alles, was nach diesem Wort in derselben Zeile steht, wird ignoriert. Das dient vor allem zur Erl„uterung einzelner Programmabschnitte oder zum Ausprobieren von verschiedenen Varianten (am Anfang der Programmzeile einfach REM schreiben - Folge: Befehle, die sich in der Zeile befinden, werden ignoriert). Der Befehl REM kann durch ein einfaches Apostroph (') abgekrzt werden. Dann kann man ihn auch mitten in die Zeile hineinsetzen. In diesem Fall wird nur ab dieser Stelle die Ausfhrung unterbunden. Ein kleines Beispiel (Kurs0006.BAS): ^0 'Variablenzuweisungen ^0 blau = 1 'Farbe Blau ^0 gelb = 14 'Farbe Gelb ^0 'Hauptprogramm ^0 COLOR gelb, blau 'Farben w„hlen ^0 CLS 'Bildschirm l”schen ^0 PRINT "Hallo, Leute!" 'Text ausgeben ^0 REM PRINT "Mieses Wetter heute!" 'Ausgeklammerter Befehl ^0 PRINT "Sch”nes Wetter heute!" 'Text ausgeben ^0 PRINT "Bis morgen!" 'Text ausgeben Alles klar? ^1PRINT l„át sich brigens auch durch das Fragezeichen (?) abkrzen. Doch da ^1dies nicht sehr gebr„uchlich ist, erw„hnen wir es nur am Rande. - Nun zu der Musik. (ENDLICH!!!!) Fr diesen Teil ist es notwendig, daá ihr wenigstens etwas im Musikunterricht aufgeschnappt habt. Die Notennamen m”chte ich hier nicht noch einmal erkl„ren! Alle Unmusikalischen k”nnen aber auch etwas Musik mit den Befehlen BEEP und SOUND erzeugen (in der Online-Hilfe nachlesen!). Kommen wir aber zum gebr„uchlisten Musikbefehl in QBasic: PLAY. Mit ihm kann der Programmierer Klavier spielen. Die Noten mssen dazu aber in einer Zeichenkette vorliegen. Das Format ist zwar anfangs etwas ungew”hnlich, aber da auch der m„chtige Grafikbefehl DRAW ein „hnliches Format verwendet, lohnt es sich, es zu lernen. Sehen wir uns dazu ein Beispiel an. ^0 'I want to be in America ^0 'Coded by The Real Adok ^0 'šbersichtliche Version fr Basic-Kurs ^0 PLAY "t120 l8 o4" ^0 PLAY "g g g > c c c < l4 a f c" 'Tempo 120, Achtel, Oktave 4 ^0 PLAY "l8 g g g > c c c l4 d < b g" 'Das Lied beginnt! ^0 PLAY "l8 b- b- b- > e- e- e- l4 d < b- f" 'Weiter geht's! ^0 PLAY "l8 e- e- e- a- a- a- l4 g > l8 e p8 < l4 c" 'Ende. Klingt doch gut, oder? Der erste PLAY-Befehl stellt das Tempo auf 120, die Notenl„nge auf Achtel und die Oktave auf 4 ein. Man erkennt: Der Buchstabe 't' steht fr das Tempo, 'l' fr die Notenl„nge und 'o' fr die Oktave. Bei der Oktave mssen Zahlen angegeben werden, denn QBasic versteht sowas wie 'groáe Oktave' oder 'einge- strichene Oktave' nicht. 0 ist die tiefste und 7 die h”chste Oktave. Standard ist 4. Das Tempo entspricht der Taktfrequenz des Metronoms und reicht theoretisch von 0 bis 255. Tatsache ist aber, daá ein Tempo unter 32 nicht auszuhalten ist. Schlieálich und endlich gibt die Zahl neben dem 'l', wie gesagt, die Notenl„nge an. Wenn diese Zahl z.B. x ist, dann ist die Notenl„nge 1/x (logisch, man will es dem Programmierer auch nicht zu kompliziert machen). Das waren die allgemeinen Vorbereitungen. Jetzt beginnt das eigentliche Lied! Natrlich lassen sich die Befehle, die wir im Vorbereitungsteil verwendet haben, auch noch jetzt verwenden. Allerdings kenne ich kaum Lieder, in denen das Tempo st„ndig gewechselt wird (auáer in meinen eigenen :-) und denen von B‚la Bartok)...! Noten werden durch Nennung ihres Namens gespielt. Hier haben wir beispiels- weise gleich zu Anfang drei G's gespielt, die in der aktuellen Oktave im aktuellen Tempo und der aktuellen Notenl„nge ert”nen. Wichtig ist nur, daá die englische Schreibweise benutzt wird, also berall dort, wo die Note H vorkommt, B geschrieben wird. Das ist die einzige Žnderung. Kreuz- und Be-Vor- zeichen werden an die Note angeh„ngt, und zwar steht '#' fr Kreuz und '-' fr Be. Das w„re eigentlich alles, was ihr dazu braucht, um eure Lieder in QBasic umzusetzen. Hier noch eine Liste mit weiteren PLAY-Dingsbums (eigentlich sind es auch Befehle) wie '<' und '>'. ^0 <........... eine Oktave tiefer ^0 >........... eine Oktave h”her ^0 mf.......... spiele Musik im Vordergrund ^0 mb.......... spiele Musik im Hintergrund (Einlesen der Noten ist zu langsam!) ^0 ml.......... legato ^0 ms.......... staccato ^0 mn.......... normal ^0 #........... Kreuz ^0 -........... Be ^0 lx.......... Notenl„nge 1/x ^0 tx.......... Tempo x ^0 ox.......... Oktave x Falls euch unklar ist, was mit "Vordergrund" und "Hintergrund" gemeint ist: Wenn "Vordergrund" gew„hlt wurde, wird w„hrend der Wiedergabe der Musik die Programmausfhrung angehalten und erst nachher wieder fortgesetzt. Dagegen arbeitet das Programm, wenn "Hintergrund" gew„hlt wurde, weiter, w„hrend die Musik gespielt wird. Leider werden die Noten im "Hintergrund"-Modus zu langsam eingelesen, um eine echte Hintergrundmusik realisieren zu k”nnen. Nochmals zu den Notennamen: ALLE MšSSEN NACH DER REGEL EINGEGEBEN WERDEN! Solche Spezialit„ten wie das Eis versteht QBasic nicht. Habt ihr eigentlich schon mal versucht, 'c-' zu spielen? Daá diese Note dem 'b' der vorigen Oktave entspricht, kapiert der Computer nicht! Fr ihn liegen Halbt”ne nur auf den schwarzen Tasten. Uff, das war 'ne Menge! Und weil's so sch”n ist, binden wir in unser Proggy noch Musik ein!!!! ^0 'DAS MEGARECHENPROGRAMM!!!! ^0 '... aus The Real Adok's Way to QBASIC. ^0 '+++ Variablenzuweisungen ^0 blau = 1 'Farbe Blau ^0 gelb = 14 'Farbe Gelb ^0 weiss = 7 'Farbe Weiá ^0 hell = 8 'Zusatz fr Helligkeit ^0 '+++ Hauptprogramm ^0 COLOR , blau 'Blauer Hintergrund ^0 CLS 'Bildschirm l”schen ^0 COLOR hell + weiss 'Eingabe der ersten Zahl ^0 LOCATE 2, 2 ' ^0 PRINT "Wie lautet die erste Zahl"; ' ^0 COLOR gelb ' ^0 INPUT zahl1 ' ^0 COLOR hell + weiss 'Eingabe der zweiten Zahl ^0 LOCATE 5, 2 ' ^0 PRINT "Wie lautet die zweite Zahl"; ' ^0 COLOR gelb ' ^0 INPUT zahl2 ' ^0 CLS 'Bildschirm l”schen ^0 COLOR hell + weiss 'Erste Zahl ausgeben ^0 LOCATE 2, 2 ' ^0 PRINT "Zahl 1:"; ' ^0 COLOR gelb ' ^0 PRINT zahl1; ' ^0 COLOR hell + weiss 'Zweite Zahl ausgeben ^0 LOCATE , 60 ' ^0 PRINT "Zahl 2:"; ' ^0 COLOR gelb ' ^0 PRINT zahl2 ' ^0 COLOR hell + weiss 'Verzierungsstrichlein ausgeben ^0 LOCATE 3, 1 ' ^0 PRINT "-----------------------"; ' ^0 PRINT "-----------------------"; ' ^0 PRINT "-----------------------"; ' ^0 PRINT "-----------" ' ^0 COLOR hell + weiss 'Ergebnis der Addition ausgeben ^0 LOCATE 5, 2 ' ^0 PRINT "Addition:"; ' ^0 COLOR gelb ' ^0 LOCATE , 17 ' ^0 PRINT zahl1 + zahl2 ' ^0 COLOR hell + weiss 'Ergebnis der Subtraktion ausgeben ^0 LOCATE 6, 2 ' ^0 PRINT "Subtraktion:"; ' ^0 COLOR gelb ' ^0 LOCATE , 17 ' ^0 PRINT zahl1 - zahl2 ' ^0 COLOR hell + weiss 'Ergebnis der Multiplikation ausgeben ^0 LOCATE 7, 2 ' ^0 PRINT "Multiplikation:"; ' ^0 COLOR gelb ' ^0 LOCATE , 17 ' ^0 PRINT zahl1 * zahl2 ' ^0 COLOR hell + weiss 'Ergebnis der Division ausgeben ^0 LOCATE 8, 2 ' ^0 PRINT "Division:"; ' ^0 COLOR gelb ' ^0 LOCATE , 17 ' ^0 PRINT zahl1 / zahl2 ' ^0 PLAY "t200 l8 o5 ddd p64 l2 g" 'Musik ^0 '+++ Ende des Programms. So, fr heute machen wir Schluá. Das Programm ist doch eigentlich toll aufge- macht! Nur noch Maussteuerung und eine menorientierte Benutzerfhrung wrden theoretisch durchaus gengen, daá das Programm mit anderen SW-/FW-/PD-Proggys mithalten kann. Doch wer braucht schon so einfache Programme? Da w„re doch etwas Komplexeres interessanter! Wir werden auch in einer der n„chsten Lektionen gemeinsam ein kleines Adventure-Spiel in der Art von 'Die Reise zum Mond' erstellen. Die Optik ist zwar dort nicht das Wahre (OK, OK, ich gebe es endlich zu), aber fr den Anfang reicht es immerhin. Ach ja, Hausaufgaben: Die erlasse ich euch. Dafr sollt ihr viel mit den erlenten Befehlen, besonders mit PLAY, experimentieren. N„chstes Mal werde ich euch erz„hlen, wie man sich in seinen eigenen Programmen auf Fehlersuche begeben kann, und wie QBasic und Quick Basic einen dabei untersttzen. Die Funktionen von Quick Basic sind glcklicherweise denen von Power Basic sehr „hnlich. ^4Jetzt endgltig Schluá mit diesem Teil von The Real Adok's Way to QBASIC ^4(woher dieser Name wohl stammt?).