home *** CD-ROM | disk | FTP | other *** search
/ RUN Flagazine: Run 8 / run8.zip / LES8GWB.ASC < prev    next >
Text File  |  1993-01-26  |  28KB  |  333 lines

  1.                         De GWBASIC Interpreter (8)                            
  2.                                                                               
  3.                        Het gezicht van uw programma's                         
  4.                                                                               
  5. We pakken de draad op waar we hem in Les 7 moesten loslaten: het programma  
  6. met de aardrijkskundeles. Dit programma loopt naar tevredenheid maar het      
  7. 'smoelt' niet. We gaan het programma nu zodanig verfraaien dat het            
  8. geschikt wordt voor publikatie in de rubriek RUN van het Algemeen Dagblad     
  9. en (wie weet?) in een volgend RUN Flagazine.                                  
  10. Hieronder volgt de volledige uitwerking van het nog 'kale' programma met      
  11. de aardrijkskundeles dat we in de vorige les hebben behandeld. Type het over  
  12. voor het geval u het niet bij de hand mocht hebben.                           
  13.                                                                               
  14. ┌────────────────────────────────────────────────────────────────────────────┐
  15. │                          Landen en hun hoofdsteden                         │
  16. ╞════════════════════════════════════════════════════════════════════════════╡
  17. │ 100 REM AARDRIJKSKUNDELES GWBASIC GEWOON                                   │
  18. │ 110 CLS:KEY OFF                                                            │
  19. │ 120 REM Arrays dimmen voor landen, hoofdsteden, opgavelijstje en uitslag   │
  20. │ 130 DIM LAND$(20),STAD$(20),LIJST$(5),Q(10)                                │
  21. │ 140 REM LANDEN IN LAND$()                                                  │
  22. │ 150 DATA ALGERIJE,EGYPTE,FINLAND,ZWEDEN,NOORWEGEN                          │
  23. │ 160 DATA IERLAND,IJSLAND,PORTUGAL,SPANJE,CHILI                             │
  24. │ 170 DATA PERU,BULGARIJE,HONGARIJE,ALBANIE,POLEN                            │
  25. │ 180 DATA ARGENTINIE,NIEUW ZEELAND,DUITSLAND,CANADA,FILIPPIJNEN             │
  26. │ 190 REM HOOFDSTEDEN IN STAD$()                                             │
  27. │ 200 DATA ALGIERS,KAIRO,HELSINKI,STOCKHOLM,OSLO                             │
  28. │ 210 DATA DUBLIN,REYKJAVIK,LISSABON,MADRID,SANTIAGO                         │
  29. │ 220 DATA LIMA,SOFIA,BUDAPEST,TIRANA,WARSCHAU                               │
  30. │ 230 DATA BUENOS AIRES,WELLINGTON,BERLIJN,OTTAWA,MANILA                     │
  31. │ 240 REM INLEZEN LANDEN IN LAND$() EN HOOFDSTEDEN IN STAD$()                │
  32. │ 250 FOR A=1 TO 2                                                           │
  33. │ 260   FOR B=1 TO 20                                                        │
  34. │ 270     IF A=1 THEN READ LAND$(B) ELSE READ STAD$(B)                       │
  35. │ 280   NEXT B                                                               │
  36. │ 290 NEXT A                                                                 │
  37. │ 300 REM RANDOMIZER AAN EN USER DEFINED FUNCTIONS VOOR RANDOM GETALLEN      │
  38. │ 310 RANDOMIZE TIMER                                                        │
  39. │ 320 DEF FN RAND1=INT(RND*19)+1:'----------------------> GETAL ONDER DE 20  │
  40. │ 330 DEF FN RAND2=INT(RND*4)+1 :'----------------------> GETAL ONDER DE 5   │
  41. │ 340 REM HOOFDLOOP VOOR 10 VRAGEN                                           │
  42. │ 350 FOR A=1 TO 10                                                          │
  43. │ 360 LOCATE 7,10:PRINT "Vraag:";A                                           │
  44. │ 370 LOCATE 9,10:PRINT "Wat is de hoofdstad van: ";                         │
  45. │ 380   Q(A)=FN RAND1:'---------------------> VARIABELE Q(a) KIEST EEN LAND  │
  46. │ 390   PRINT LAND$(Q(A)):'-----------> PLAATS EEN WILLEKEURIG GEKOZEN LAND  │
  47. │ 400   R=FN RAND2:'--> VARIABELE R (1 - 5) KIEST PLAATS HOOFDSTAD IN LIJST  │
  48. │ 410   REM GENESTE LOOP VOOR PLAATSING HOOFDSTEDEN IN LIJST$()              │
  49. │ 420   FOR B=1 TO 5                                                         │
  50. │ 430     LIJST$(B)=STAD$(FN RAND1)                                          │
  51. │ 440     IF B=R THEN LIJST$(B)=STAD$(Q(A))                                  │
  52. │ 450     LOCATE B+8,50:PRINT B;"- ";LIJST$(B);SPACE$(10)                    │
  53. │ 460   NEXT B                                                               │
  54. │ 470 REM GENESTE LOOP TER VOORKOMING VAN DUBBELE STEDEN IN LIJST$()         │
  55. │ 480 FOR C=1 TO 5                                                           │
  56. │ 490   FOR D=C+1 TO 5                                                       │
  57. │ 500     IF LIJST$(C)=LIJST$(D) THEN B=0:GOTO 420:'HETZELFDE? OVERNIEUW!    │
  58. │ 510   NEXT D                                                               │
  59. │ 520 NEXT C                                                                 │
  60. │ 530 LOCATE 16,16:PRINT "Toets (1,2,3,4 of 5)? ";                           │
  61. │ 540 I$=INKEY$:IF I$="" THEN 540                                            │
  62. │ 550 IF I$="" OR INSTR("12345",I$)=0 THEN BEEP:GOTO 530                     │
  63. │ 560 I=VAL(I$):'-----> Numerieke variabele I nodig voor verdere verwerking  │
  64. │ 570 LOCATE 16,16:PRINT "Uw antwoord: ";LIJST$(I);                          │
  65. │ 580 IF LIJST$(I)=STAD$(Q(A)) THEN S=S+1:PRINT " is correct":GOTO 600       │
  66. │ 590 SOUND 500,3:PRINT " is onjuist"                                        │
  67. │ 600 T=TIMER+1:WHILE T>TIMER:WEND:CLS:'----------------> Wacht een seconde  │
  68. │ 610 NEXT A                                                                 │
  69. │ 620 REM OVERZICHT VAN DE TIEN OPGAVEN - VOLGORDE IN ARRAY Q(10)            │
  70. │ 630 CLS                                                                    │
  71. │ 640 FOR A=1 TO 10                                                          │
  72. │ 650   LOCATE A,3                                                           │
  73. │ 660   PRINT "De hoofdstad van ";LAND$(Q(A));" is: ",STAD$(Q(A))            │
  74. │ 670 NEXT A                                                                 │
  75. │ 680 REM DE UITSLAG                                                         │
  76. │ 690 LOCATE 12,10:PRINT "U beantwoordde";S;"van de";A-1;"vragen correct"    │
  77. │ 700 END                                                                    │
  78. └────────────────────────────────────────────────────────────────────────────┘
  79.                                                                               
  80.                                                                               
  81. Kleuren                                                                       
  82.                                                                               
  83. Verreweg de meeste PC's zijn voorzien van een kleurenmonitor. Ongeacht de     
  84. grafische resolutie, kan elk kleurenscherm in de karakter-georiënteerde       
  85. mode (niet grafisch dus) een groot aantal kleuren weergeven.                  
  86. Om het scherm karakter-georiënteerd te maken volstaat het commando:           
  87. SCREEN 0,0,0                                                                  
  88. dat zekerheidshalve ook vaak in de eerste regels van een niet-grafisch        
  89. programma wordt gegeven. De programmeur geeft dit commando voor het geval     
  90. het scherm nog grafisch staat ingesteld. In dat geval is het scherm:          
  91. SCREEEN 1 of 2 (CGA), SCREEN 9 (EGA) of SCREEN 12 (VGA).                      
  92. De opdracht: SCREEN 0,0,0 doet niets als het scherm al karakter-georiënteerd  
  93. is maar het zet de grafische modus uit wanneer die aan mocht staan.           
  94. In elk geval staat in SCREEN 0 het commando:                                  
  95. COLOR x,x tot onze beschikking. De twee door een komma gescheiden x-jes zijn  
  96. waarden voor respectievelijk de voorgrond en de achtergrond.                  
  97. In SCREEN 0 hebben we in totaal 32 (0 t/m 31) kleuren ter beschikking.        
  98. Simpel voorbeeld: Geef in SCREEN 0 de directe opdracht:                       
  99.                                                                               
  100. COLOR 14,0                                                                    
  101.                                                                               
  102. en u krijgt gele (COLOR 14) tekens op een zwarte (0) achtergrond.             
  103.                                                                               
  104. COLOR 10,0                                                                    
  105.                                                                               
  106. geeft groene (10) letters op zwart maar het omgekeerde kan ook: zwarte        
  107. tekens op een groene achtergrond:                                             
  108.                                                                               
  109. COLOR 0,2                                                                    
  110.                                    ┌─────┐                                    
  111. ┌──────────────────────────────────┤ TIP ├──────────────────────────────────┐ 
  112. │                                  └─────┘                                  │ 
  113. │ Willen we een programma beginnen met een gekleurde achtergrond dan         
  114.  volstaat:                                                                  
  115.                                                                             
  116.  COLOR 0,x:CLS                                                              
  117.                                                                             
  118.  waarin x de achtergrondkleur van onze keuze is.                            
  119. └───────────────────────────────────────────────────────────────────────────┘ 
  120.                                                                               
  121.                                                                               
  122. Kleureffecten                                                                 
  123.                                                                               
  124. De Colors 0 tot en met 15 kunnen we beschouwen als basiskleuren die de        
  125. kleuren van de regenboog omvatten, inclusief zwart (0) of onzichtbaar.        
  126. Voorbij Color 15 (fel wit) beginnen de knippereffecten. We kunnen tekens      
  127. in een bepaalde voorgrondkleur laten knipperen door bij de basiskleur 16 op   
  128. te tellen. Bij voorbeeld:                                                     
  129. COLOR 26,0                                                                    
  130. laat groene tekst (Color 10 + 16) knipperen op een zwarte achtergrond.        
  131. Dit soort effecten wordt vaak toegepast om de aandacht van de gebruiker te    
  132. trekken als er een intoetsing van hem wordt verwacht zoals in:
  133. <PgDn> volgende pagina                                                        
  134. <F1> voor Help                                                                
  135. <Esc> RUN Desktop.                                                            
  136. Overdrijf knipperteksten nooit want dat maakt op de gebruiker een             
  137. vermoeiende en soms zelfs een weinig professionele indruk.                    
  138. Hetzelfde geldt voor het gebruik van overdadige kleuren. Tekst in afwijkende  
  139. kleuren moet een functie hebben en dat geldt in bijzondere mate voor tekst    
  140. in diapositief (zwarte tekens op een witte of contrasterende achtergrond).
  141. Met het commando: COLOR x,y bepalen we dus de voorgrondkleur met x.           
  142. Er kan nog een derde waarde aan worden meegegeven:                            
  143. COLOR x,y,z                                                                   
  144. De waarde van z levert weer een ander effect op waarmee voorzichtig en        
  145. spaarzaam moet worden omgesprongen: de border of beeldschermrand. Deze        
  146. border tekent een kader in het uiterste gebied dat buiten het normale, met    
  147. LOCATE te adresseren gebied ligt. Enig geëxperimenteer in de directe          
  148. modus, zal verhelderend zijn: probeert het allemaal!                          
  149. Samenvattend geldt dus:                                                       
  150. COLOR x,y,z                                                                   
  151. waarin voor x (voorgrond) 16 kleuren plus 16 voor het knippereffect           
  152. beschikbaar zijn, voor y (achtergrond) 8 kleuren en voor z (border) weer      
  153. 16 kleuren. Opgepast: Computers beginnen te tellen bij nul. De zestien       
  154. voorgrondkleuren lopen dus van 0 tot en met 15! Overigens is het effect
  155. van de BORDER alleen zichtbaar bij CGA (Screen 1).
  156.                                                                               
  157. Lijnen en kaders                                                              
  158.                                                                               
  159. Herinnert u zich de ASCII-tabel? Hij komt in bijna elk computerboek voor      
  160. en in deze cursus is al een programmaatje gegeven dat deze belangrijke        
  161. tabel op het scherm zichtbaar maakt.                                          
  162. Deze tabel moet u als programmeur voortdurend bij de hand hebben. U zult      
  163. hem om de haverklap moeten raadplegen als u lijnen en kaders zichtbaar        
  164. wilt maken.                                                                   
  165. Moeilijk is het werken met lijnen niet. In de tabel ziet u bijvoorbeeld       
  166. dat de ASCII-waarde voor een liggend grafisch streepje 196 is. Dat            
  167. betekent dus dat:                                                             
  168.                                                                               
  169. PRINT CHR$(196)                                                               
  170.                                                                               
  171. dat streepje op het scherm zet.                                               
  172. Een reeks van 50 aansluitende 196-streepjes krijgen we met:                   
  173.                                                                               
  174. PRINT STRING$(50,196)                                                         
  175.                                                                               
  176. Een horizontale streep dus. Hoe krijgen we nu een verticale streep?           
  177. Precies: daar is een FOR/NEXT-loopje voor nodig:                              
  178.                                                                               
  179. FOR A=1 TO 10:PRINT CHR$(179):NEXT A                                          
  180.                                                                               
  181. De streep, samengesteld uit CHR$(179), staat aan het begin van het scherm.    
  182. We zullen dus in de kringloop met LOCATE moeten werken om hem middenin het    
  183. scherm te krijgen:                                                            
  184.                                                                               
  185. FOR A=1 TO 10:LOCATE A,40:PRINT CHR$(179):NEXT A                              
  186.                                                                               
  187. Nu we horizontaal en verticaal lijnen kunnen trekken, kunnen we ook een       
  188. afgesloten kader middenin het scherm zetten. Daarvoor hebben we ook de        
  189. hoekjes nodig om de lijnen gesloten te krijgen. Deze vier hoekjes zoeken      
  190. we op in de tabel. Het zijn de ASCII-waarden: 218, 191, 192 en 217. Dit       
  191. wordt een kader:                                                              
  192. ┌──────────────────────────────────────────────────┐                          
  193. │ 10 CLS                                           │  Dat is toch nog vrij    
  194. │ 20 LOCATE 5,10                                   │  veel code voor een      
  195. │ 30 PRINT CHR$(218)STRING$(50,196)CHR$(191)       │  simpel kadertje, vindt  
  196. │ 40 FOR A=6 TO 19                                 │  u niet? Toch loont dit  
  197. │ 50    LOCATE A,10                                │  geprogrammeer de moei-  
  198. │ 60    PRINT CHR$(179)                            │  te want de presentatie  
  199. │ 70    LOCATE A,61                                │  van uw programma wordt  
  200. │ 80    PRINT CHR$(179)                            │  er, vooral ook in com-  
  201. │ 90 NEXT A                                        │  binatie met wel geko-   
  202. │ 100 LOCATE 20,10                                 │  zen kleuren, veel beter 
  203. │ 110 PRINT CHR$(192)STRING$(50,196)CHR$(217)      │  door. Nevenstaand pro-  
  204. └──────────────────────────────────────────────────┘  grammaatje tekent een   
  205. enkellijns kader middenin het scherm.                                         
  206. Opdracht: Raadpleeg uw ASCII-tabel en pas het programma zodanig aan dat er    
  207. een dubbellijns kader ontstaat. Een zetje in de goede richting: het           
  208. dubbellijns horizontale grafische streepje is CHR$(205) en het verticale      
  209. dubbele lijnstukje is CHR$(186). De rest zoekt u zelf uit.                    
  210.                                                                               
  211. Variabele kaders                                                              
  212.                                                                               
  213. Als we in een programma veelvuldig van kaders van diverse omvangen gebruik    
  214. willen maken, kan dat programma zeer lang worden omdat voor een kader nogal   
  215. wat code nodig is. Dus..., denkt de creatieve programmeur, dan maak ik een    
  216. subroutine voor het maken van kaders van elke gewenste en mogelijke omvang.   
  217. De variabelen, die de vorm en de omvang bepalen worden vastgesteld vlak       
  218. voordat de subroutine geroepen wordt.                                         
  219. Kijk naar het voorbeeldprogramma en ga na welke de variabelen zijn:           
  220.                                                                               
  221. 1. De lengte van de horizontale streep.                                       
  222. 2. De lengte van de verticale streep.                                         
  223. 3. De lokatie van de linker bovenhoek.                                        
  224. 4. De lokatie van de rechter bovenhoek.                                       
  225.                                                                               
  226. We gaan nu een demootje maken dat de werking van een kader-subroutine laat    
  227. zien:                                                                         
  228. Eerst schrijven we het stukje programma dat ┌──────────────────────────────┐  
  229. om de variabelen komt vragen die we in de   │ 100 CLS:KEY OFF              │  
  230. subroutine nodig hebben voor het tekenen    │ 110 LOCATE 1,1               │  
  231. van kaders met variabele breedten en hoog-  │ 120 INPUT "Regelnr. boven";RB│  
  232. ten.                                        │ 130 INPUT "Regelnr. onder";RO│  
  233. We zouden hier eigenlijk ook nog allerlei   │ 140 INPUT "Breedte";BR       │  
  234. voorzieningen moeten inbouwen om onmoge-    └──────────────────────────────┘  
  235. lijke invoer af te vangen maar voor ons doel is dat niet nodig. Met de vanaf  
  236. het toetsenbord ingevoerde waarden voor de variabelen RB, RO, duiken we de    
  237. de subroutine in:                                                             
  238.                                             ┌──────────────────────────────┐  
  239.                                             │ 150 GOSUB 160:GOTO 110       │  
  240.                                             └──────────────────────────────┘  
  241.                                                                               
  242.                                             ┌──────────────────────────────┐  
  243. Regel 180 verdient onze bijzondere aan-     │ 160 REM VARIABELE KADERS     │  
  244. dacht. Dit is een algoritme waarmee we      │ 170 SCREEN 0,0               │  
  245. voor de variabele P een positie op het      │ 180 P=(80-BR)/2              │  
  246. beeldscherm berekenen waardoor het te       └──────────────────────────────┘  
  247. tekenen kader altijd in het midden van het scherm komt te staan.              
  248. Nu komt de eigenlijke subroutine waarin ook het een en ander moet worden be-  
  249. rekend:                                                                       
  250. ┌────────────────────────────────────────────────┐  Eerst wordt op de boven-  
  251. │ 190 LOCATE RB,P                                │  ste regel (RB) en op de   
  252. │ 200 PRINT CHR$(218)STRING$(BR-1,196)CHR$(191)  │  in P berekende plaats     
  253. │ 210 FOR KADER=RB TO RO                         │  het hoekje geplaatst.     
  254. │ 220    LOCATE KADER+1,P                        │  Direct achter dit hoekje  
  255. │ 230    PRINT CHR$(179)                         │  komt de streep, bestaan-  
  256. │ 240    LOCATE KADER+1,BR+P                     │  de uit BR-1 streepjes     
  257. │ 250    PRINT CHR$(179)                         │  (CHR$(196). Dan wordt de  
  258. │ 260 NEXT KADER                                 │  FOR/NEXT ingezet die de   
  259. └────────────────────────────────────────────────┘  verticale lijnen trekt.   
  260. Rest nog slechts de onderste kaderlijn inclusief de verbindende hoekjes       
  261. te tekenen:                                                                   
  262. ┌───────────────────────────────────────────────┐ Type dit programma over en  
  263. │ 270 LOCATE KADER+1,P                          │ RUN het enkele malen. Geef  
  264. │ 280 PRINT CHR$(192)STRING$(BR-1,196)CHR$(217) │ ook 'onmogelijke' variabe-  
  265. │ 290 RETURN                                    │ len op en BEGRIJP waarom    
  266. └───────────────────────────────────────────────┘ GWBASIC daartegen bezwaar   
  267. maakt met foutmeldingen.                                                      
  268.                                  ┌─────┐                                      
  269. ┌────────────────────────────────┤ TIP ├───────────────────────────────────┐  
  270. │                                └─────┘                                   │  
  271. │ U doet er verstandig aan een puntkomma te plaatsen achter PRINT CHR$(179)  
  272.  in regel 250 en zeker achter CHR$(217) in regel 280. Hiermee voorkomt u    
  273.  dat er onderbroken kaderlijnen ontstaan wanneer grote kaders over de vol-  
  274.  le breedte van het scherm worden getekend.                                 
  275. └──────────────────────────────────────────────────────────────────────────┘  
  276.                                                                               
  277. Oproep en opgave                                                              
  278.                                                                               
  279. Het is de bedoeling dat het programma: Aardrijkskundeles wordt gepubliceerd   
  280. in de RUN van het Algemeen Dagblad. Als het door de geringe plaatsruimte in   
  281. de krant te lang wordt, gaat het in elk geval mee in een volgend RUN Flaga-   
  282. zine.                                                                         
  283. Trouwe cursisten die zich nu zo langzamerhand Programmeur mogen noemen,       
  284. geef ik hierbij een belangrijke opdracht: Kleed dit programma aan. Maak ge-   
  285. bruik van kaders en kleuren maar maak het niet te bont. U mag het program-    
  286. ma ook verder uitbreiden met meer landen en hoofdsteden als u wilt (en        
  287. als u kunt...!).                                                              
  288. Weest kritisch op uzelf en op uw resultaat en wanneer u tevreden bent         
  289. vertrouw het programma dan aan een diskette toe en stuur het naar RUN. De     
  290. redaktie van RUN Flagazine zal dan een keuze uit de inzendingen maken en      
  291. het programma opnemen in het RUN-menu met vermelding van de naam van de be-   
  292. werker wanneer daar althans geen bezwaar tegen bestaat.                       
  293. Plaatsing in RUN Flagazine wordt beloond met een boeken- of VVV-bon.          
  294. Aarzel niet, ga aan het werk en doe mee! Per slot van rekening hebt u niet    
  295. voor niets een PC aangeschaft!                                                
  296. Over uw diskette hoeft niet in te zitten: die krijgt u weer terug omdat we    
  297. de inzendingen direct overnemen in een aparte directory.                      
  298. Ik ben zeer benieuwd of deze oproep iets oplevert. Het is tevens een test-    
  299. case om te bepalen of deze cursus GWBASIC al of niet moet worden voortge-     
  300. zet.                                                                          
  301.                                                                               
  302. Inzendingen graag naar het vertrouwde adres waar ze met spanning worden te-   
  303. gemoet gezien                                                                 
  304.                                RUN Flagazine                                  
  305.                                GWBASIC-cursus                                 
  306.                                Postbus 338                                    
  307.                                2160 AH Lisse.                                 
  308.                                                                               
  309. In de volgende les van deze cursus maken we ons eerste uitstapje naar gra-    
  310. fische commando's voor de SCREENS 1, 2 en 9. Ook gaan we het hebben over      
  311. het verschil tussen de interpreter en de compiler en gaan we na wat de        
  312. nieuwe BASIC van Microsoft: QBASIC werkelijk waard is.                        
  313.                                                                               
  314. Tot over een paar maanden...                                                  
  315.                                                                               
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.