|
Post by Marco Kurvers on Feb 28, 2024 20:08:32 GMT
Probeer onderstaande code uit. Je kunt het wijzigen door op te geven hoeveel beurten. Je kunt het programma ook uitbreiden door te kiezen of de medespeler (computer) het moet raden of andersom. Gebruik in beide spellen de scheidsrechter voor controle verkeerde invoer.
'*** Medespeler het getal laten raden ***
keer = 10 beurt = 1 input "Geef een getal: "; getal 'er is niet alleen een medespeler maar ook een scheidsrechter (computer)
do do raadgetal = int(rnd(1) * 25) print "Beurt: "; beurt; ". Mijn getal is: "; raadgetal; "." input "Heb ik het goed? "; antwgeraden$ if upper$(antwgeraden$) = "JA" and raadgetal <> getal then 'scheidsrechter meldt print "Het was niet geraden: computer mag nog een keer in dezelfde beurt." end if if upper$(antwgeraden$) <> "JA" and raadgetal = getal then print "De computer heeft het wel geraden." antwgeraden$ = "" end if loop while upper$(antwgeraden$) = "JA" and raadgetal <> getal if raadgetal <> getal then beurt = beurt + 1 end if loop while beurt < keer and raadgetal <> getal
if raadgetal = getal then print "Hoera! Ik heb het geraden in "; beurt; " beurten." else print "Jammer, ik heb het niet geraden." end if
|
|
gaslouk
New Member
Hi from beautiful Greece .
Posts: 16
|
Post by gaslouk on Feb 29, 2024 7:51:19 GMT
Hi from beautiful Greece.
'*** Have the other player guess the number *** global number, adviceNumber, turn
[start] time = 10 turn = 1 input "Enter a number between 1 and 25: "; number 'there is not only a fellow player but also a referee (computer) do do adviceNumber = int(rnd(1) * 25 + 1) print "Turn: "; turn; ". My number is: "; adviceNumber; "." input "Am I correct? "; antwgeraden$ 'Referee reports
if upper$(antwgeraden$) = "yes" and adviceNumber < number or adviceNumber > number then end if if upper$(antwgeraden$) <> "yes" and adviceNumber = number then antwgeraden$ = "" end if loop while upper$(antwgeraden$) = "yes" and adviceNumber <> number if adviceNumber < number or adviceNumber > number then turn = turn + 1 end if call apot loop while turn < time and adviceNumber <> number
[exit] flags = _MB_ICONQUESTION OR _MB_YESNO
calldll #user32, "MessageBoxA", _ 0 as long, _ "Are you sure you want to end the game?" as ptr, _ "Exit" as ptr, _ flags as long, _ Result as long
'Result returns : 1=ok 2=cancel 3=abort 4=retry 5=ignore 6=yes 7=no if Result = 6 then END end if if Result = 7 then goto [start] end if
sub apot if adviceNumber = number then print "Ask! I guessed it "; turn; " rounds." else print "Too bad, I didn't guess." end if end sub
Regard
Gaslouk.
|
|
|
Post by Marco Kurvers on Mar 2, 2024 9:43:34 GMT
Hi Gaslouk,
Sorry, I hadn't thought of writing it in English. Your listing works well, but answering YES or NO doesn't work. That's because with the UPPER$ function, you accidentally check the string for lowercase letters. The referee does work if you check the strings for capital letters.
For the next week, I make a new beginners listing.
Greetings.
|
|
|
Post by frizhd on Jul 9, 2024 9:57:07 GMT
Mag het ook zo ? Misschien wat ouderwets? Savenaam$="1RaadGetal9jul24.bas"
'Dit is een speelse variant op een allereerste BASICversie uit 1964 'van FrizHD, zie 'https://www.dartmouth.edu/basicfifty/basicmanual_1964.pdf 'https://retrofun.pl/2023/12/18/was-basic-that-horrible-or-better/
PRINT : PRINT "Raad een geheel GETAL tussen de 1 en 100 "
G = INT (RND(1)*100) + 1 ' 'PRINT "Getal "; G keer=1 'tel de keren dat je raad
[start] INPUT "-Kies een getal ?";A$ A=INT(VAL(A$)) IF A=0 THEN GOTO [sluit] PRINT "Je koos ";A IF A = G THEN PRINT: PRINT "Goed geraden in ";keer ;" keer" : PRINT "Compliment hoor!" : GOTO [einde] IF A < G THEN PRINT "Het is te klein" IF A > G THEN PRINT "Het is te groot" keer=keer+1 PRINT GOTO [start]
[sluit] INPUT "Stoppen ja=j ?";A$ A$=UPPER$ (A$) IF A$ <> "J" THEN GOTO [start] PRINT: PRINT "De volgende keer beter je best doen !" [einde] PRINT PRINT "Aantal keer raden ";keer PRINT "Het getal was ";G PRINT : PRINT "Tot ziens !" PRINT : PRINT "EINDE" END
|
|
|
Post by frizhd on Jul 9, 2024 10:02:08 GMT
De editor van freeforums past af en toe de spelling aan ALS A = G DAN moet natuurlijk zijn IF A = G THEN
|
|
|
Post by frizhd on Jul 12, 2024 13:19:06 GMT
60jaar geleden deden die ouwe makkers het zo. Leesbaar in je eigen taal met een beperkt aantal Engelse termen. Geen onbegrijpelijke accolades, brackets, ducktyping, iteraties, of ongewone, dubbelzinnige leestekens, geheime codes, vreemde afkortingen, telegramstijl of morse dingen. Iedereen moest het kunnen begrijpen vonden John Kemeny en Thomas Kurtz. BASIC werd de oertaal toen de persoonlijke computer, de muis en heel veel dingen nog niet eens bestonden. Hoogstandjes lieten ze aan anderen over. Verbeteraars kwamen vaak in een slangenkuil terecht. Hou het toch zo eenvoudig mogelijk, maar niet simpeler dan strikt noodzakelijk. Democratisering met een moeilijk woord. Dat was het. Ja toch? Of niet dan?
100 REM-RAADSPEL 110 120 PRINT "RAAD HET GETAL TUSSEN 1 EN 100." 130 140 LET X = INT(100*RND(0)+1) 150 LET N = 0 160 PRINT "UW RAAD"; 170 INPUT G 180 LET N = N+1 190 IF G = X THEN 300 200 IF G < X THEN 250 210 PRINT " TE GROOT, RAAD NOG EENS" 220 GOTO 160 230 250 PRINT " TE KLEIN, RAAD NOG EENS" 260 GOTO 160 270 300 PRINT "U RAADDE HET, IN "; N; " KEER PROBEREN" 310 PRINT "EEN ANDER SPEL (JA = 1, NEE = 0)"; 320 INPUT A 330 IF A = 1 THEN 140 340 PRINT "BEDANKT VOOR HET SPELEN" 350 END
|
|
|
Post by memophenon on Jul 19, 2024 9:22:49 GMT
Mooi compact pleidooitje van frizhd voor eenvoud. Dan valt het programma dat eronder staat eigenlijk een beetje tegen. Bijvoorbeeld die raadselachtige haakjes in regel 140. Ik neem voorlopig maar aan, dat alles wat ertussen staat minder belangijk is. En die 0 na RND, da's helemaal niks, super onbelangrijk dus. Klinkt logisch in elk geval. Ik zie ook een hoop vreemde afkortingen (geheime codes?) staan: X, INT, RND, N, G en A. En het geheel is toch echt in telegramstijl geschreven. Er staat geen woord te veel in, iets dat ik juist wel kan waarderen.
|
|
|
Post by Marco Kurvers on Jul 19, 2024 13:30:07 GMT
Tja, zo waren de variabelen namen vroeger. Allemaal in één of twee letters geschreven.
INT is een functie, vandaar de haakjes. De functie is nodig om de willekeurige getallen als gehele getallen te krijgen. De 0 bij de functie RND mag ook een ander getal zijn, zoals 1 of 6. Sommige BASIC dialecten kennen alleen een RND zonder een waarde, maar in andere BASIC dialecten en versies, o.a. Liberty BASIC, moet een getal worden meegegeven aan de RND functie.
|
|
|
Post by memophenon on Jul 19, 2024 21:39:48 GMT
Bedankt voor deze uitleg, Marco Kurvers. Ik denk dat ik het nu wel een beetje doorheb. Alleen bij het volgende BASIC-programma uit 1968 begrijp ik nog niet helemaal wat zich daar afspeelt. Er is kennelijk sprake van vier of vijf functies, namelijk V, D, FNA en twee (?) naamloze functies. Laatstgenoemde bevinden zich op regel 30, en hebben als argument I-1 resp. J-1. Dat zijn waarschijnlijk de geheime codes waar frizhd het over had.
10 DIM V(1000) 20 MAT READ D(3) 30 DEF FNA(I,J,K) = ((I-1)*D(2) +(J-I))*D(3) + K 50 FOR I = 1 TO D(l) 60 FOR J = 1 TO D(2) 70 FOR K = 1 TO D(3) 80 LET V(FNA(I,J,K)) = I+2*J+Kt2 90 PRINT V(FNA(I,J,K)), 100 NEXT K 110 NEXT J 112 PRINT 115 PRINT 120 NEXT I 900 DATA 2,3,5 999 END Verder zie ik drie geneste FOR-NEXT-constructies. Zijn dat niet de verfoeide iteraties?
|
|
|
Post by Marco Kurvers on Jul 20, 2024 10:02:32 GMT
Ik zal de code eens doornemen.
10 DIM V(1000) 20 MAT READ D(3) 30 DEF FNA(I,J,K) = ((I-1)*D(2) +(J-I))*D(3) + K 50 FOR I = 1 TO D(l) 60 FOR J = 1 TO D(2) 70 FOR K = 1 TO D(3) 80 LET V(FNA(I,J,K)) = I+2*J+Kt2 90 PRINT V(FNA(I,J,K)), 100 NEXT K 110 NEXT J 112 PRINT 115 PRINT 120 NEXT I 900 DATA 2,3,5 999 END
Regel 10 is een dimensie. het aanmaken van een array van 1001 elementen. De range is van 0 .. 1000.
Regel 20 wordt niet in alle BASIC dialecten en versies herkent. Ik denk dat MAT een commando is, dat verteld om 3 getallen te lezen uit regel 999. Je zou de regel kunnen vervangen met een lus, zie hieronder.
20 FOR R = 1 TO 3 24 READ D(R) 27 NEXT R Merk op dat D een array is, maar nergens met DIM wordt aangemaakt. Eén dimensie arrays met een range van 0 .. 10 kunnen zonder DIM worden gebruikt.
Regel 30 is een definitie van een A functie. FN betekent FuNction. Zo werden vroeger één regel functies geschreven. De I, J en K zijn de parameters van functie A.
De regels 50, 60 en 70 zijn inderdaad iteraties. Uit de DATA regel kun je dus zien dat de I lus van 1 t/m 2 itereert, de J lus van 1 t/m 3 itereert en de K lus van 1 t/m 5 itereert.
Regel 80 is een oude toekenning met het LET commando. Al lange tijd is het commando niet meer nodig. De expressie daarna is niet juist. Er is een klein typfoutje gemaakt. De letter t moet een operator zijn (+, * of wat dan ook). Er is geen Kt2.
Merk op in regel 80 en 90 dat de A functie als element in de V array wordt aangeroepen.
De regels daarna zijn verder bekend. Je weet nu dat regel 900 samenwerkt met het READ commando in regel 20.
|
|
|
Post by memophenon on Jul 20, 2024 16:54:09 GMT
In regel 80 is inderdaad iets fout gegaan bij het kopiëren vanuit een PDF. De t moet een pijltje omhoog ( ↑) zijn. Zal wel machtverheffen betekenen, wat tegenwoordig vaak met een dakje ( ^) wordt aangegeven. In regel 50 zit nog zo'n kopieerfoutje: het moet geen D(l) (met kleine letter L) maar D(1) zijn. Dat een uitdrukking tussen haakjes nadere informatie voor zowel de voorafgaande functie als het voorafgaande array kan bevatten, is me nu ook duidelijk. Bij regel 30 heb ik echter nog steeds vraagtekens. Laat ik dat hier maar even letterlijk doen: 30 DEF FNA(I,J,K) = ?(?(I-1)*D(2) +?(J-I))*D(3) + K Ieder vraagteken representeert een onzichtbare functie, dacht ik (drie voorkomens, niet twee, zoals ik in mijn vorige post beweerde). Maar nu weet ik dat het dus ook een onzichtbaar array kan zijn. Welke van de twee is het nu precies? Ik kan beide mogelijkheden laten werken. Met functie FNZ: 10 DIM V(1000) 11 DEF FNZ(X) = X 20 FOR R = 1 TO 3 24 READ D(R) 27 NEXT R 30 DEF FNA(I,J,K) = FNZ(FNZ(I-1)*D(2) + FNZ(J-1))*D(3) + K 50 FOR I = 1 TO D(1) 60 FOR J = 1 TO D(2) 70 FOR K = 1 TO D(3) 80 LET V(FNA(I,J,K)) = I+2*J+K^2 90 PRINT V(FNA(I,J,K)), 100 NEXT K 110 NEXT J 112 PRINT 115 PRINT 120 NEXT I 900 DATA 2,3,5 999 END En met array Z: 10 DIM V(1000) 11 FOR R = 0 TO 5 12 READ Z(R) 13 NEXT R 20 FOR R = 1 TO 3 24 READ D(R) 27 NEXT R 30 DEF FNA(I,J,K) = Z(Z(I-1) * D(2) + Z(J-1)) * D(3) + K 50 FOR I = 1 TO D(1) 60 FOR J = 1 TO D(2) 70 FOR K = 1 TO D(3) 80 LET V(FNA(I,J,K)) = I+2*J+K^2 90 PRINT V(FNA(I,J,K)), 100 NEXT K 110 NEXT J 112 PRINT 115 PRINT 120 NEXT I 899 DATA 1,2,3,4,5,6 900 DATA 2,3,5 999 END
Toen ik in mijn eerste post schreef "Er staat geen woord te veel in", meende ik dat echt. Weglating van LET maakt de code minder expliciet, en daarmee minder begrijpelijk voor de niet in magische formules ingewijde lezer. Slecht idee. Beter dan LET was misschien de formulering van AppleScript geweest: 80 SET V(FNA(I,J,K)) TO I+2*J+K^2
Het FOR-statement valt evenzo te verbeteren tot: 50 FOR I FROM 1 TO D(1) Op die manier is het isgelijkteken tenminste niet dubbelzinnig meer en geheel in overeenstemming met wat we op de basisschool hebben geleerd.
|
|
|
Post by Marco Kurvers on Jul 21, 2024 8:19:58 GMT
Ik denk dat er geen functies hoeven te staan. De haakjes zorgen alleen voor een prioriteit in de expressie. Hebben er in de originele code ook vraagtekens gestaan of gewoon de haakjes? Zoals ik van jou begrepen heb stonden er dus vraagtekens. Wat er dan zou moeten staan zou ik niet weten, maar de extra functie die alleen maar de waarde van X teruggeeft zal niet de bedoeling zijn.
|
|
|
Post by memophenon on Jul 21, 2024 10:32:50 GMT
Nee, die vraagtekens heb ik zelf toegevoegd, om aan te geven waar ik een functienaam had verwacht, en later, na jouw uitleg, als mogelijk alternatief een arraynaam. Maar er stond dus helemaal niets. Vandaar dat ik (geïnspireerd door de geheime codes waar frizhd gewag van maakte) dacht aan verborgen componenten. Misschien heb ik mijn hoofd door hem op hol laten brengen en moet ik niet gelijk overal een complot in zien.
Dat van die prioriteiten heb ik vroeger bij wiskunde ook wel gezien. Daar werden behalve ronde haakjes bovendien teksthaken en accolades bij gebruikt, zodat je beter kon zien wat bij wat hoorde. Maar die mogen van frizhd niet meer. Niet zo erg hoor, uiteindelijk werkt het met alleen ronde haakjes in principe op dezelfde manier. Ik begin nu steeds meer te geloven dat we het bij die losstaande haakjes in regel 30 inderdaad in die richting moeten zoeken.
Het betekent wel, dat ronde haakjes in Dartmouth BASIC drie (en misschien nog wel meer) functies hebben en dus tot de categorie 'dubbelzinnige leestekens' behoren. Daarmee heeft de taal inmiddels vier strafpunten opgelopen: (1) iteraties, (2) dubbelzinnige leestekens, (3) vreemde afkortingen en (4) telegramstijl. Hoe is Dartmouth BASIC door frizhd's ballotage gekomen? Omdat het zo glansrijk aan het morsecodecriterium voldeed? Ik moet de eerste programmeertaal nog tegenkomen die wèl morsecode bevat.
|
|
|
Post by frizhd on Jul 28, 2024 10:26:31 GMT
Laten we niet twisten om des keizers baard en maak je niet druk over een haakje meer of minder. Het mag en kan allemaal in Vrijheids-BASIC met zijn fakkel als symbool. De ‘editor’ van Carl Grundel corrigeert je heus wel als dat met die () nu nog te moeilijk voor je is. BASIC is sterk verbeterd. Probeer de beginners variant JustBASIC om je elementaire kennis wat te bij te spijkeren. Kost helemaal niks en is voor iedereen bereikbaar. Zelfs geschikt voor de Friese Taal. Een goed alternatief voor al die moeilijke woorden, dikdoenerij, anglicismen en ‘Irregulaire Expressies’. Om mee te beginnen al op de basisschool. Een kind kan de was doen.
|
|
|
Post by Marco Kurvers on Jul 28, 2024 21:33:59 GMT
Inderdaad Friz. Haakjes kunnen zelfs de leesbaarheid verbeteren. Je mag zelfs een voorwaarde in een IF ... THEN statement tussen haakjes gebruiken. Geeft helemaal niks en het werkt gewoon.
|
|