'Programma Lingo versie 5
'
'Dit is een programma in de reeks van beginnersartikelen
'in het tijdschrift PC-Active, van april 1993.
'Copyright 1993 (C) Herman Wind.
'
'Dit programma kiest willekeurig een woord van 5 letters
'uit een reeks. U wordt daarna gevraagd dit woord te raden.
'Als het goed is wordt dat gemeld op het beeldscherm.
'
'Dit is de vijfde versie van het programma.
'Met DATA-regels, met slechts dertig woorden.
'Het antwoord wordt beoordeeld op:
'het aantal goede letters en het aantal goed geplaatste letters.
'In kleur geel wordt weergegeven welke letter goed geplaatst is,
'en in cyaan welke letter aanwezig is in het woord.
'Met RANDOMIZE TIMER wordt de toevalsfaktor vergroot.
'Veel meer routines staan nu als SUBprocedures in het programma.
'U kunt ze in de gewone listing op het beeldscherm alleen
'zien als u met <F2> of via <View> in de menubalk de SUBs
'gaat bekijken.
DEFINT A-Z 'Alle numerieke variabelen worden als integer behandeld.
DECLARE SUB s.Controle ()
DECLARE SUB s.EersteLetter ()
DECLARE SUB s.GeefLettersWeer ()
DECLARE SUB s.Gelijk ()
DECLARE SUB s.Goed ()
DECLARE SUB s.Invoer ()
DECLARE SUB s.IsNietGoed ()
DECLARE SUB s.IsGoed ()
DECLARE SUB s.Kopje ()
DECLARE SUB s.Raamwerk (Links, Rechts, Boven, Onder)
DIM SHARED Raad$, ToetsWoord$, Beurt
DIM SHARED Gelijk$(5), Goed$(5)
Hoeveel = 30 'Het aantal woorden waaruit gekozen kan worden.
CLS 'Het beeldscherm wordt schoongemaakt.
DIM LingoWoord$(Hoeveel) 'Wanneer het aantal in te lezen woorden groter
'is dan 10 moet de waarde gedimensioneerd
'worden. `Hoeveel' geeft aan hoeveel woorden
'in het geheugen moeten worden opgeslagen.
FOR Aantal = 1 TO Hoeveel 'Binnen deze lus
READ LingoWoord$(Aantal)'wordt de array ingelezen.
NEXT Aantal
RANDOMIZE TIMER 'Toevalsfaktor afhankelijk van TIMER.
COLOR 2 'Kleur groen
s.Kopje 'SUB: Zet in kader LINGO op het scherm.
Toeval = INT(RND(1) * Hoeveel) + 1 'Het toevalsgetal wordt gekozen.
ToetsWoord$ = LingoWoord$(Toeval) 'Dit is het gekozen woord uit de array.
'PRINT ToetsWoord$ 'Deze regel moet u verwijderen!
'Anders weet men direkt het woord:
'Tijdens ontdekken van het programma
'is deze regel handig.
s.Controle 'SUB: Het controlevakje wordt op het
'scherm gezet, waarin de antwoorden
'worden beoordeeld.
s.EersteLetter 'SUB: Eerste letter van het te raden
'woord wordt genoteerd.
DO
Beurt = Beurt + 1
s.Invoer 'SUB: invoerroutine.
s.Gelijk 'SUB: welke letters zijn goed en gelijk?
s.Goed 'SUB: welke letters zitten in het woord
' maar op de verkeerde plaats?
LOCATE 9 + Beurt, 21 'Op een relatieve plaats
PRINT Raad$ 'wordt het ingetikte woord neergezet.
s.GeefLettersWeer 'SUB: de gelijke en de goede letters
' worden respectievelijk in geel
' en cyaan afgedrukt.
s.IsGoed 'SUB: Controle of Raad$ in zijn geheel goed is.
IF Raad$ = ToetsWoord$ THEN EXIT DO
IF Beurt = 10 THEN s.IsNietGoed 'SUB: afhandeling na 10 fouten.
LOOP UNTIL Beurt = 10
END
'Deze reeks met gegevens moet natuurlijk worden aangevuld!
DATA kerst, korst, polen, troef, kopen
DATA schip, schop, schep, ratel, basic
DATA actie, kamer, halen, strop, maken
DATA kreng, tafel, laken, beter, boter
DATA ander, water, wezen, haven, loper
DATA leren, verte, kamer, jager, kopje
SUB s.Controle
COLOR 14
s.Raamwerk 36, 78, 9, 13
LOCATE 10, 39
PRINT "Geel gekleurde letters zijn goed."
LOCATE 12, 39
PRINT "Ze staan op de goede plaats."
COLOR 3
s.Raamwerk 36, 78, 16, 20
LOCATE 17, 39
PRINT "Cyaan gekleurde letters staan wel in"
LOCATE 19, 39
PRINT "het woord, maar op een andere plaats."
COLOR 14
s.Raamwerk 4, 16, 9, 20
COLOR 3
s.Raamwerk 18, 29, 9, 20
COLOR 7
END SUB
SUB s.EersteLetter
LOCATE 10, 21: COLOR 14 'In de kleur geel
PRINT LEFT$(ToetsWoord$, 1) 'wordt de eerste letter van het
COLOR 7 'te raden woord weergegeven.
END SUB
SUB s.GeefLettersWeer
FOR Keer = 1 TO 5
LOCATE 9 + Beurt, 6
PRINT "Beurt";
IF Beurt < 10 THEN PRINT " ";
PRINT Beurt;
IF Goed$(Keer) <> "" THEN
LOCATE 9 + Beurt, 20 + Keer
COLOR 3
PRINT MID$(Raad$, Keer, 1);
ELSE
IF Gelijk$(Keer) <> "" THEN
LOCATE 9 + Beurt, 20 + Keer
COLOR 14
PRINT MID$(Raad$, Keer, 1);
END IF
END IF
COLOR 7
NEXT Keer
END SUB
SUB s.Gelijk
FOR Keer = 1 TO 5 'Per Keer worden de waarden bijgesteld.
Gelijk$(Keer) = ""
Goed$(Keer) = ""
'Vergelijking van de letters.
IF MID$(Raad$, Keer, 1) = MID$(ToetsWoord$, Keer, 1) THEN
Gelijk$(Keer) = MID$(ToetsWoord$, Keer, 1)
END IF
NEXT Keer
END SUB
SUB s.Goed
FOR Keer = 1 TO 5
plaats = INSTR(ToetsWoord$, MID$(Raad$, Keer, 1))
IF plaats AND MID$(ToetsWoord$, Keer, 1) <> Gelijk$(Keer) THEN
IF MID$(ToetsWoord$, plaats, 1) <> Gelijk$(plaats) THEN
Goed$(Keer) = MID$(ToetsWoord$, Keer, 1)
END IF
END IF
NEXT Keer
END SUB
SUB s.Invoer
DO 'Invoer op de invoer.
LOCATE 6, 10
COLOR 14
PRINT "Tik een woord in van 5 letters";
PRINT " "
COLOR 3
s.Raamwerk 50, 65, 5, 7
LOCATE 6, 55
PRINT "_____"
LOCATE 6, 53
INPUT Raad$
COLOR 7
PRINT
IF Raad$ = "stop" THEN END
LOCATE 8, 10
IF LEN(Raad$) <> 5 THEN
PRINT "Uw woord moet precies 5 letters lang zijn!"
SLEEP 1
ELSE
FOR Maal = 1 TO 5
Vlag = 1
Ascigetal = ASC(MID$(Raad$, Maal, 1))
IF Ascigetal < 97 OR Ascigetal > 122 THEN
PRINT "Gebruik de kleine letters van a tot z!"
Vlag = 0
SLEEP 1
EXIT FOR
END IF
NEXT Maal
END IF
SLEEP 1
LOCATE 8, 10
PRINT STRING$(42, " ")
LOCATE 6, 53
PRINT " "
LOCATE 6, 53
LOOP UNTIL LEN(Raad$) = 5 AND Vlag = 1
END SUB
SUB s.IsGoed
IF ToetsWoord$ = Raad$ THEN 'Het goede woord is geraden.
COLOR 14 'Kleur geel
s.Raamwerk 13, 40, 21, 23
LOCATE 22, 17
COLOR 28 'Knipperend rood
PRINT "Geraden in"; Beurt;
IF Beurt = 1 THEN
PRINT "beurt!";
ELSE
PRINT "beurten!"
END IF
COLOR 7
END IF
END SUB
SUB s.IsNietGoed
COLOR 14 'Kleur geel
s.Raamwerk 13, 60, 21, 23
LOCATE 22, 19
PRINT "Niet geraden! Het woord was: ";
COLOR 28
PRINT ToetsWoord$
COLOR 7
END SUB
SUB s.Kopje
'Kopje op het scherm
s.Raamwerk 3, 78, 1, 3 'Tekent een kader op het scherm.
LOCATE 2, 11
PRINT "L I N G O L I N G O L I N G O L I N G O L I N G O"
END SUB
SUB s.Raamwerk (Links, Rechts, Boven, Onder)
LOCATE Boven, Links
PRINT CHR$(201)
LOCATE Boven, Rechts
PRINT CHR$(187)
LOCATE Onder, Links
PRINT CHR$(200)
LOCATE Onder, Rechts
PRINT CHR$(188)
FOR Vertikaal = Boven + 1 TO Onder - 1
LOCATE Vertikaal, Links
PRINT CHR$(186);
LOCATE Vertikaal, Rechts
PRINT CHR$(186);
NEXT Vertikaal
Horizontaal = Rechts - Links - 1
Horiz.lijn$ = STRING$(Horizontaal, 205)
LOCATE Boven, Links + 1
PRINT Horiz.lijn$
LOCATE Onder, Links + 1
PRINT Horiz.lijn$;
END SUB