home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
RUN Flagazine: Run 8
/
run8.zip
/
LES8GWB.ASC
< prev
next >
Wrap
Text File
|
1993-01-26
|
28KB
|
333 lines
De GWBASIC Interpreter (8)
Het gezicht van uw programma's
We pakken de draad op waar we hem in Les 7 moesten loslaten: het programma
met de aardrijkskundeles. Dit programma loopt naar tevredenheid maar het
'smoelt' niet. We gaan het programma nu zodanig verfraaien dat het
geschikt wordt voor publikatie in de rubriek RUN van het Algemeen Dagblad
en (wie weet?) in een volgend RUN Flagazine.
Hieronder volgt de volledige uitwerking van het nog 'kale' programma met
de aardrijkskundeles dat we in de vorige les hebben behandeld. Type het over
voor het geval u het niet bij de hand mocht hebben.
┌────────────────────────────────────────────────────────────────────────────┐
│ Landen en hun hoofdsteden │
╞════════════════════════════════════════════════════════════════════════════╡
│ 100 REM AARDRIJKSKUNDELES GWBASIC GEWOON │
│ 110 CLS:KEY OFF │
│ 120 REM Arrays dimmen voor landen, hoofdsteden, opgavelijstje en uitslag │
│ 130 DIM LAND$(20),STAD$(20),LIJST$(5),Q(10) │
│ 140 REM LANDEN IN LAND$() │
│ 150 DATA ALGERIJE,EGYPTE,FINLAND,ZWEDEN,NOORWEGEN │
│ 160 DATA IERLAND,IJSLAND,PORTUGAL,SPANJE,CHILI │
│ 170 DATA PERU,BULGARIJE,HONGARIJE,ALBANIE,POLEN │
│ 180 DATA ARGENTINIE,NIEUW ZEELAND,DUITSLAND,CANADA,FILIPPIJNEN │
│ 190 REM HOOFDSTEDEN IN STAD$() │
│ 200 DATA ALGIERS,KAIRO,HELSINKI,STOCKHOLM,OSLO │
│ 210 DATA DUBLIN,REYKJAVIK,LISSABON,MADRID,SANTIAGO │
│ 220 DATA LIMA,SOFIA,BUDAPEST,TIRANA,WARSCHAU │
│ 230 DATA BUENOS AIRES,WELLINGTON,BERLIJN,OTTAWA,MANILA │
│ 240 REM INLEZEN LANDEN IN LAND$() EN HOOFDSTEDEN IN STAD$() │
│ 250 FOR A=1 TO 2 │
│ 260 FOR B=1 TO 20 │
│ 270 IF A=1 THEN READ LAND$(B) ELSE READ STAD$(B) │
│ 280 NEXT B │
│ 290 NEXT A │
│ 300 REM RANDOMIZER AAN EN USER DEFINED FUNCTIONS VOOR RANDOM GETALLEN │
│ 310 RANDOMIZE TIMER │
│ 320 DEF FN RAND1=INT(RND*19)+1:'----------------------> GETAL ONDER DE 20 │
│ 330 DEF FN RAND2=INT(RND*4)+1 :'----------------------> GETAL ONDER DE 5 │
│ 340 REM HOOFDLOOP VOOR 10 VRAGEN │
│ 350 FOR A=1 TO 10 │
│ 360 LOCATE 7,10:PRINT "Vraag:";A │
│ 370 LOCATE 9,10:PRINT "Wat is de hoofdstad van: "; │
│ 380 Q(A)=FN RAND1:'---------------------> VARIABELE Q(a) KIEST EEN LAND │
│ 390 PRINT LAND$(Q(A)):'-----------> PLAATS EEN WILLEKEURIG GEKOZEN LAND │
│ 400 R=FN RAND2:'--> VARIABELE R (1 - 5) KIEST PLAATS HOOFDSTAD IN LIJST │
│ 410 REM GENESTE LOOP VOOR PLAATSING HOOFDSTEDEN IN LIJST$() │
│ 420 FOR B=1 TO 5 │
│ 430 LIJST$(B)=STAD$(FN RAND1) │
│ 440 IF B=R THEN LIJST$(B)=STAD$(Q(A)) │
│ 450 LOCATE B+8,50:PRINT B;"- ";LIJST$(B);SPACE$(10) │
│ 460 NEXT B │
│ 470 REM GENESTE LOOP TER VOORKOMING VAN DUBBELE STEDEN IN LIJST$() │
│ 480 FOR C=1 TO 5 │
│ 490 FOR D=C+1 TO 5 │
│ 500 IF LIJST$(C)=LIJST$(D) THEN B=0:GOTO 420:'HETZELFDE? OVERNIEUW! │
│ 510 NEXT D │
│ 520 NEXT C │
│ 530 LOCATE 16,16:PRINT "Toets (1,2,3,4 of 5)? "; │
│ 540 I$=INKEY$:IF I$="" THEN 540 │
│ 550 IF I$="" OR INSTR("12345",I$)=0 THEN BEEP:GOTO 530 │
│ 560 I=VAL(I$):'-----> Numerieke variabele I nodig voor verdere verwerking │
│ 570 LOCATE 16,16:PRINT "Uw antwoord: ";LIJST$(I); │
│ 580 IF LIJST$(I)=STAD$(Q(A)) THEN S=S+1:PRINT " is correct":GOTO 600 │
│ 590 SOUND 500,3:PRINT " is onjuist" │
│ 600 T=TIMER+1:WHILE T>TIMER:WEND:CLS:'----------------> Wacht een seconde │
│ 610 NEXT A │
│ 620 REM OVERZICHT VAN DE TIEN OPGAVEN - VOLGORDE IN ARRAY Q(10) │
│ 630 CLS │
│ 640 FOR A=1 TO 10 │
│ 650 LOCATE A,3 │
│ 660 PRINT "De hoofdstad van ";LAND$(Q(A));" is: ",STAD$(Q(A)) │
│ 670 NEXT A │
│ 680 REM DE UITSLAG │
│ 690 LOCATE 12,10:PRINT "U beantwoordde";S;"van de";A-1;"vragen correct" │
│ 700 END │
└────────────────────────────────────────────────────────────────────────────┘
K
l
e
u
r
e
n
Verreweg de meeste PC's zijn voorzien van een kleurenmonitor. Ongeacht de
grafische resolutie, kan elk kleurenscherm in de karakter-georiënteerde
mode (niet grafisch dus) een groot aantal kleuren weergeven.
Om het scherm karakter-georiënteerd te maken volstaat het commando:
SCREEN 0,0,0
dat zekerheidshalve ook vaak in de eerste regels van een niet-grafisch
programma wordt gegeven. De programmeur geeft dit commando voor het geval
het scherm nog grafisch staat ingesteld. In dat geval is het scherm:
SCREEEN 1 of 2 (CGA), SCREEN 9 (EGA) of SCREEN 12 (VGA).
De opdracht: SCREEN 0,0,0 doet niets als het scherm al karakter-georiënteerd
is maar het zet de grafische modus uit wanneer die aan mocht staan.
In elk geval staat in SCREEN 0 het commando:
COLOR x,x tot onze beschikking. De twee door een komma gescheiden x-jes zijn
waarden voor respectievelijk de voorgrond en de achtergrond.
In SCREEN 0 hebben we in totaal 32 (0 t/m 31) kleuren ter beschikking.
Simpel voorbeeld: Geef in SCREEN 0 de directe opdracht:
COLOR 14,0
en u krijgt gele (COLOR 14) tekens op een zwarte (0) achtergrond.
COLOR 10,0
geeft
groene
(10) letters op zwart maar het omgekeerde kan ook: zwarte
tekens op een groene achtergrond:
COLOR 0,2
┌─────┐
┌──────────────────────────────────┤
TIP
├──────────────────────────────────┐
│ └─────┘ │
│
Willen we een programma beginnen met een gekleurde achtergrond dan
│
│
volstaat:
│
│
│
│
COLOR 0,x:CLS
│
│
│
│
waarin x de achtergrondkleur van onze keuze is.
│
└───────────────────────────────────────────────────────────────────────────┘
Kleureffecten
De Colors 0 tot en met 15 kunnen we beschouwen als basiskleuren die de
kleuren van de regenboog omvatten, inclusief zwart (0) of onzichtbaar.
Voorbij Color 15 (fel wit) beginnen de
knipper
effecten. We kunnen tekens
in een bepaalde voorgrondkleur laten knipperen door bij de basiskleur 16 op
te tellen. Bij voorbeeld:
COLOR 26,0
laat groene tekst (Color 10 + 16) knipperen op een zwarte achtergrond.
Dit soort effecten wordt vaak toegepast om de aandacht van de gebruiker te
trekken als er een intoetsing van hem wordt verwacht zoals in:
<PgDn> volgende pagina
<F1> voor Help
<Esc> RUN Desktop.
Overdrijf knipperteksten nooit want dat maakt op de gebruiker een
vermoeiende en soms zelfs een weinig professionele indruk.
Hetzelfde geldt voor het gebruik van overdadige kleuren. Tekst in afwijkende
kleuren moet een functie hebben en dat geldt in bijzondere mate voor tekst
in diapositief (zwarte tekens op een witte of contrasterende achtergrond).
Met het commando: COLOR x,y bepalen we dus de voorgrondkleur met x.
Er kan nog een derde waarde aan worden meegegeven:
COLOR x,y,z
De waarde van z levert weer een ander effect op waarmee voorzichtig en
spaarzaam moet worden omgesprongen: de border of beeldschermrand. Deze
border tekent een kader in het uiterste gebied dat buiten het normale, met
LOCATE te adresseren gebied ligt. Enig geëxperimenteer in de directe
modus, zal verhelderend zijn: probeert het allemaal!
Samenvattend geldt dus:
COLOR x,y,z
waarin voor x (voorgrond) 16 kleuren plus 16 voor het knippereffect
beschikbaar zijn, voor y (achtergrond) 8 kleuren en voor z (border) weer
16 kleuren. Opgepast: Computers beginnen te tellen bij nul. De zestien
voorgrondkleuren lopen dus van 0 tot en met 15! Overigens is het effect
van de BORDER alleen zichtbaar bij CGA (Screen 1).
Lijnen en kaders
Herinnert u zich de ASCII-tabel? Hij komt in bijna elk computerboek voor
en in deze cursus is al een programmaatje gegeven dat deze belangrijke
tabel op het scherm zichtbaar maakt.
Deze tabel moet u als programmeur voortdurend bij de hand hebben. U zult
hem om de haverklap moeten raadplegen als u lijnen en kaders zichtbaar
wilt maken.
Moeilijk is het werken met lijnen niet. In de tabel ziet u bijvoorbeeld
dat de ASCII-waarde voor een liggend grafisch streepje 196 is. Dat
betekent dus dat:
PRINT CHR$(196)
dat streepje op het scherm zet.
Een reeks van 50 aansluitende 196-streepjes krijgen we met:
PRINT STRING$(50,196)
Een horizontale streep dus. Hoe krijgen we nu een verticale streep?
Precies: daar is een FOR/NEXT-loopje voor nodig:
FOR A=1 TO 10:PRINT CHR$(179):NEXT A
De streep, samengesteld uit CHR$(179), staat aan het begin van het scherm.
We zullen dus in de kringloop met LOCATE moeten werken om hem middenin het
scherm te krijgen:
FOR A=1 TO 10:LOCATE A,40:PRINT CHR$(179):NEXT A
Nu we horizontaal en verticaal lijnen kunnen trekken, kunnen we ook een
afgesloten kader middenin het scherm zetten. Daarvoor hebben we ook de
hoekjes nodig om de lijnen gesloten te krijgen. Deze vier hoekjes zoeken
we op in de tabel. Het zijn de ASCII-waarden: 218, 191, 192 en 217. Dit
wordt een kader:
┌──────────────────────────────────────────────────┐
│ 10 CLS │
Dat is toch nog vrij
│ 20 LOCATE 5,10 │
veel code voor een
│ 30 PRINT CHR$(218)STRING$(50,196)CHR$(191) │
simpel kadertje, vindt
│ 40 FOR A=6 TO 19 │
u niet? Toch loont dit
│ 50 LOCATE A,10 │
geprogrammeer de moei-
│ 60 PRINT CHR$(179) │
te want de presentatie
│ 70 LOCATE A,61 │
van uw programma wordt
│ 80 PRINT CHR$(179) │
er, vooral ook in com-
│ 90 NEXT A │
binatie met wel geko-
│ 100 LOCATE 20,10 │
zen kleuren, veel beter
│ 110 PRINT CHR$(192)STRING$(50,196)CHR$(217) │
door. Nevenstaand pro-
└──────────────────────────────────────────────────┘
grammaatje tekent een
enkellijns kader middenin het scherm.
Opdracht: Raadpleeg uw ASCII-tabel en pas het programma zodanig aan dat er
een dubbellijns kader ontstaat. Een zetje in de goede richting: het
dubbellijns horizontale grafische streepje is CHR$(205) en het verticale
dubbele lijnstukje is CHR$(186). De rest zoekt u zelf uit.
Variabele kaders
Als we in een programma veelvuldig van kaders van diverse omvangen gebruik
willen maken, kan dat programma zeer lang worden omdat voor een kader nogal
wat code nodig is. Dus..., denkt de creatieve programmeur, dan maak ik een
subroutine voor het maken van kaders van elke gewenste en mogelijke omvang.
De variabelen, die de vorm en de omvang bepalen worden vastgesteld vlak
voordat de subroutine geroepen wordt.
Kijk naar het voorbeeldprogramma en ga na welke de variabelen zijn:
1. De lengte van de horizontale streep.
2. De lengte van de verticale streep.
3. De lokatie van de linker bovenhoek.
4. De lokatie van de rechter bovenhoek.
We gaan nu een demootje maken dat de werking van een kader-subroutine laat
zien:
Eerst schrijven we het stukje programma dat
┌──────────────────────────────┐
om de variabelen komt vragen die we in de
│ 100 CLS:KEY OFF │
subroutine nodig hebben voor het tekenen
│ 110 LOCATE 1,1 │
van kaders met variabele breedten en hoog-
│ 120 INPUT "Regelnr. boven";RB│
ten.
│ 130 INPUT "Regelnr. onder";RO│
We zouden hier eigenlijk ook nog allerlei
│ 140 INPUT "Breedte";BR │
voorzieningen moeten inbouwen om onmoge-
└──────────────────────────────┘
lijke invoer af te vangen maar voor ons doel is dat niet nodig. Met de vanaf
het toetsenbord ingevoerde waarden voor de variabelen RB, RO, duiken we de
de subroutine in:
┌──────────────────────────────┐
│ 150 GOSUB 160:GOTO 110 │
└──────────────────────────────┘
┌──────────────────────────────┐
Regel 180 verdient onze bijzondere aan-
│ 160 REM VARIABELE KADERS │
dacht. Dit is een algoritme waarmee we
│ 170 SCREEN 0,0 │
voor de variabele P een positie op het
│ 180 P=(80-BR)/2 │
beeldscherm berekenen waardoor het te
└──────────────────────────────┘
tekenen kader altijd in het midden van het scherm komt te staan.
Nu komt de eigenlijke subroutine waarin ook het een en ander moet worden be-
rekend:
┌────────────────────────────────────────────────┐
Eerst wordt op de boven-
│ 190 LOCATE RB,P │
ste regel (RB) en op de
│ 200 PRINT CHR$(218)STRING$(BR-1,196)CHR$(191) │
in P berekende plaats
│ 210 FOR KADER=RB TO RO │
het hoekje geplaatst.
│ 220 LOCATE KADER+1,P │
Direct achter dit hoekje
│ 230 PRINT CHR$(179) │
komt de streep, bestaan-
│ 240 LOCATE KADER+1,BR+P │
de uit BR-1 streepjes
│ 250 PRINT CHR$(179) │
(CHR$(196). Dan wordt de
│ 260 NEXT KADER │
FOR/NEXT ingezet die de
└────────────────────────────────────────────────┘
verticale lijnen trekt.
Rest nog slechts de onderste kaderlijn inclusief de verbindende hoekjes
te tekenen:
┌───────────────────────────────────────────────┐
Type dit programma over en
│ 270 LOCATE KADER+1,P │
RUN het enkele malen. Geef
│ 280 PRINT CHR$(192)STRING$(BR-1,196)CHR$(217) │
ook 'onmogelijke' variabe-
│ 290 RETURN │
len op en BEGRIJP waarom
└───────────────────────────────────────────────┘
GWBASIC daartegen bezwaar
maakt met foutmeldingen.
┌─────┐
┌────────────────────────────────┤
TIP
├───────────────────────────────────┐
│ └─────┘ │
│
U doet er verstandig aan een puntkomma te plaatsen achter PRINT CHR$(179)
│
│
in regel 250 en zeker achter CHR$(217) in regel 280. Hiermee voorkomt u
│
│
dat er onderbroken kaderlijnen ontstaan wanneer grote kaders over de vol-
│
│
le breedte van het scherm worden getekend.
│
└──────────────────────────────────────────────────────────────────────────┘
Oproep en opgave
Het is de bedoeling dat het programma: Aardrijkskundeles wordt gepubliceerd
in de RUN van het Algemeen Dagblad. Als het door de geringe plaatsruimte in
de krant te lang wordt, gaat het in elk geval mee in een volgend RUN Flaga-
zine.
Trouwe cursisten die zich nu zo langzamerhand Programmeur mogen noemen,
geef ik hierbij een belangrijke opdracht: Kleed dit programma aan. Maak ge-
bruik van kaders en kleuren maar maak het niet te bont. U mag het program-
ma ook verder uitbreiden met meer landen en hoofdsteden als u wilt (en
als u kunt...!).
Weest kritisch op uzelf en op uw resultaat en wanneer u tevreden bent
vertrouw het programma dan aan een diskette toe en stuur het naar RUN. De
redaktie van RUN Flagazine zal dan een keuze uit de inzendingen maken en
het programma opnemen in het RUN-menu met vermelding van de naam van de be-
werker wanneer daar althans geen bezwaar tegen bestaat.
Plaatsing in RUN Flagazine wordt beloond met een boeken- of VVV-bon.
Aarzel niet, ga aan het werk en doe mee! Per slot van rekening hebt u niet
voor niets een PC aangeschaft!
Over uw diskette hoeft niet in te zitten: die krijgt u weer terug omdat we
de inzendingen direct overnemen in een aparte directory.
Ik ben zeer benieuwd of deze oproep iets oplevert. Het is tevens een test-
case om te bepalen of deze cursus GWBASIC al of niet moet worden voortge-
zet.
Inzendingen graag naar het vertrouwde adres waar ze met spanning worden te-
gemoet gezien
RUN Flagazine
GWBASIC-cursus
Postbus 338
2160 AH Lisse.
In de volgende les van deze cursus maken we ons eerste uitstapje naar gra-
fische commando's voor de SCREENS 1, 2 en 9. Ook gaan we het hebben over
het verschil tussen de interpreter en de compiler en gaan we na wat de
nieuwe BASIC van Microsoft: QBASIC werkelijk waard is.
Tot over een paar maanden...