Dette har norsk tekst men selve
programmet er på engelsk.
[[[Note february 14, 2011: a translation of this
kidpop01 into an english version is to be
released and called kidpop02.
This is stored as .htm instead of .txt at
norskesites.org/fic3 and moscowsites.org/fic3
because the Internet official convention on
writing norwegian ethnic letters rather is
used here, for ease of browsing, instead of
the way which involves B9NORW.ZIP which is
indeed how this Big Art Booklet published
in 2010 (cfr News about Aristo Tacoma section
about B.A.B.) was written. The release of this
text in free electronic form is unusual since
these B.A.B.'s are for sales, but reflects
increased demand for tutorial material of f3
NOTE THAT THE GAME HERE DISCUSSED IS
WRITTEN PRIMARELY FOR THE SAKE OF HOW
IT LOOKS AS A PROGRAM, RATHER THAN
BY COMPETING ON THE LOOKS OF THE RESULT.
IT IS SUPPOSED TO TEACH HOW TO WRITE
GAMES YOURSELF THAT ARE MUCH, MUCH BETTER! ;)
HERE ARE LINKS TO THE COMPLETED GAME:
http://www.norskesites.org/fic3/SUPERBT.TXT
AND THE SAME,
http://www.moscowsites.org/fic3/SUPERBT.TXT
COPYRIGHT AND FURTHER REDISTRIBUTION RIGHTS,
IN EDUCATIONAL SETTINGS GOOD:
www.yoga4d.org/cfdl.txt
Screen copies from game generated by CTR-F5
in Dosbox on an Asus laptop running Microsoft
Windows 7 in 2011, using fullscreen mode,
frameskip=18, but it can be just as well run
in all sorts of other ways, and in the future,
the frameskip=18 is not necessary. Dosbox
provides a uniform glamorous shielding from
the fluctuating layers of a security-issue-
ridden internet, where we run this standard
warp-friendly programming language with its
always fixed, standard syntax, so that your
games and other apps will really be performable
in the future. The Dosbox is relatively safe
from various security issues but note that
it can be configured to respond to internet
networking so you should always be aware of
natural security issues in using any computer
which is connected to any network.
Note -- I haven't quite said this earlier
on in the update page on f3, that on the
Dosbox, in fullscreen mode anyway, the caps
lock key has to be pressed several times
rapidly in order to be switched back and forth,
sometimes. Use B9 in fullscreen mode with F12
clicked for cruise mode writing deep beautiful
meditative thoughts. -- A.T., february 14, 2011]]]
Aristo Tacoma
***VELKOMMEN TIL LISA PROGRAMMERING
Bind 1, 2d spill i Lisa GJ2 FIC3
[[[These BIG ART BOOKLETS by Yoga4d von Reusch Gamemakers
(in size more like a book, but in text pleasingly short, like
booklets) are typeset in the B9 font created by Aristo Tacoma
and available as part of the norskesites.org/f3 package.
The pages have print on one side to allow use as notebooks.
Cateory (fiction, nonfiction), subcategory,
and number of pages should be at the the backcover.
Illustrations by author unless other clearly indicated.
The BIG ART BOOKLETS cover all areas of life, fiction as
nonfiction. Cfr also the website www.yoga6d.org.
Publisher: Yoga4d von Reusch Gamemakers,
Holmenv 68, 0376 Oslo, Norway.]]]
First published 2010. Regular print-on-demand production.
Questions? atiroal@yoga6d.org. Content, illustrations,
and font are copyright Aristo Tacoma, but font can be
utilized by others when acknowledgement is clearly given.
FORORD AV FORFATTEREN
Bokheftet er skrevet i tekstbehandlingen B9, en del av
programmeringsspråket f3 -- en forkortelse for Lisa GJ2
Fic3, og tilgjengelig på www.norskesites.org/f3. PCen
skal være svårt rask for å kjøre Dosbox-versjonen,
som anbefales, fordi den har høy grad av skjerming
fra alt som kan være av virus og net-sikkerhets-.
spørsmål. Programmeringsspråket er gratis og
gir bedre trening i essensiell logisk tenkning enn alle
andre tilnærminger, etter denne forfatterens helt
uhildete mening (har selv laget språket).
Dette heftet er bra for begynnere.
I planlagte bind i denne serien forklares bl.a.
hvordan bruke det åpne programmet -- skrevet i F3 --
som heter LIGHT3D.TXT til å bygge egne 3D spill
via programmering som bruker LIGHT3D som bibliotek
av bakgrunnsprogrammer egnet for visse typer
spill som stimulerer hjernen uten å virke
avhengighetsskapende, med første-hånds bruk av
impresjonistisk grovkornet oppløsning (som
stimulererer egen fantasi).
***
Vi skal lage et spill og det skal hete SUPERBT! Hele
heftet er vevet rundt oppbyggingen av dette enkle 2D
spill slik at de som er nydelige debutanter, totale
begynnere i programmering vil være -- langt på vei
ihvertfall -- suverene mestere etter å ha bladd litt i
dette heftet. Eller mer presist, nilest den om og om
igjen sammen med svettedryppende øvelser foran
computeren.
***
Skaff deg Lisa på din datamaskin, hvis du har en som er
rask nok, eller standard nok. Se her: norskesites.org/f3
-- med kopier av alle filene her: moscowsites.org/f3.
Vi trenger bruk av tekstbehandling for å skrive,
fikse på, og videreutvikle vårt SUPERBT program. En
del av mitt programmeringsspråk er tekstbehandlingen
B9. Uttalt be-nine, eller: benign, altså velgjørende.
Denne tekstbehandlingen stimulerer hjernen garantert.
Har masse erfaring med at den virker slik. Alt jeg gjør
med tekster gjør jeg på denne, stort sett. Den er
leken i bokstavene, enkel i funksjonene, og likevel ikke
så over-forenklet at den "overtar" skriveprosessen.
Lær deg den. Du starter opp F3 [igjen, se siste side
hvis du ikke vet hvordan gjøre det], og skriver
B9
og vips! du har tekstbehandlingen. Press CTR-S for å
lagre etter du har skrevet, ESC-tasten for å forlate
den. Lek rundt inntil du forstår den. Jeg antar at du
har tilbrakt de dager som trengs med B9 som
tekstbehandling før du leser videre, at du kan litt om
hvordan flytte tekster, at du kan bruke F1 eller CTR-O
for å åpne, CTR-F eller F4 for å finne, at du har
funnet ut noen av hemmelighetene ved CTR-C eller INS for
å begynne å markere, og (etter flytting av
tekstmarkøren), samme tast igjen for å indikere at du
er ferdig med å markere. CTR-V eller F5 innsetter
teksten et nytt sted, og kan brukes gjentatte ganger.
CTR-Y eller CTR-INS kan brukes til å sette inn blanke
linjer. CTR-J eller F8 kan brukes til -- noe du som
programmerer bør merke deg med ekstrem interesse -- å
hoppe direkte til et bestemt linjenummer. Linje nummer 1
er første linje i teksten, nummer 2 er andre linje, og
når det er en skrivefeil, som er svært vanlig i
programmering, vil dette noen ganger plukkes opp av F3
(som jeg sier fra nå av, som forkortelse for Lisa GJ2
Fic3 programmeringsspråk) og den vil fortelle deg
hvilken linje du vil glede F3 ved å se litt nærmere
på. De vanskeligste feilene er de der man har skrevet
noe som er "grammatisk" rett, men som blir kokelimonke
for den dumme, pene, fine datamaskinen å prøve å
utføre. Det er her det hjelper å lage programmet
langsomt, linje for linje kanskje, og teste hver gang du
utvider -- hvertfall hvis du er det minste usikker. Da
vi du automatisk vite, når datamaskinen blir til et
gedigent spørsmålstegn, at det var nettopp den siste
utvidelsen som den ikke forstod.
***
Vårt spill skal hete
:SUPERBT B9
eller mer presist, det skal hete SUPERBT.TXT, og ved å
starte opp F3 og skrive det der som begynner med kolon
og fortsetter (uten noe mellomrom) til ordet SUPERBT,
kommer du rett inn i (den kanskje blanke tekst, hvis du
ikke allerede har laget en fil som heter dette)
dokumentet, og kan rette på det, tilføye, og slikt.
Jeg har en ide om spillet som jeg utvikler "sammen med
med deg" -- jeg skriver, du leser og tenker med meg og
programmerer din PC mens jeg programmerer min PC, og
resultatene utvikler vi kapittel for kapittel,
SUPERBT.TXT blir en kanon av et spill. [Jeg har kikket
litt på noen ulike mobil-telefon-spill fra Nokia for å
hente ideer til hva som er egnet for begynnere å lage
av 2D spill, og noe som het Snake Xenia eller lignende
-- som også finnes i andre versjoner, med andre navn --
syntes meg å være mest rett på sak som enkelt 2D
brettspill med visse forførende anlegg -- dette er
altså en slags inspirasjonskilde, selv om jeg regner
med at mens vi begynner å programmere dette, uten at
jeg har spillet spesielt friskt i hukommelsen, vil det
som vi her kaller SUPERBT bli en god del annerledes
også. Uansett, takk Nokia!]
Det blir masse repitisjoner her. Og der er BRA. Du
skal jo tross alt lære deg et nytt språk. Fire-fem
repitisjoner av noe i løpet av et par dager gjør at
det begynner å bli del av hva din hjerne har lett for
å fremkalle. Det er hundrevis av trekk ved F3 vi skal
få på plass. Det har ingen hensikt å levere med
ferdige programfiler slik at du slipper tasting. Taste
skal du gjøre, hvis du skal programmere, og lære
hvordan programmere. Men likevel skal jeg ikke gjøre
SUPERBT unødig stort. Og hvis du lærer deg
touch-tasting og samtidig lærer deg å bruke B9
effektivt med kopiering og liming, og det er forbausende
mange små tricks man kan lære seg selv med de få
kommandoer B9 tilbyr, vil du feie over disse øvelser
elegant. Du er, m.a.o., en elegant begynner!
***
SUPERBT: Det er et spill som har et slags brett knyttet
til seg, hvertfall starter vi der. Du kan jo også
videreutvikle dette etter at heftet er lest. En god
regel knyttet til programmer som videreutvikles er at du
i et kommentarfelt i begynnelsen av programmet beskriver
temmelig tydelig og temmelig inngående hva du har
hentet hvorfra, og når din egen videreutvikling er
laget, slik at andre ser hva som er laget før hva, og
at det hele virker og faktisk er lovlig og alt det. Se
på www.yoga4d.org/cfdl.txt for en noe tørr
lisens-tekst for deling til offentligheten av programmer
-- også programmer som selges for penger. La det være
sagt at denne SUPERBT.TXT som presenteres her i heftet,
[med Nokia-inspirasjonen nevnt og videreført hvis du
bruker programmet i andre sammenhenger] er gratis men
slik at den bruker yoga4d.org/cfdl.txt lisens for
videreføring av programmet. Altså, du har full rett
til videreutvikling av programmet hvis du gir videre den
opprinnelige versjon av programmet, med korrekte navn og
alt slikt. Dette er et visst plunder men det gir en
majestetisk aura når du vet at du har det formelle i
orden, at du forholder deg lovlig til kildekoder. Dette
inspirerer andre til å gjøre det samme.
***
Når du skal lære deg F3, trenger du å vite hvilke ord
som er innebygd i F3, og hvilke ord vi definerer oss
frem til som del av programmeringen, -- der vi bygger
på innebygde ord. Det er min erfaring at ved å ha en
skarp kontrast der ordene vi selv føyer til er svært
lekende og fantasifulle -- sogar noen ganger inn i det
absurde -- vil sinnet plukke opp hvilke ord som er fast
del av F3 fortere. Husk at datamaskinen bare mottar
instruksjoner, den driver ikke med tolkning av de
bokstav-rekker vi kommer med. Enten er ordet en kjent
instruksjon, eller så er det totalt ukjent -- det er
ingen egentlig mellomting her, selv om det går an å
lage programmer som gjetter en del. Men i bunn og grunn
er datamaskinens CPU -- dens Central Processing Unit,
dens maskinelle hjerne -- nøyaktig slik som F3 --
nemlig at enten er instruksjonen gjenkjent, eller så er
den overhodet ikke gjenkjent. Gjenkjennes den, vil den
bli utført. Gjenkjennes den ikke, kommer en feilmelding
eller noe slikt. Det er ingen vanlig mental fortolkning
utover dette.
***
Altså, du skriver, etter å ha started F3,
:SUPERBT B9
og setter igang. Vi skal ha noe vist på skjermen og vi
kan bruke en rutine, et innebygget ord, som heter RECT
for dette, en forkortelse, naturligvis, for 'rectangle'.
Vi trenger å pakke dette litt inn, noen ord foran og
noen ord etter det, noen ord for å gi navn til hele
programmet, noen ord for å starte det opp. Dette blir
straks et ritual, når du har vært gjennom det tyve
ganger, og et hyggelig, inspirerende og kreativt ritual.
Men det virker totalt kryptisk på en total begynner og
i slike tilfelle skal man fortelle seg selv, om og om
igjen, at etterhvert kjenner jeg dette herre her igjen
og etterhvert gir det mer og mer god mening og god, klar
følelse. Det er repitisjonen som gjør at det blir
familiært. Jeg kan godt gi deg en myte, en forklaring,
til hvert eneste uttrykk men det bare forlenger hele
arbeidet, la oss heller bare være tøffe og tålmodige
nok til å godta nye fraser, der jeg påpeker det
viktigste, og påpeker mulige forandringer, og forøvrig
viser til andre tekster så som manual for utdypning.
På denne måten vil vårt felles arbeide med å lage
dette spill sparke unna.
Få disse ordene her på plass. Gidd nøyaktighet --
du kan f.eks. sette inn to blanke (tabulator-tast) foran
hver tekstlinje som skal ha innrykk, og to ekstra
blanke, når det trengs ekstra innrykk. Dette er en
vakker, dansende, poetisk stil for å skrive programmer,
selv om PCen vil fungere bra også uten slik estetikk i
innskrivingen. Skriv det med store bokstaver, selv om
sm/ også fungerer bra. Pass på at når noen tegn
hører sammen, så som (LET eller OK), at de fortsetter
å høre sammen, og ikke blir til noen slikt som ( LET
eller OK ). Der det allerede er en blank, kan det
generelt være flere blank, i noen tilfeller også
linjeskift.
En ting til: i B9 er CTR-W noe som skrur av og på
såkalt Wordwrap. Denne bør skrus av når du
programmerer, for linjene trenger ekstra lengde uten at
det skal gå ut over linjene under med noen plutselig
wordwrap. Den er normalt skrudd av når du går inn i
B9, men du kan sjekke ved å presse CTR-W en eller to
ganger for å finne ut hvilken tilstand -- modus -- B9
befinner seg i, når det gjelder wordwrap.
Skriv dette, lagre, og i neste avsnitt forklarer jeg
hvor enkelt det er å teste det lille program vi har
skrevet. Husk at repitisjon lager familiaritet, og at
dette er langt viktigere i begynnelsen enn noen
analytisk forståelse av hvert komponent:
(LET SUPERBT BE (( ))
((
(( GJ-ON ))
(( 100 ; 100 ; 400 ; 400 ; 1
=> RECT ))
(( A-KEY ))
(( GJ-DONE ))
)) OK)
(LET AUTOSTART BE SUPERBT OK)
***
Jeg håper du er anatomisk våken, tantrisk våken, det
gjør at din hukommelse tar opp ny viktig kunnskap
fortere. Lek med assosiasjoner. Det var ved god lek at
(( )) ble til som en ganske heftig, dryppende
assosiasjon.. som en symbolsk kraft som skal strømme
gjennom dataspråket for alltid. Lisa's lepper. Greit?
Start programmet ditt. Programmet heter SUPERBT, filen
heter SUPERBT.TXT, og dette er normalt lagret automatisk
med store bokstaver uansett om du skriver store eller
små bokstaver inn i B9.
Start opp F3 og skriv, med store bokstaver for
sikkerhets skyld, hver gang du bruker den følgende
kommando, med det enkle, positive, korte ord IN:
:SUPERBT IN
Hvis du har syntaktisk -- grammatisk, altså -- alt
helt super-perfekt vil du se et kvadrat risset inn på
skjermen, som fjernes når du taster en vanlig tast, og
da takker programmet for seg. Hvis du har skrivefeil ta
deg endelig tid til å smile over den høflige meldingen
som dataspråket kommer med, og vit at uansett hvor
hyper-proff man er som programmerer, er skrivefeil en
del av leken, og du skal motstå impulsen til å
irritere deg over det. Vit at enkle, dumme feil såvel
som kompliserte feil er noe som datamaskinen vil melde
til enhver programmerer på ethvert nivå, og det er en
øvelse for din gentleman-verdighet / ladylike-eleganse
at du tar disse meldingene uten å rynke pannen.
Fiks på hver linje inntil programmet funker.
Forresten, skriv
XO
for å komme deg ut av F3. Det skulle jeg kanskje ha
sagt før. Men det er særlig lurt når det er en
skrivefeil, at programmet kastes ut av dataminnet, som
og/sa er RAM, og dette kalles også, knyttet til dette
språket, for RAM-REFRESH, og det skjer automatisk når
programmet lukker seg ELLER at du skriver XO når du er
inne i F3.
Så hvis det er en skrivefeil, vil programmet enten
gjøre at maskinen må skrus av og på, og det kan ta en
hel del tid, eller -- mer normalt -- det vil bli en
feilmelding, enten en som knytter seg til et linjenummer
eller en som bare gjør at programmer slutter uventet --
og hvis du får en pen og pyntelig melding med
linjenummer, det er da du skal taste XO, og presse
linjeskift. Så starter du F3 igjen, og skriver den
vanlige
:SUPERBT B9
der du hopper til den aktuelle linje -- kanskje med
CTR-J -- særlig når programmet er langt og du får en
melding om at noe underlig skjer på linje 235 eller
lignende.
Denne opplevelsen av hvordan takle feil er så viktig
å bli vant med at hvis du gidder, sleng inn noen
skrivefeil med vilje for å lære deg å takle det!
Eller, hvis du var så heldig at du hadde noen
skrivefeil med en gang, slipper du å legge dem inn med
vilje. Du ser, uansett hva du gjør når du
programmerer, lærer du av det, hvis du gir
oppmerksomhet til det. Akkurat som i livet.
***
Noen ville kanskje mene -- et høyst diskutabelt
synspunkt, etter min mening -- at vårt fantastiske
spill ikke er ferdig ennå. At vi burde utvikle det
videre. At det er noe ved spill som innebærer denne
merkelige oppfinnelse som heter BEVEGELSE. Jaja, vi får
gå videre, da.
Jeg har sett spill der man må utnevne seg enten til
nybegynner, en smule viderekommende, eller
ultra-ekspert. Og for alle andre enn ultra-eksperten, er
det ikke den samme gleden ved å score poenger. Jeg
synes vi skal gå rett på sak og lage et mer universelt
opplegg. Vanskelighetsgraden ved dette spillet kan
simpelthen knyttes til hastigheten. Man er nødt til å
være rask med fingrene hvis hastigheten er stor for at
spillomgangen skal ha nok varighet til at man kan samle
mange poenger -- vi skal sørge for en slik mekanisme.
Men aller først, la oss legge et eller annet inn i
rammen, slik at den ser en smule mer tiltrekkende ut.
Kanskje et ord eller to. I neste avsnitt skal vi arbeide
litt med bevegelse, jeg har noen ideer, det blir nok
endel linjer som må legges inn men kommer vi oss
gjennom disse, er vi godt igang med å få kontakt med
F3 språket som helhet, og det blir enkelt å få
bevegelsen inn i vårt oppkommende 2D spill SUPERBT.
Friskt mot, opp med :SUPERBT B9 igjen og, med
blikket festet klart mot målet om å gjøre deg kjent
med ord og uttrykk og fraser i F3 gjennom repitisjon, og
med mindre fokus akkurat nå på analytisk forståelse,
tast inn disse ekstra linjene, slik at det nye, utvidete
programmet blir som følger (de 4 første linjene er
kommentarfelt, inne i }* .. }*, og syntaksen der
vil ikke bli forsøkt dekodet av maskinen -- pass på å
finne frem krølleparentes-tegnet }, heller enn det
vanlige parentes-tegnet, ellers blir det snodige
meldinger fra F3 om at det hele er litt vanskelig å
tyde. F3 er enkel i hva den godtar, og denne enkelheten
er en del av utviklingen når du skal oversette noe
fra den dansende meningshorisonten til levende sinn og
oversette til det som gir mening for maskin, for å si
de slik:
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3 }*
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING. }*
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt }*
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010) }*
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( ))
((
(( :@@@@@@@@SUPERBT!!! ; 120 ; 150
=> B9-POP ))
(( :@@@FIGHT_WELL! ; 120 ; 200
=> B9-POP ))
(( :@@@SCORE_MUCH! ; 120 ; 250
=> B9-POP ))
)) OK)
(LET SUPERBT BE (( ))
((
(( GJ-ON ))
(( 100 ; 100 ; 400 ; 400 ; 1
=> RECT ))
(( BEAUTIFUL-CONTENT-OF-FRAME ))
(( A-KEY ))
(( GJ-DONE ))
)) OK)
(LET AUTOSTART BE SUPERBT OK)
***
Du vet kanskje -- hvis du ikke vet det, vet du det snart
-- etter du har lest denne setningen, mener jeg -- at
Sherlock Holmes var av den oppfatning, slik den ble
uttrykt til Dr Watson, at det var ofte de uviktige
sakene som var mest interessante og lærerike. Slik er
det også med programmering. Legg mål-middel tenkning
til side, akkurat når du lærer Lisa GJ2 Fic3, verdens
beste programmeringsspråk, og skru på den lekende
holdning, som ubekymret og selvsikkert danser med dette
hav av merkelige symboler. Se etter snodige fiffigheter,
merk deg pussige kombinasjoner. Denne leken er ekstremt
nyttig men la ikke nyttegraden være av bekymring --
bortsett fra, et sted i bakhodet eller i magefølelsen,
kan det være greit å ha arkivert at du blir smartere,
penere, flinkere, mer kreativ, mer intuitiv, mer
analytisk, morsommere, og i det hele tatt bedre anlagt
til å få mer ut av hver dag og flinkere også i
business, ved å arbeide med Lisa GJ2 Fic3, eller F3,
som vi sier som forkortelse. Det styrker din nerver, det
gir en kontakt med essensideer om harmoni, og i denne
verden er mind-over-matter en realitet, så dermed
påvirker det også ditt utseende. Derfor, legg
mål-middel tenkning vekk. Det er ingenting mer egnet
som middel til all verdens interessante mål, på lang
sikt, enn at du vekker opp din F3 nerve.
Vi må ha noe inn knyttet til hastighet, altså. Jeg
tror at vi skal gi litt meldinger i ny og ne, under den
firkanten, og etter at meldingen har vært avlevert,
skal den utviskes slik at skjermen er pen og blank og
fin. Dette er egnet til å gi litt ekstra tanke helt i
begynnelsen. Du la kanskje merke til at (LET .. OK)
samlet en beskrivelse av SUPERBT i den første versjonen
vi hadde av programmet: og at i den siste, finner vi
ogs/ en (LET .. OK) høyere opp i programmet. Denne har
et langt navn med binde-streker imellom, noe fleipende,
og det er akkurat slike navn vi gjerne bruker her når
vi vil understreke at akkurat dette elementet -- til
forskjell fra f.eks. B9-POP, som er et innebygget ord
for å skrive ut på skjermen (poppe ut i B9-fonten
min), -- akkurat dette lange elementet med morsomt navn
og mange bindestreker er totalt selvvalgt. Du kan skrive
akkurat hva du vil der, bare det ikke har mellomrom i
seg, og ikke for mange underlige tegn -- hold deg til
ABCDEFGHIJKLMNOPQRSTUVWXYZ og 0123456789 stort sett.
Men hvis du bytter ut navnet med noe annet, gjør det
systematisk. Bytter du ut navnet der, bytter du det
navnet ut på akkurat samme måte alle andre steder i
programmet. Der kan CTR-F (eller funksjonstasten F4)
hjelpe deg med å søke frem alle forekomstene -- når
du har et program over flere sider, og CTR-L gjentar
siste leting etter noen bokstaver (der CTR-U velger
av/på når det gjelder Uppercase-test, slik at normalt
vil programmet gi blaffen i om ordet er skrevet med
store eller små bokstaver, men noen ganger betyr det
mye å kunne differensiere og da kan du presse CTR-U
før første gang du søker).
Så, for å klare hjernen med hensyn til vår neste
utvikling, la oss late som om programmet allerede har
denne funksjonen med at hastigheten kan angis, og la oss
sørge for -- på en måte som vi kan lett bruke senere
og/sa -- skrive en fin melding under rammen, som om vi
var kommet mye lengre i programmeringen. Igjen, bare la
gjentagelser være måten du lærer på, la de ord som
gir mening gi mening, men la ikke de ord hverken i
programmet eller i det jeg sier i disse avsnitt være
til bekymrning hvis de ikke gir full mening de første
gangene du arbeider med dette bokhefte. Etterhvert blir det
lekende og lett. Og det vil alltid være noen
formuleringer som er så tvetydige at de ikke vil gi
total enkel mening uansett hvor mye du har arbeidet med
F3.
Brett opp skjorten, arbeid med å få SUPERBT.TXT,
gjennom kommandoen :SUPERBT B9 tastet inn, til å
bli ganske nøyaktig, men ikke nødvendigvis helt
nøyaktg, dette følgende.
Vet du hvordan du kan kopiere ditt eksisterende,
velfungerende program over til et annet navn, eller over
til en midlertidig lagringsplass? Kan være greit å
finne ut etterhvert. Noen ganger føles det lettere å
gå videre med eksperimentative endringer av et program
når du vet at du alltids kan gå tilbake til den
versjonen som fungerte bra for noen minutter siden bare
ved å flytte en fil eller skifte dets filnavn.
Bare ville nevne det. Backups er programmererens venn.
I det neste program brukes krøllete parentes -- den
som ser slik ut: }
Du vet kanskje at hvert tastatur har tre typer
parenteser:
(vanlig parentes)
[hakke-parentes.]
ækrølle-parentes.}
Skal du gi en melding til spilleren eller brukeren --
interaktøren, hva vi nå enn kaller den smilende, søte
personen som arbeider med ditt program -- deg selv!? --
som inneholder mellomrom, f.eks. en setning, trenger vi
å fange opp hele setningen. Hvis det bare er et ord,
eller et uttrykk uten mellomrom, så som @@@@SUPBERT!,
holder det med et kolon foran. Du ser kanskje i
programmet det står noe slikt som :@@@@SUPBERT der.
Men hvis vi skal gi en hel setning, m} vi bruke en
annen metode, en som forteller hvor begynnelsen er, og
hvor setningen fullføres, slik at datamaskinen vet hvor
den skal se etter den neste kommando. Vi vil jo
forhindre at den forsøker å dekode en engelsk setning
som om det var en F3 kommando. Du har allerede sett
kommentarer, }* dette er kommentarer }* og du vil nå se
at }en setning kan legges inn slik}. Hvis den hadde hatt
f.eks. den lave streken (hyphen) istedenfor mellomrom
kunne du lagt den inn slik:
:strek_setninger_kan_legges_inn_slik
Når setningen er lagt inn, er den tilgjengelig
for F3 kommandoer, slik som B9-POP. Du kan legge inn
flere setninger på toppen av hverandre, som en haug av
noe på et bord -- der det du legger på toppen av
haugen (the stack) blir det som plukkes først av F3.
Bare nevner dette i farten, ikke viktig akkurat nå.
Her er den neste versjon av programmet:
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3 }*
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING. }*
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt }*
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010) }*
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
((
(( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL ))
)) OK)
(LET TELL-SOMETHING-GOOD BE (( ; ))
((
(( ; 120 ; 550 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
((
(( ; 120 ; 600 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
((
(( ; 120 ; 650 => B9-POP ))
)) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( ))
((
(( :@@@@@@@@SUPERBT!!! ; 120 ; 150
=> B9-POP ))
(( :@@@FIGHT_WELL! ; 120 ; 200
=> B9-POP ))
(( :@@@SCORE_MUCH! ; 120 ; 250
=> B9-POP ))
)) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( ))
((
(( }Dear master of this game!} =>
TELL-SOMETHING-GOOD ))
(( }Please press lineshift, wait a little,} =>
TELL-SOMETHING-GOOD-SECOND-LINE ))
(( }and press it again, to indicate game speed.} =>
TELL-SOMETHING-GOOD-THIRD-LINE ))
(( A-KEY ))
(( A-KEY ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( }Thanks! Lineshift to begin} =>
TELL-SOMETHING-GOOD ))
(( }Have courage! Be brave! Win win win!}
TELL-SOMETHING-GOOD-SECOND-LINE ))
)) OK)
(LET SUPERBT BE (( ))
((
(( GJ-ON ))
(( 100 ; 100 ; 400 ; 400 ; 1
=> RECT ))
(( BEAUTIFUL-CONTENT-OF-FRAME ))
(( GET-A-WONDERFUL-SENSE-OF-TIMING ))
(( A-KEY ))
(( GJ-DONE ))
)) OK)
(LET AUTOSTART BE SUPERBT OK)
Husk at du kan bruke CTR-C .. CTR-C og deretter CTR-V
for å kopiere lange ord, slik at de blir presist, på
prikken, uten en bokstav endret. Lange ord -- et "ord" i
F3 sammenheng betyr omtrent hva som helst som ikke
begynner med et tall og som ikke har mellomrom i seg.
Komplett identitet er viktig i programmering. Denne
firkantetheten skjerper hjernen, gir bedre forståelse
av forskjell på hva et ord betyr, og hvordan det
skrives, og alt slikt.
Husk at dette programmet taler mer enn det gjør, i
dette avsnittet. Programmet er ganske overraskende
villig til å ta imot timing -- men det er bare
tilsynelatende. Selve timing-greia, der vi skal innføre
en ny og vidunderlig størrelse som heter "variabler",
som beskrives gjennom formen ((DATA .. )), i neste
avsnitt -- den timing-dingsen er ikke på plass akkurat
i dette avsnittet. Men programmet later som om den er
på plass, for å inspirere til tenkning, for å få en
følelse av hvor vi skal gå hen med det.
Dette ordet A-KEY dukker opp stadig. Det betyr: la F3
vente med videre utføring av akkurat dette programmet
inntil f.eks. linjeskift eller en annen tast (a key) is
pressed. Denne er grei når en melding er gitt, og hva
som helst av vanlige taster kan presses for å gå
videre. Men når vi trenger mer nøyaktig avlesing av
tastaturet, det våre seg for timing eller for mer
konkret informasjon, har vi andre ord -- dvs., andre
kommandoer, og jeg kan -- bare for gjentagelsens skyld,
for at disse ord skal bli del av det vi gjør oss kjent
med, uten at jeg forklarer dem her, nevne at blant disse
mer presise kommandoer er KEY, KEYNUM, KEYTOUCH, og for
hele linjer, B9-READLN. Det er noen flere også når vi
ikke klarer oss med bokstav- og tall-staturet men må bruke
funksjonstaster så som F1 og F12 (bl.a. FKEYNUM). Og
når vi skal lage noe som avleser musepekerens posisjon
trenger vi ord som SHOWMOUSE eller FEET, UNSHOWMOUSE
eller FT (disse er synonymer), i tillegg til MOUSEXY og
MOUSECLICK og slikt -- jeg skriver dette nå etter
hukommelsen, men i praksis sjekker jeg f.eks. med
manualen eller med noen av mine veldig mange tidligere
programmer når jeg bruker slike ord, slik at det ikke
blir alt for mye av en ren hukommelses-prøve. Men det
er greit å ha en anelse om hvilke ord som finnes, før
man leter etter dem.. ;)
I dette 2D programmet skal vi klare oss med
bokstav-tastaturet, det er lett for deg, hvis du fikser
etterhvert en bra forståelse av dette program, å
begynne å leke med musepeker-program f.eks. ved å
studere noen av de innebygde programmer i F3-pakken,
og raskt utvikle forståelse. For alt i F3 er bygget
over samme lest. Forstår du hovedessensene, kan du
arbeide stort sett med hvilken som helst del av F3 helt
enkelt.
I neste avsnitt vil programmet faktisk klare å fange
opp timingen, ved at vi innfører en variabel som vi
kaller for TICKET -- ordet er inspirert av ideen om at
en klokke "tikker", f.eks. en gang hvert sekund, og at
denne "tikkingen" i dette spill har noe å gjøre med en
slik tick. Vi skal ogå bruke ordet til å lage en slags
aperitif, et lite glimt, for å få spilleren til å bli
kjent med den timingen som spilleren velger -- og dette
gir oss samtidig en sjanse til å sjekke om vi fikk
dette til sånn noenlunde bra.
***
øvelse gjør mester. Sleng inn disse utvidelsene når
orker, og se frem til å teste programmet. Hvis det ikke
fungerer, vær ubekymret. Let etter tullete småfeil. En
liten endring av semikolon til kolon eller omvendt, et
for mye mellomrom det det overhodet ikke skal være noe
mellomrom -- alle slike syntatiske småting er det som
er nuts and bolts for datamaskinen. Det er her det
menneskelige sinn strekker seg langt, langt utover det
et slikt enkelt F3 program er: men nettopp i denne
kontrast, er det et hav av innsikt å hente.
Datamaskinen smiler til deg så snart du har syntaksen
rett, og programmet er vel gjennomtenkt -- den tilgir
absolutt alt, fort, så snart du har rettet opp feilene.
Den bærer ikke nag. Den er, i en viss forstand, en sann
meditatør. Men den levende intelligens krever ikke
syntaks av denne type for forstålelse. Dermed føler du
også mestring, du lar maskinen jobbe for deg, med dine
instruksjoner, mens du lener deg tilbake og iakttar hva
det er du har satt igang. Dette er en lekestue som gir
deg en sinnsro som er god, så lenge som du husker på
at mennesker er når seg uendelig rike sammenlignet med
slike spørsmål om syntaks. Det er også av denne grunn
jeg har lagt inn en skrivefeil allerede i overskriften
av mine ukentlig-eller-oftere økonomiske kommentarer,
der det står -- "can contacted at" -- heller enn "can
be contacted at", og at jeg generelt aldri retter feil
dersom det er lesbart og forståelig for levende sinn.
Dette er en frihet som det er ekstra deilig å ta seg
når du samtidig har en pekepinn om hva riktig
skrivemåte er.
Her er neste versjon. Husk backup av forrige, hvis du
gidder.
Denne har stadig ingenting av selve spillet, men den
har hyggelige meldinger, som slettes (RECTFILL), og den
har en god del tall som ikke er annet enn
plasseringstall på skjermen -- horisontalt er det 1024
punkter, og loddrett 768 punkter. B9-POP skriver ut på
betingelse at du slender inn to slike tall, vannrett
1..1024 først, deretter vertikalt 1..768. RECTFILL
fyller et rektangel fra x1 y1 til x2 y2 der x1 y1 er
starten av øvre venstre hjørne, normalt, mens x2 y2 er
nedre høyre hjørne, og x er bokstaven vi noen ganger
bruker for uformelt å snakke om den vannrette mengden
punkter, y den loddrette mengden punkter. Det spiller
ingen rolle nå å forstå noe av dette, jeg bare ville
ha nevnt at disse tallene er bare en veldig valgfri
plassering av tekstene her og der på skjermen.
Vi skal snakke mer om det som det er viktig å snakke
om, bare la de kommentarene jeg kom med gli inn i
bakgrunnen av ditt sinn. Du har full mestring av hvert
trinn simpelthen ved å få dette programmet tastet inn,
testet det, ved :SUPERBT IN og rettet det hvis du
har skrevet det annerledes enn det står her. Det kan
tenkes at det er kommet inn noe feil i denne boken men
dette har jeg sjekket ganske grundig for hver gang jeg
har satt inn programmet. Skulle det være noen
kopieringsfeil fra min side, som ikke er fanget opp
innen heftet trykkes, vil det trolig ikke være verre enn
at det er skrevet riktig i neste avsnitt igjen. Husk
også at hvis du bruker B9 til å rette på disse
programmene, bruker du et program som bruker ALLE disse
funksjonene hele tiden, og det tyder på at din F3
virker helt fantastisk bra. Ha derfor lite bekymring,
bare rett på programmet til det fungerer. Hvis selv
etter nitidig sammenligning med det som står her i
heftet det ikke virker, i dette kapittel, ta for deg
programmet i neste kapittel (eller avsnitt, for å være
mer presis), og skriv det inn langsommere, fra
begynnelsen. Er det en bokstav du konsekvent taster
feil, eller et tegn? Ta deg tid, rett, du skal få det
til, og alt slikt ekstra arbeid med programmet gir
ekstra hukommelse av hvordan lage programmer i F3, slik
at du kan lage programmer hurtigere i fremtiden. Altå
er det ikke noe bortkastet tid med dette.
Husk: For å sette inn blanke linjer, plasser
tekst-markøren på linjen over, og press CTR-Y fulgt av
antall linjer du vil sette inn, deretter linjeskift!
(Eller CTR-R for å fjerne 1 eller flere linjer.)
It's a bit much to type in, please spend the extra
time you need to get it really, really accurate. I
promise this is what your learning process wants; and
there are masses of things to pick up from this
program, and which the subconscious part of your mind,
even if you are a beginner in this, is already
sorting out and analysing and all that. So it is worth
spending time with. The understanding will come,
by various activities we engage in together
in the upcoming paragraphs, and by your own
further playing along with examples and manual
and other books on your own later on. All this
works together. So DO please spend time with this
-- to get it up in your own B9 session, and to
test it. Good luck! IT'LL TAKE TIME -- but then
you'll get SO near a real game, it is just urging you
on automatically. I'll give some quick comments
in the beginning of the next paragraph about
what some of the new features are all about, to
make the learning of it all come faster. Now, here:
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3 }*
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING. }*
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt }*
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010) }*
((DATA TICKET ))
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
((
(( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL ))
)) OK)
(LET WIPE-CLEAR-GAME-BOARD-AREA BE (( >N1 ))
((
(( 101 ; 101 ; 399 ; 399 ; N1 => RECTFILL ))
)) OK)
(LET TELL-SOMETHING-GOOD BE (( ; ))
((
(( ; 120 ; 550 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
((
(( ; 120 ; 600 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
((
(( ; 120 ; 650 => B9-POP ))
)) OK)
(LET GET-A-GOOD-TICKET-TO-RIDE BE (( ))
((
(( 100000 TICKET <<ASSERT ))
(( 1,000,000,000 => RICH
(COUNT
(( KEYTOUCH
(MATCHED
(( N1 TICKET <<ASSERT ))
(( RMS RMS ; EXIT ))
MATCHED) ))
COUNTUP) ))
)) OK)
(LET USE-THE-TICKET-TO-TRAVEL-FAR BE (( ))
((
(( TICKET >>>
(COUNT
(( N1 => >N1 ))
COUNTUP) ))
)) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( ))
((
(( :@@@@@@@@SUPERBT!!! ; 120 ; 150
=> B9-POP ))
(( :@@@FIGHT_WELL! ; 120 ; 200
=> B9-POP ))
(( :@@@SCORE_MUCH! ; 120 ; 250
=> B9-POP ))
)) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( ))
((
(( }Dear master of this game!} =>
TELL-SOMETHING-GOOD ))
(( }Please press lineshift, wait a little,} =>
TELL-SOMETHING-GOOD-SECOND-LINE ))
(( }and press it again, to indicate game speed.} =>
TELL-SOMETHING-GOOD-THIRD-LINE ))
(( A-KEY ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( GET-A-GOOD-TICKET-TO-RIDE ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( }Thanks! Lineshift to begin} =>
TELL-SOMETHING-GOOD ))
(( }Have courage! Be brave! Win win win!}
TELL-SOMETHING-GOOD-SECOND-LINE ))
)) OK)
(LET SHOW-FUN-AT-FOUR-TIMES-THE-SPEED BE (( ))
((
(( TICKET >>> ; ))
(( ; TICKET >>> ; 4 => DIV
TICKET <<ASSERT ; ))
(( ; 3
(COUNT
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*YOU ARE ELECTRIC!*} ; 110 ; 350 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*EEEELLLECTRIC!!!*} ; 175 ; 250 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*ELECTRICITY!*} ; 220 ; 110 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 128 => WIPE-CLEAR-GAME-BOARD-AREA ))
COUNTUP) ; ))
(( ; TICKET <<ASSERT ))
)) OK)
(LET GET-ON-WITH-THE-GAME BE (( ))
((
(( A-KEY ))
)) OK)
(LET SUPERBT BE (( ))
((
(( GJ-ON ))
(( 100 ; 100 ; 400 ; 400 ; 1
=> RECT ))
(( BEAUTIFUL-CONTENT-OF-FRAME ))
(( GET-A-WONDERFUL-SENSE-OF-TIMING ))
(( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( GET-ON-WITH-THE-GAME ))
(( GJ-DONE ))
)) OK)
(LET AUTOSTART BE SUPERBT OK)
***
Have you got it work? Then, congratulations! You see
that once we have got timing in, or duration as it also
can be called -- the word 'duration' is quite intense in
meaning if you go to philosophical writings, by the way
-- once we got such stuff in, anyway, it starts getting
having a sense of life to it.
That is to say, if you spend a little time getting the
timing right. You just have to experiment, get the knack
of it. I tried out a couple of alternatives before I
decided on knocking off three-quarters of the pause when
I put those 'you are electricity' joke texts raising
upwards, to the right, inside the board area, three
times. For if they are so slow that one starts getting a
bit irritated at their slowness, then one is not giving
the pep the game ought to give to the person who is
about to play. So this is about tuning of timing.
I'll briefly comment on various features so that you
can easier pick up more and more understanding of what
is going on, forming your own concepts, getting your own
idea of what this programming is all about.
But let me say something practical: since the program
is now getting into considerable amount of lines, I am
going to discipline myself from next paragraph and
onwards, and group each change of the program inside a
commentary line about like this:
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*}
..
..
}* ***NEW PART OF PROGRAM ABOVE HERE**** }*
Hopefully, there will be just one or a few such parts
each time. That includes both new lines, and changed
lines. You'll have good use of CTR-Y to insert lines and
sometimes CTR-R to remove lines just in those sections,
in other words, to progress from one paragraph to the
next, concerning your SUPERBT.TXT,
-- whoops, jeg gjorde det igjen, skriver på Engelsk
når jeg skal skrive norsk. Jeg antar at du kan tilgi
meg, og jeg lar det stå, akkurat som mine elskelige
skrivefeil. Uansett, det jeg skulle til å si var at
når du gjør disse endringene av din SUPERBT.TXT, pass
på å lagre den forrige versjonen. Dermed, hvis det
blir helt umulig skrullete feil når du prøver den nye
versjonen, kan du alltids gå tilbake til den forrige
versjonen, og legge til noen få linjer av gangen,
langsomt, og se hvordan det går.
Det er et ord -- COMPILEPAUSED og et annet,
COMPILEPAUSEDALITTLE -- i tillegg til ordet
VISIBLECOMPILATION -- som kan slenges inn i begynnelsen
av ditt program om hele din PC plutselig slokner mens du
kompilerer et program. Da vil du kunne se hvilken linje
som programmet er kommet til, før PCen trenger reboot,
-- COMPILEPAUSED er langsommere enn CompilePausedALittle
-- og VISIBLECOMPILATION gjør at linjene vises, en
etter en, mens syntaksen til hver linje du har skrevet
blir gjort synlig. Flere slike ord står i manualen.
Forresten har jeg ikke satt inn ordet LOOKSTK ennå.
Det er en god ide, i neste utgave vil (( LOOKSTK ))
stå her og der. Dette ord sjekker om det er tastet et
tall utenfor (LET .. OK) som ikke er koplet til noe, som
bare er blitt liggende, eller om det er skrevet den ene
delen av et uttrykk, f.eks. (MATCHED, uten at den
fullførende del av samme uttrykk -- f.eks. MATCHED) --
er tatt med. Da blir det liggende litt rot på "bordet"
-- the stack -- og LOOKSTK eller "pls look at the stack"
gir da en melding om hvilken linje som programmet
befinner seg på, når ordet LOOKSTK står på den
linje, hvis det er blitt noe liggende på toppen av
bordet som antakelig ikke skal være der. Press Q eller
q -- kanskje flere ganger -- for å avbryte
gjennomgangen (kompileringen) av ditt program hvis det
dukker opp en melding fra LOOKSTK. Den er formet en
smule underlig, for ikke å virke for negativt hvis den
skulle oppstå lenge etter at du har solgt programmet.
Dette er usannsynlig men i noen få tilfelle tenkelig --
uten at det behøver å gjøre noe. Derfor er meldingen
ikke helt opplagt noen feilmelding. Den lyder omtrent
slik: "Hello, I just wanted to say hello!". Den gir
også et linjenummer. Merk deg dette, forlat F3, gå inn
i F3 igjen, hent opp SUPERBT.TXT, og press CTR-J og hopp
direkte til denne linjen ved at du taster inn
linjenummeret. Merk at CTR-J også kan brukes til å
hoppe til begynnelsen av programmet simpelthen ved å
presse linjeskift til svar. CTR-N hopper til slutten av
programmet. CTR-S, som sagt, kan brukes for å lagre.
Lagre ofte, når du gjør kompliserte endringer, og ta
backup der du bruker andre filnavn eller putter filen i
en midlertid folder, slik at du kan gå tilbake til
tidligere versjoner dersom en feil blir med et stykke
før du oppdager feilen. Alle programmere, uansett hvor
super-ultra de tror de er, gjør hele tiden feil i
programmering -- om ikke hele tiden, så nesten hele
tiden. Det er noe man må ta som en del av moroa.
Programmering i seg selv er litt som et spill. Et spill
er ikke spill dersom alt er totalt lett uten den aller
minste utfordring på noe punkt. Programmering er ALLTID
fullt av utfordringer, men ved at du har egnete
oppgaver, vil du oppleve mestring på hvert nivå, og
dermed opprettholde gløden.
Fargetonene i F3 er, bortsett fra 0 som generelt er
bakgrunnsfargen, satt til komplett skinnende grønn, av
den typen som gir rosa hvis du ser mot noe veldig lyst
etterpå som "afterglow", og 1 som generelt er fargen
som brukes til å skrive eller tegne mot denne
bakgrunnen. Dette kan endres via noen variabler og
funksjoner, men dette gjelder etter GJ-ON er startet, og
du ser ordet GJ-DONE som brukes hver gang man har
skrevet GJ-ON, og som avslutter programmet. Uten bruk av
disse ord er det kun tekst man kan skrive, og da kan man
ikke bruke slike ord som RECT og RECTFILL. GJ-ON er
standard å bruke for alle spill som har det minste
grafikk i seg.
Men fargene har en viss kompleksitet over seg. Hvis du
skal gjengi et nydelig foto trenger du normalt litt mer
enn helt lyst og helt mørkt. Da er 128..191 mer de tall
du trenger. Alt nær opptil 191 inklusive 191 er lyst,
og alt som er nær nedtil 128 inklusive 128 er mørkt
eller sort. Dette brukes når brettet plutselig blir
satt til sort -- til 128. Du ser 128 => ...
brukes i en funksjon i programmet -- den som heter noe
med ..FUN-AT-FOUR-TIMES-THE-SPEED.
Ordene "funksjon" og "program" eller "program inne i
programmet" er nærmest ensbetydende med hverandre og
med ordet "definisjon", når vi snakker om F3
programmering. Hver gang vi sier noe med (LET ..
begynner vi å definere en ny funksjon, kan vi si, eller
-- om vi fokuserer på den nye bokstav-rekken, som
gjerne kan være lang og morsom -- et nytt ord.
Når vi senere bruker ordet -- den står f.eks. på en
linje for seg selv slik som (i et tenkt eksempel)
(( ..GOTTA-DO-A-LOT-OF-FUN ))
kan vi snakke om at vi "kaller på funksjonen". Dette
kan gjøres ved at navnet på den skrives på en linje
for seg uten noe (LET på samme linjen. Det kan også
gjøres ved at den fores, i de tilfelle der den er laget
på egnet måte, med tekst og eller tall eller noe
slikt. Da brukes gjerne en pil, =>, men denne pil er en
slags forklaring om hva vi mener, den kan droppes, og
jeg la merke til at jeg hadde glemt å skrive den minst
ett sted når jeg lagde programmet. Og jeg puttet det
ikke inn etterpå, fordi dette er en slik frihet man
har.
Normalt, hvis det ikke står noe inne i BE (( )) som
følger etter (LET .., betyr det at funksjonen --
"programmet inne i programmet" -- ikke er laget for å
bli foret med noe tall eller tekst. Står det f.eks. et
semikolon der, skal den gjerne ha en tekst. Står det
noe slikt som >N1 eller >N5 der, skal den gjerne ha et
tall. Det kan også være flere ting den skal ha.
Semikolon gjør ingenting, akkurat som pil =>, og
akkurat som (( og )), når disse står for seg selv.
Disse er bare konvensjoner som hjelper på leseligheten
av programmet, og forenkler rettingen, og i det hele
tatt bidrar til skjønnheten ved det å programmere --
og skjønnhetsopplevelsen er praktisk nyttig, for
den gjør det langt enklere å finne ut hvor feil er
(mao., noe som bryter med programmets eleganse).
Hvis du ser opp til det ord som kommer etter 128 =>,
vil du finne at (( >N1 )) står i den linjen der ordet
først innføres -- defineres -- samme linje som det
står (LET på. Uttrykket >N1 -- som kan våre maksimum
>N11 -- betyr at tallet, i dette tilfellet 128, skal
puttes inn i en midlertidig lagringsplass, nemlig N1.
Hver gang, inne imellom (LET og OK) man bruker N1,
generelt sagt, vil det inneholde 128 eller hva det nå
enn er man bruker når man påkaller dette ordet. Hvis
du kikker rundt omkring vil du se at akkurat samme ord
brukes i forbindelse med 191 =>. Her ser du hvor nyttig
det er med funksjoner -- med (LET .. OK) definisjoner.
Istedenfor å ha en funksjon for å gjøre brettet helt
lyst, og en annen funksjon for å gjøre det helt
mørkt, har vi simpelthen brukt >N1 og N1 slik at vi kan
variere fritt.
Gir disse kommentarer lite mening til å begynne med,
les dem på nytt etter en eller to gangers
gjennomarbeidelse av alt i dette bokheftet, med masse
oppmerksomhet, og la det være stunder der du må sette
viljen til for å fortsette, for det virker kjedelig,
men gi da ikke opp! For det varsler enda større gleder
på den andre siden, når du kommer det gjennom det
kjedelig. Om du ikke har hast, legg inn litt ekstra
gåturer, sov litt ekstra for hjernen plukker opp nytt
tillært materiale under søvn og drømming, men arbeid
litt hver dag slik at du opplever fremgang, akkurat som
når du leser en lang, god tekst.
Skal jeg kommentere mer nå om programmet i sin
nåværende form bør jeg kanskje nevne denne (COUNT ..
COUNTUP) tingen, og også veldig fort <<ASSERT. Den
siste først: <<ASSERT forteller at vi skal ha lagret
noe i en variabel. TICKET inneholder et gedigent tall,
og hvilket tall blir gitt det via <<ASSERT.
(COUNT .. COUNTUP) er en gjentagelse, en loop --
sløyfe. Hvor mange gjentagelser vites ikke alltid før
begynnelsen av loopen. Da kan man bare skrive et altfor
stort tall, men ikke bruk større tall enn to milliarder
-- omtrent -- som er 2 med ni nuller etter, som kan
skrives 2000000000 men som kan skrives, for synlighets
skyld, ved en ekstra funksjon som fjerner kommaer,
nemlig slik: 2,000,000,000 => RICH -- dette er greit
f.eks. foran en loop, men ordet RICH bør ofte ikke
puttes på innsiden i en loop (fordi på innsiden skal
det være ikke noe unødvendig, for ikke å tynge
datamaskinen).
For større tall, kan de lagres som tekster --
såkalte "tekst-strenger" eller simpelthen "strenger",
-- vi har sett eksempler på slike i }-parentes -- eller
som -- i tilfelle de er lengre enn cirka 250 tegn -- som
en serie med tall, der hvert tall angir hvilket siffer.
Slike serier kan være rader i en matrise, for den
som allerede nå skal se i manualen om slikt se blant
annet RAM-PM for å lage matriser og %MAKE for å lage
tallrekker, eller "arrays". En matrise er rader og
kolonner, akkurat som skjermens punkter i x og y.
Disse har ikke særlig andre begrensinger enn minnet
for datamaskinen, som for skikkelige, ordentlige,
ikke-for-store 32-bit datamaskiner består av endel
millioner tilgjengelig matriseplasser.
En svær (COUNT .. COUNTUP) loop brukes for å finne
ut hvor mye tid, omtrent, spilleren ønsker mellom hvert
øyeblikk av endring av brettet. Straks linjeskift
trykkes, vil KEYTOUCH gi et signal og (MATCHED ..
MATCHED) vil avslutte loopen, da brukes RMS RMS EXIT,
som gjerne er greit å ha sett allerede nå på et
tidlig tidspunkt. EXIT brukes for å forlate en
funksjon, og RMS RMS EXIT brukes for å forlate en
funksjon dersom man er inne i en loop, som minimum
opprydding, -- i situasjoner hvor man har mange
mellomlagringer her og der kan det være flere ting,
flere typer RM -- remove -- som skal skrives.
Hvis brukeren mot all formodning ikke presser
linjeskift selv etter et hav av tid slenger vi inn i
tall likevel, inn i TICKET, derfor er det to stykker
<<ASSERT der. Programmerere skal ofte tenke på slike
underlige situasjoner, fordi programmer blir noen ganger
brukt på måter som ikke er helt tiltenkt og det skal
vise seg robust og ikke firkantet men smidig i slike
situasjoner.
Jeg synes vi skal komme oss lengre inn mot spillets
essens. Vi må finne litt ut av hva det er som spilleren
skal bevege, ha kontroll over, og hva det er spilleren
skal bevege dette et-eller-annet i forhold til, og hvor
score skal stå, og hvordan tastaturet skal brukes for
å gi spilleren denne kontrollen. Jeg antar vi også
bør skrive et sted på skjermen hvilke kontroller som
gjelder. Hvis vi finner et ganske anonymt sted å skrive
dette, behøver vi ikke slette det, spill-opplevelsen
vil fremdeles være god.
Jeg merker selv at det er en gnistrende energi av
stimulans for meg både med at et spill har en blinking
ved seg, og ved at det er endel elementer som er helt
firkantete -- harde kanter kan være stimulerende, at
ikke alt er smurt ut til noe sirkulært. Denne følelsen
er gjenspeilet også vet at jeg "tegnet" (i B9) starten
(toppen av) websiden for Lisa, norskesites.org/fic3,
ved hjelp av stjerner på tastaturet, -- skarpt
atskilte, vanlige tekst-stjerner, -- som utgjør en
helhet du SELV i ditt eget sinn, egen fantasi, setter
sammen. Dette har å gjøre med det vi filosofisk kan
kalle første-hånds programmering -- med å stimulere
heller enn å simulere, heller enn å etterligne
virkeligheten, med virkelighetens alle vakre myke
overganger. Datamaskinen skal ha en kontrast også slik
at vi husker at datamaskinen er en datamaskin, og at
virkeligheten rundt er noe annet: dette er stimulerende,
fordi det er, på sett og vis, ærlig. [[[Man kan
argumentere for dypere nivåer av virkeligheten der det
digitale eller datamaskiner i en dypere forstand spiller
en vesentlig rolle, og med rette, men det er i seg selv
ikke noe argument for at de datamaskiner vi i den
manifeste hverdagen omgir oss med skal tilsludre
virkelighetsopplevelsen, ikke sant? Det er et komplisert
spørsmål men min egen intuisjon er i alle fall helt
klar over at F3 i sine spill i denne manifeste
virkelighet er akkurat det den bør være!!!]]]
Her, dermed, neste versjon -- der alle nye elementer
er å finne samlet med kommentar }* .. }* før og etter,
som lovet, og du behøver selvsagt ikke inkludere disse
linjene som inneholder akkurat denne beskjeden til deg
-- alle linjer inne i programmet som begynner med }* og
som slutter også med }* kan trygt utelates, fordi de er
beskjeder til deg for å forenkle prosessen for å
utvide SUPERBT.TXT fra forrige avsnitt over til den nye,
utvidete SUPERBT.TXT i dette avsnitt, som har enda litt
mer 2D spill-essens i seg (tilgi meg for at jeg legger:
inn en god del, men det er VIRKELIG mange repitisjoner
her -- et hav av dem. Og hva er vel bedre for å
lære nyansene i hva de ulike F3-ord betyr?
Merk at litt tegnes opp inne i det sorte spill-feltet
men selve spill-bevegelsen kommer vi nærmere først
i avsnittet etter dette. Har du tastet det følgende
riktig, vil programmet straks avsluttes når du
presser hvilken som helst bokstav eller linjeskift.
Men det vil virkelig se mye mer ut som et spill.
Og veien videre er forenklet av at vi har
-- i denne versjon -- fått på plass noen
funksjoner som gjør det lettere å få action,
selv om de her bare såvidt brukes. Altså,
lykke til, ta deg tid, det er virkelig en
god del -- se etter }* .. }* kommentarene
som forteller hva som er nytt i dette avsnitt:
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3 }*
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING. }*
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt }*
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010) }*
((DATA TICKET ))
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
((
(( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL ))
)) OK)
(LET WIPE-CLEAR-GAME-BOARD-AREA BE (( >N1 ))
((
(( 101 ; 101 ; 399 ; 399 ; N1 => RECTFILL ))
)) OK)
(LET TELL-SOMETHING-GOOD BE (( ; ))
((
(( ; 120 ; 550 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
((
(( ; 120 ; 600 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
((
(( ; 120 ; 650 => B9-POP ))
)) OK)
(LET GET-A-GOOD-TICKET-TO-RIDE BE (( ))
((
(( 100000 TICKET <<ASSERT ))
(( 1,000,000,000 => RICH
(COUNT
(( KEYTOUCH
(MATCHED
(( N1 TICKET <<ASSERT ))
(( RMS RMS ; EXIT ))
MATCHED) ))
COUNTUP) ))
)) OK)
(LET USE-THE-TICKET-TO-TRAVEL-FAR BE (( ))
((
(( TICKET >>>
(COUNT
(( N1 => >N1 ))
COUNTUP) ))
)) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( ))
((
(( :@@@@@@@@SUPERBT!!! ; 120 ; 150
=> B9-POP ))
(( :@@@FIGHT_WELL! ; 120 ; 200
=> B9-POP ))
(( :@@@SCORE_MUCH! ; 120 ; 250
=> B9-POP ))
)) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( ))
((
(( }Dear master of this game!} =>
TELL-SOMETHING-GOOD ))
(( }Please press lineshift, wait a little,} =>
TELL-SOMETHING-GOOD-SECOND-LINE ))
(( }and press it again, to indicate game speed.} =>
TELL-SOMETHING-GOOD-THIRD-LINE ))
(( A-KEY ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( GET-A-GOOD-TICKET-TO-RIDE ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( }Thanks! Lineshift to begin} =>
TELL-SOMETHING-GOOD ))
(( }Have courage! Be brave! Win win win!}
TELL-SOMETHING-GOOD-SECOND-LINE ))
)) OK)
(LET SHOW-FUN-AT-FOUR-TIMES-THE-SPEED BE (( ))
((
(( TICKET >>> ; ))
(( ; TICKET >>> ; 4 => DIV
TICKET <<ASSERT ; ))
(( ; 3
(COUNT
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*YOU ARE ELECTRIC!*} ; 110 ; 350 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*EEEELLLECTRIC!!!*} ; 175 ; 250 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*ELECTRICITY!*} ; 220 ; 110 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 128 => WIPE-CLEAR-GAME-BOARD-AREA ))
COUNTUP) ; ))
(( ; TICKET <<ASSERT ))
)) OK)
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*}
((DATA THE-SCORE ))
((DATA PLAYERS-ROW-NUMBER ))
((DATA PLAYERS-COLUMN-NUMBER ))
((DATA TREASURE-ROW-NUMBER ))
((DATA TREASURE-COLUMN-NUMBER ))
((DATA USE-THIS-GREEN-TONE ))
(LET EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS BE (( ))
((
(( }GAME-CONTROLS:} ; 750 ; 100 => B9-POP ))
(( } Y F } ; 750 ; 125 => B9-POP ))
(( } G H} ; 750 ; 150 => B9-POP ))
(( } B} ; 750 ; 175 => B9-POP ))
)) OK)
(LET SHOW-THE-GAMER-HER-PRESENT-SCORE BE (( ))
((
(( }S C O R E >>> } ;
450 ; 300 => B9-POP ))
(( }S C O R E >>> } ; THE-SCORE >>>
=> CONCAT ; 450 ; 300 => B9-POP ))
)) OK)
(LET BIG-PIXEL-HERE BE (( >N11 >N1 ))
((
(( N1 ; 4 => MUL ;
97 => ADD => >N1 ))
(( N11 ; 4 => MUL ;
97 => ADD => >N11 ))
(( N1 ; N11 ; BRIDGE 4 ADD ;
BRIDGE 4 ADD ; 191 => RECTFILL ))
)) OK)
(LET GAMER-SYMBOL BE (( ))
((
(( PLAYERS-ROW-NUMBER >>> => >N1 ))
(( PLAYERS-COLUMN-NUMBER >>> => >N3 ))
(( N1 => INC ; N3 => BIG-PIXEL-HERE ))
(( N1 ; N3 => INC => BIG-PIXEL-HERE ))
(( N1 ; 3 => ADD ;
N3 => INC => BIG-PIXEL-HERE ))
(( N1 => INC ;
N3 ; 3 => ADD => BIG-PIXEL-HERE ))
)) OK)
(LET TREASURE-SYMBOL BE (( ))
((
(( TREASURE-ROW-NUMBER >>> => >N1 ))
(( TREASURE-COLUMN-NUMBER >>> => >N3 ))
(( N1 ; 3 => ADD ; N3 => BIG-PIXEL-HERE ))
(( N1 => INC => INC ; N3 => INC => BIG-PIXEL-HERE ))
(( N1 => INC ; N3 => INC => INC
=> BIG-PIXEL-HERE ))
)) OK)
(LET GET-ON-WITH-THE-GAME BE (( ))
((
(( EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS ))
(( THE-SCORE => SETBASIS ))
(( SHOW-THE-GAMER-HER-PRESENT-SCORE ))
(( 15 PLAYERS-ROW-NUMBER <<ASSERT ))
(( 5 PLAYERS-COLUMN-NUMBER <<ASSERT ))
(( 5 TREASURE-ROW-NUMBER <<ASSERT ))
(( 15 TREASURE-COLUMN-NUMBER <<ASSERT ))
(( 191 USE-THIS-GREEN-TONE <<ASSERT ))
(( GAMER-SYMBOL ))
(( TREASURE-SYMBOL ))
(( A-KEY ))
)) OK)
(LET SUPERBT BE (( ))
((
(( GJ-ON ))
(( }MY DEAR GAMER! You must be sure} ;
10 ; 10 => B9-POP ))
(( }that you don't get absolutely addicted} ;
10 ; 50 => B9-POP ))
(( }to me. -- The program. ENTER if you dare!} ;
10 ; 90 => B9-POP ))
(( A-KEY ))
(( CLS ))
}* ***NEW PART OF PROGRAM ABOVE HERE**** }*
(( 100 ; 100 ; 400 ; 400 ; 1
=> RECT ))
(( BEAUTIFUL-CONTENT-OF-FRAME ))
(( GET-A-WONDERFUL-SENSE-OF-TIMING ))
(( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( GET-ON-WITH-THE-GAME ))
(( GJ-DONE ))
)) OK)
(LET AUTOSTART BE SUPERBT OK)
***
Forklaringer! Forklaringer! Forklaringer!
Eh?
Vi vil ha forklaringer?
Aha, dere vil ha forklaringer?
JA!
Javel, ja, nettopp ja, litt forklaringer skal dere
få, mine kjære elever. Så fantastisk flott at dere
vil ha forklaringer! Det er jo det som er lærerens
drøm, at elevene trygler og ber om forklaringer,
forklaringer, og atter mer forklaringer!
La oss ta, mine kjære elever, INC. Det betyr
INCrement. Altså legg til 1. Hvis det står
SOMETHING-OR-OTHER ... => INC =>
Betyr det at vi øker verdien av dette, legger til en,
men det betyr ikke at vi har lagret det der vi hentet
det. Vi henter et tall frem, øker det. Dersom det står
noe slikt som
THIS-OR-THAT .. => INC HERE-AND-SOMEWHERE <<ASSERT
derimot, vil vi lagre det nye, økte tallet -- i dette
tilfelle i den tenkte variabel HERE-AND-SOMEWHERE. Hver
gang vi bruker <<ASSERT for å lagre et tall i en
variabel vil vi gjerne ha en ((DATA .. høyere opp i
programmet (noe jeg selv ofte putter samlet på toppen,
men det er ikke strengt tatt nødvendig). Vi ser f.eks.
((DATA THE-SCORE )) eller noe lignende og dette er noe
vi kan bruke til <<ASSERT. Men dersom vi skal legge 0
inn som startverdi, kan vi skrive SETBASIS istedenfor å
skrive 0 (null) og deretter <<ASSERT. Det er mange slike
alternative skrivemåter, forkortelser, det er gjerne
alltid mange måter å programmere på.
Du der ja, hva spør du om?
Aha, du spør om hvorfor det er så mange mange
setninger og vi enda ikke har noe spill. Ha! Men vi er
jo nesten ferdig. Er vi ikke? Det blir litt klipping og
liming av tekstlinjer, litt regning og tulling frem og
tilbake, vi er straks der. Er det mange linjer? Hvis du
leser en spennende novelle, og et mystisk skummelt
mysterium er iferd med å løse seg, skuffer du gjennom
mange sider uten at du sier: så mange sider det er! Du
tar tyve sider og glemmer tiden litt og skulle ønsket
at det var tre ganger så mange sider, for det gnistret
med spenning. Men når du må slå opp hvert eneste ord
i en ordbok, virker tyve sider nesten fantastisk mye.
Det er her en lærer må si, kom igjen, bare repiter,
glem detaljene akkurat nå, svett litt, slit litt, kom i
kontakt med materien -- og den dag kommer nærmere at
det slett ikke virker som mye, så lenge det er under et
tusen linjer eller så.
Så bare lat som du forstår, lek med biter av
forståelse, bygg fra disse bitene, forsøk ikke å
tvinge deg til å si: enten forstår jeg alt sammen med
en gang, eller så er det noe feil med verden eller meg.
Slett ikke! Verden og du er fin og du har all grunn til
å regne forstålse som noe som vokser for hver måned
du har kontakt med dette. Anstrengelse! Gleden ved den
uanstrengte anstrengelse! Noen protester? Ingen? Da går
vi videre.
Men fikk du programmet til å virke? Det står noe om
bokstav-kontroller, Y G H B, der Y er øverst, B er
nedert, G til venstre, og H til høyre, og disse kan
brukes til å flytte spillerens symbol, som er den greia
som er ganske symmetrisk og fin. Under spillerens symbol
skal vises nå, hvis du har tastet det hele inn riktig,
en slags oppover-til-høyre rutete strek. BIG-PIXEL.. er
den rutinen som lager dette her.
Du ser noe slikt som ... ; 4 => MUL ... og andre
steder noe slikt som ... ; 3 => ADD. Istedenfor 3 => ADD
kan man også skrive INC => INC => INC, altså legg til
3. Istedenfor 4 => MUL kan man skrive TWICE => TWICE,
altså ta det dobbelte to ganger.
De 1024 ganger 768 pixler som utgjør den synlige
skjermen er ganske bittesmå og finkornete. Noe av det
morsomme med spill er å spille på fantasien, utfordre
hjernen ved bevisst bare å lage et symbol -- av store
firkanter. Derfor bruker vi en RECTFILL som har noen av
disse 4 => MUL aller først, slik at alt sammen blir
forsto/rret fire ganger. Vi legger til cirka 100 først,
dette skyldes at spille-rammen -- brettet -- matrisen --
kall den hva du vil -- er en sort flekk som begynner på
piksel nummer x=100, y=100. Altså, kolonne 100, rad
100.
Det er også en god ide å gi en velkomstskjerm, som
forteller litt hva dette dreier seg om, før man er rett
inne i selve programmet; og også en avskjedsskjerm,
når man er ferdig. Dette er en god energi -- det pakker
spill-opplevelsen sammen slik at den ikke flyter ut og
inn i dagsbevisstheten når man skal gjøre andre ting
etter at man har spilt. Og skulle man lage et program
som ligner på et spill men som dreier seg om noe langt
mer reellt er det viktig at velkomstskjermen har sagt
ifra om dette, slik at man ikke begynner å tenke spill
i en situasjon hvor det dreier seg om noen virkelige
effekter.
Hvis du kikker på det programmet (inne i programmet)
som heter noe med ..BIG-PIXEL.. vil du se at den henter
et tall fra en variabel rett før RECTFILL kalles, dette
er grønntonen, enten helt sort eller helt lysegrønn,
kanskje.
Du ser, mer bestemt, linjen
USE-THIS-GREEN-TONE >>> => RECTFILL ))
En av de vanskeligste tingene å huske på kanskje, som
du bør gi noen ekstra sekunder til, inntil det fester
seg grundig i hukommelsen, er at når du skal HENTE en
verdi fra en variabel skal tre > brukes
USE-THIS-GREEN-TONE >>> => RECTFILL
mens når du skal lagre i den, skal <<ASSERT brukes,
191 USE-THIS-GREEN-TONE <<ASSERT
-- og grunnen til at dette er vanskelig å huske er at
det er lett å tenke seg at => er nok. Det ser ganske
bra ut, men selve arbeidet med å hente ut en verdi dypt
fra dataminnet er totalt annerledes for datamaskinen enn
arbeidet med å legge en ny verdi inn dypt i dataminnet.
USE-THIS-GREEN-TONE er bare navn på boksen. Innholdet
skal enten HENTES MED >>> eller LAGRES MED <<ASSERT.
Glemmer du å skrive >>> vil ofte veldig underlige ting
skje, som kanskje ikke fanges opp til å begynne med.
Det er her man må si: man lærer ved å gi
oppmerksomhet til erfaring, til leking, man lærer ved
øvelse, man lærer ved også å gå turer, tenke litt
over det hele, sove på det, tenke over det.
Flere forklaringer? Ja, kanskje noe med dette med å
skrive ut score. Det er et ord der -- CONCAT -- og
CONCAT er for tekster det ADD er for tall -- det dreier
seg om å legge to og to sammen. Eller 1 og 1. Hvis du
starter opp F3 og skriver
512 512 ADD POP
vil du antakelig få ut noe i nærheten av 1024. Dette
er et eksempel på TEKSTMODUS av F3. Derimot, hvis du
skriver
512 512 CONCAT POP
vil du antakelig få ut noe i nærheten av 512512. Og
like lite som det gir mening å bruke ADD etter noen
ord, gir det mening f.eks. å skrive
:HELLO } YOUNG WORLD} CONCAT POP
Da får du
HELLO YOUNG WORLD
ut, etter at du presser linjeskift. Så POP brukes i
tekstmodus, mens B9-POP med X og Y koordinater -- altså
vannrett og loddrett hvilken pixel som skal brukes for
begynnelsen av teksten -- skal brukes inne i grafiske
spill og slikt (som alle starter med GJ-ON og slutter
med GJ-DONE, mens tekstmodus-programmer slutter med
RAM-REFRESH og trenger ingen begynnelse).
Skal du skrive ut SCORE skal du først fjerne den
tidligere score -- derfor det blanke feltet i den
første B9-POP som skriver ut score. Deretter brukes
CONCAT for at tallet for score legges inn på riktig
plass, rett etter teksten, og en ny B9-POP sørger for
at tallet kommer på plass. Du kan selvfølgelig
kalkulere eller eksperimentere for å finne nøyaktig
hvor tallet skal skrives ut istedenfor å bruke CONCAT,
og det vil da virke bittelitte grann fortere, siden vi
ikke skriver ut SCORE>>> på nytt hver gang, men jeg
tror vi lar det stå. Litt enkelt skal det være, det er
alltids muligheter for å få ting fortere senere der
det trengs. Som regel er datamaskinen rask nok hvis vi
bare tenker oss litt om. Dessuten behøver vi ikke
skrive ut SCORE hele tiden -- bare hver gang den endres.
Ordet CLS -- clear screen -- det fjerner teksten som
står over. Husket jeg selv på det med en gang? Nei.
Hver gang jeg legger ut et program her har jeg alltid
vært noen runder frem og tilbake, men jeg tror på at
læringen er størst ved at det programmet som står her
til enhver tid er ganske velfungerende, for det er mange
nok muligheter for at det blir tastefeil hvis du skriver
litt fort, og da er det greit at du har en mal.
***
Har jeg ikke sagt det før, er det jammen på tide å
få det sagt nå: du kan eksperimentere med en god del
av funksjonene direkte uten å lage noe program som du
lagrer og henter inn.
Jo, jeg HaR sagt det før. Se lenger opp, der vi
snakket om CONCAT.
Du kan bruke F3 også som regne-maskin. Dette kan
også være en måte å lære deg hvordan tenke på
dette som vi kaller "stacks", hauger av data som ligger
klart til bruk for funksjonene, der det vi legger til
sist er det vi plukker ut først (LIFO, last in, first
out, til forskjell fra FIFO, first in, first out, som er
en annen type stack som brukes noen ganger).
3 5 ADD 8 MUL
er noe slikt som 3 pluss 5, nemlig 8, ganger med 8,
nemlig 64.
POP
skal da gi 64.
Vi burde få det samme resultat ved å skrive
8 3 5 ADD MUL POP
Og dette kan også, inne i et program, skrives pent og
pyntelig som
(( 8 ; 3 ; 5 => ADD => MUL => POP ))
SUB er substract, altså å trekke fra. DIV er dele.
Skal vi ta summen av to tall, og summen av to andre
tall, og multiplisere dem, kan vi skrive i naturlig
språk noe slikt som (2+3) * (3+4). Datamaskinen tenker
gjerne i stacks og vil ha funksjoner presentert etter
data er på plass. Da får vi:
2 3 ADD
3 4 ADD
MUL
POP
Tilsvarende syntaks, mer eller mindre, men med slike
endringer som at vi skriver åDD istedenfor ADD, og vi
skriver :A2 og :A3 og slikt for å referere til kolonne
og rad, brukes inne i programmet SPC -- Lisa Business
Space -- den kommer opp ved at du skriver SPC eller ved
at du presser CTR-D inne i B9.
Til sterk forskjell fra B9 er det meningen at du skal
holde tunga rett i munnen og ha støtt blikk og
uskjelvende hender, i tillegg til meget klar tanke, for
å skrive inn formler og lagre filer i SPC. Det er et
program som krever, med andre ord, en viss ferdighet.
Men det springer rett ut av hvordan dataspråket
fungerer.
Hvis du kikker på SPC -- press ESC noen ganger for å
komme ut av det og tilbake til B9 (hvis det var der du
startet det, du kan gå frem og tilbake for å kalkulere
videre på de samme tall) -- ser du en matrise, altså
noe som både har rader og kolonner. Denne matrisen kan
lages ved en funksjon som heter RAM-PM. I sin enkleste
forstand er det kun ett tall, og bare tall, i hver node
eller plass i matrisen. Tekster vil normalt lagres som
en serie tall når vi skal ha dem i en matrise. Se
funksjonen ASCII og funksjonen GETASCII i manualen
F3DOCS for å gå frem og tilbake mellom tallform og
tegnform -- f.eks. er tallet for A 65, mens lowercase a
har samme tall som A har, bare at det er 32 høyere, i
dette tilfelle 97. Mellomrom har eget tall, 32. Tallene
-- siffrene -- 0 til 9 har, forvirrende nok, men det er
nødvendig for å være konsekvent, egne tall, som er
lavere enn tallene for bokstavene A..Z, men høyere enn
tallene for mellomrom og endel tegn slik som ! og
lignende. Det høyeste tall man opererer med når man
snakker om ASCII i denne sammenheng er 126. De laveste
tallene, under 32, fra 0 og oppover, har noe å gjøre
med kontroll-taster og funksjons-taster. Hvis du f.eks.
presser CTR-D og bruker KEYNUM istedenfor KEY til å
lese fra tastaturet, kommer tallet 4. CTR-F gir 6.
Vel, dette var bare for å ha nevnt det.
La oss fortsette med spillet. Jeg hadde en ide om å
nevne SPC knyttet til matrise, og det er at hvis vi skal
bygge spillet ut fra at vi vil ha flere dingser inn,
ikke bare en dings som skal fanges opp for å få score,
kan vi jo putte dem her og der i nettopp en slik matrise
eller "tabell av tabeller". Dette er noe som lett kan
videreutvikles til mer avanserte 2D spill.
Men i dette spillet har vi en greie som vi skal styre
ved å trykke noen bokstaver på tastaturet, og denne
ene greien, siden det bare er en av den, kan vi like
gjerne holde rede på ved at vi har lagret X -- den
horisontale plassen -- og Y -- den vertikale plassen --
i slike ((DATA .. )) greier -- variabler, som det også
heter -- som vi allerede har.
For å lage et brett, et spillområde, som har noen
faste plasser som vi matcher mot det grafiske spill-felt
på skjermen, kan vi altså lage en matrise i RAM. Vi
kan bruke PM for Put to Matrix og GM for Get from
Matrix, altså PM og GM. I denne sammenheng, med andre
ord, er PM ikke akkurat Prime Minister, men mer et
uttrykk for matrise og noe med lagring av den. Dette er
bakgrunnen for at RAM-PM er ordet som brukes til å
sette av plass i RAMmen, i minnet, (opprinnelig, Random
Access Memory, at vi kan ha alle plasser i dette minnet
direkte tilgjengelig, istedenfor som ved en tape, at
bare det som spilles av akkurat nå er tilgjengelig) --
og i neste versjon av programmet, er RAM-PM på plass.
Jeg tror du begynner å bli helt fantastisk
super-ultra bra i programmering. Du er allerede, ifølge
den fantastiske benign text editor B9 som brukes til å
lage dette manuset, forbi selveste linje 1750 i heftet. Du
er i ferd med å bli farlig god og bruk din kompetanse
med stor etikk, for ansvar går med slik kunnen!!!
Derfor skal du også få det spillbare program ferdig,
og tillatelse til å se her og der i FIC3.TXT og i
F3DOCS.TXT samt bruke din egen intuisjon til å frariste
programmet dets siste hemmeligheter. Lykke til!
Her er det -- det virker! -- og det er gøy!
P.S. Det er et par ting du vil finne ut ved mer om ved å
bla i F3DOCS. En av disse er at matriser gjerne vises
til ved symbolet #. (Flere matriser, ##, ### m.v.). For
å "lade opp" symbolet brukes en formlering av typen
(( GAME-BOARD >>> => & ))
og for å formidle til F3 at vi er ferdig med å bruke
symbolet # i akkurat denne funksjonen brukes
(( && ))
Dette er en lagring på noe som heter variabel-stack, som
også kan kikkes på via navnet VARSTK i tekstmodus.
Henting av tall fra matriser: .. .. ; # => GM.
Putting av tall inn i den: .. .. ; # => PM.
En annen ting er at hvis du vil ha et nokså tilfeldig
tall ut fra datamaskinen, si mellom 1 og 1000, bruk
noe slikt som 1000 => FUNNYRFFG
eller noe slikt som ^1000 FR GETV
og alle SUPRE spill, SUPERBT inklusive, bruker begge
metoder for RFFG -- relativt fri fluktuering-generator
-- for det er en egen synkronistet ved dette (se mine
filosofi bøker).
Men her er resultatet -- bruk F for å gripe hver ting
som utgjør score når du ved de øvrige tastene har
manøvrert deg nær dem, og ikke vent for lenge, -- der
ligger utfordringen -- at du forholder deg bevisst til
hver ting som gir score. Bare slik fortsetter spillet,
og kompleksiteten økes etterhvert ved at flere og flere
dingser dukker opp, som kan gi score og som må møtes med
F-tasten i riktig øyeblikk. Vær snill mot tastaturet!
HER er programmet, og lykke til videre -- vi sees i
3D-heftet -- og så videre!!!
}* SUPERBT.TXT -- SUPREME FAST LEARNING OF F3 }*
}* BY SUPREMELY SIMPLE FUN 2D GAME-MAKING. }*
}* THIS PROGRAM IS YOGA4D.ORG/cfdl.txt }*
}* REDISTRIBUTABLE (FROM B.A.BOOKLET BY A.T. 2010) }*
}* =====> BIG AND IMPORTANT NOTES: <=============== }*
}* FROM THE COMPLETION OF THE BIG ART BOOKLET, TO }*
}* THESE FINAL PAGES WITH THE COMPLETED GAME, TOOK }*
}* A BIT OF SOME QUANTUM JUMPS! PLS FORGIVE! ;-) }*
}* IT GOT REALLY LONGER, BUT NOW IT IS A REAL GAME! }*
}* THE R E A L L Y G O O D N E W S IS THAT }*
}* THERE'S HARDLY ANY BIT OF WHAT FOLLOWS WHICH IS }*
}* COMPLICATED COMPARED TO WHAT YOU'VE ALREADY BEEN }*
}* LOOKING AT IN PREVIOUS CHAPTERS. ANYTHING NEW }*
}* HERE IS MENTIONED IN COMMENTS, SEE F3DOCS.TXT }*
}* WHERE IT HAS EASY-TO-UNDERSTAND COMMENTS ALSO. }*
}* THERE ARE SEVERAL CHANGES HERE -- INSIDE MARKED }*
}* AREAS, WITH LINES LIKE : ****NEW PART FOLLOWS! }*
}* AS OFTEN HAPPENS, WHILE WORKING THE MOTORICS OUT,}*
}* SOME IDEAS CHANGED -- AND EVOLVED. GAMER'S SYMBOL}*
}* NOW MOVES O N L Y WHEN KEYBOARD IS USED, AND }*
}* THE SYMBOLS ARE SPACED OUT, LESS TIGHT. AND: }*
}* PLEASE LOOK AT E V E R Y ROW-.. AND COLUMN-.. }*
}* IN THIS PROGRAM -- CAREFULLY! -- AS I CONFUSED }*
}* THE MEANING OF THE TWO IN ALL EARLIER VERSIONS }*
}* OF THIS PROGRAM IN YOUR BOOKLET. THIS TYPE OF }*
}* THING EASILY HAPPENS DURING PROGRAMMING, AND }*
}* INSTEAD OF CONCEALING IT, I HAVE ALLOWED IT TO }*
}* BE PART OF THE JOURNEY OF MAKING THIS PROGRAM. }*
}* ROW, OF COURSE, IS Y, WHILE COLUMN IS X. }*
}* THERE IS A LOT OF CONDENSED LEARNING INSIDE THIS,}*
}* SPEND WEEKS WITH IT -- AND MANUAL -- TO LEARN ALL!}*
}* THOUGH A LONGER PROGRAM THAN THE INITIAL ONES IN }*
}* BOOK, IT USES NO NEW FUNDAMENTAL TECHNIQUE, IT IS }*
}* JUST MORE OF THE SAME THAT YOU'VE ALREADY LEARNED!}*
}* BE PATIENT ON CORRECTING ANY EVEN SLIGHT TYPING }*
}* ISSUES. WATCH E.G. FOR TYPING ONE BILLION RATHER }*
}* THAN TEN BILLION, AND TO HAVE SPACE BEFORE AND }*
}* AFTER SEMICOLONS, TO GET SEQUENCE RIGHT WITH N1 }*
}* .. N11, TO AVOID HAVING SPACE AFTER COLON, TO }*
}* AVOID HAVING SPACE AFTER ( BEFORE MATCHED, ETC. }*
}* PLAYFULLY CORRECT YOUR PROGRAM TO BE LIKE THIS. }*
}* PLAY IT, AND HAVE FUN!!! GOOD LUCK. --ARISTO }*
((DATA TICKET ))
(LET WIPE-CLEAR-GAME-MESSAGE-AREA BE (( ))
((
(( 1 ; 500 ; 1024 ; 760 ; 0 => RECTFILL ))
)) OK)
(LET WIPE-CLEAR-GAME-BOARD-AREA BE (( >N1 ))
((
(( 101 ; 101 ; 399 ; 399 ; N1 => RECTFILL ))
)) OK)
(LET TELL-SOMETHING-GOOD BE (( ; ))
((
(( ; 120 ; 550 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-SECOND-LINE BE (( ; ))
((
(( ; 120 ; 600 => B9-POP ))
)) OK)
(LET TELL-SOMETHING-GOOD-THIRD-LINE BE (( ; ))
((
(( ; 120 ; 650 => B9-POP ))
)) OK)
(LET GET-A-GOOD-TICKET-TO-RIDE BE (( ))
((
(( 100000 TICKET <<ASSERT ))
(( 1,000,000,000 => RICH
(COUNT
(( KEYTOUCH
(MATCHED
(( N1 TICKET <<ASSERT ))
(( RMS RMS ; EXIT ))
MATCHED) ))
COUNTUP) ))
)) OK)
(LET USE-THE-TICKET-TO-TRAVEL-FAR BE (( ))
((
(( TICKET >>>
(COUNT
(( N1 => >N1 ))
COUNTUP) ))
)) OK)
(LET BEAUTIFUL-CONTENT-OF-FRAME BE (( ))
((
(( :@@@@@@@@SUPERBT!!! ; 120 ; 150
=> B9-POP ))
(( :@@@FIGHT_WELL! ; 120 ; 200
=> B9-POP ))
(( :@@@SCORE_MUCH! ; 120 ; 250
=> B9-POP ))
)) OK)
(LET GET-A-WONDERFUL-SENSE-OF-TIMING BE (( ))
((
(( }Dear master of this game!} =>
TELL-SOMETHING-GOOD ))
(( }Please press lineshift, wait a little,} =>
TELL-SOMETHING-GOOD-SECOND-LINE ))
(( }and press it again, to indicate game speed.} =>
TELL-SOMETHING-GOOD-THIRD-LINE ))
(( A-KEY ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( GET-A-GOOD-TICKET-TO-RIDE ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( }Thanks! Lineshift to begin} =>
TELL-SOMETHING-GOOD ))
(( }Have courage! Be brave! Win win win!}
TELL-SOMETHING-GOOD-SECOND-LINE ))
)) OK)
(LET SHOW-FUN-AT-FOUR-TIMES-THE-SPEED BE (( ))
((
(( TICKET >>> ; ))
(( ; TICKET >>> ; 4 => DIV
TICKET <<ASSERT ; ))
(( ; 3
(COUNT
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*YOU ARE ELECTRIC!*} ; 110 ; 350 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*EEEELLLECTRIC!!!*} ; 175 ; 250 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 191 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( }*ELECTRICITY!*} ; 220 ; 110 => B9-POP ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( 128 => WIPE-CLEAR-GAME-BOARD-AREA ))
COUNTUP) ; ))
(( ; TICKET <<ASSERT ))
)) OK)
((DATA THE-SCORE ))
((DATA PLAYERS-ROW-NUMBER ))
((DATA PLAYERS-COLUMN-NUMBER ))
((DATA TREASURE-ROW-NUMBER ))
((DATA TREASURE-COLUMN-NUMBER ))
((DATA USE-THIS-GREEN-TONE ))
(LET EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS BE (( ))
((
(( }GAME-CONTROLS:} ; 750 ; 100 => B9-POP ))
(( } Y F } ; 750 ; 125 => B9-POP ))
(( } G H} ; 750 ; 150 => B9-POP ))
(( } B} ; 750 ; 175 => B9-POP ))
)) OK)
(LET SHOW-THE-GAMER-HER-PRESENT-SCORE BE (( ))
((
(( }S C O R E >>> } ;
450 ; 300 => B9-POP ))
(( }S C O R E >>> } ; THE-SCORE >>>
=> CONCAT ; 450 ; 300 => B9-POP ))
)) OK)
(LET BIG-PIXEL-HERE BE (( >N11 >N1 ))
((
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*
(( N1 ; 13 => MUL ;
88 => ADD => >N1 ))
(( N11 ; 13 => MUL ;
88 => ADD => >N11 ))
}* ***NEW PART OF PROGRAM ABOVE HERE**** }*
(( N1 ; N11 ; BRIDGE 4 ADD ;
BRIDGE 4 ADD ; 191 => RECTFILL ))
)) OK)
(LET GAMER-SYMBOL BE (( ))
((
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*
(( PLAYERS-COLUMN-NUMBER >>> => >N1 ))
(( PLAYERS-ROW-NUMBER >>> => >N3 ))
}* ***NEW PART OF PROGRAM ABOVE HERE**** }*
(( N1 => INC ; N3 => BIG-PIXEL-HERE ))
(( N1 ; N3 => INC => BIG-PIXEL-HERE ))
(( N1 ; 3 => ADD ;
N3 => INC => BIG-PIXEL-HERE ))
(( N1 => INC ;
N3 ; 3 => ADD => BIG-PIXEL-HERE ))
)) OK)
(LET TREASURE-SYMBOL BE (( ))
((
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*
(( TREASURE-COLUMN-NUMBER >>> => >N1 ))
(( TREASURE-ROW-NUMBER >>> => >N3 ))
}* ***NEW PART OF PROGRAM ABOVE HERE**** }*
(( N1 ; 3 => ADD ; N3 => BIG-PIXEL-HERE ))
(( N1 => INC => INC ; N3 => INC => BIG-PIXEL-HERE ))
(( N1 => INC ; N3 => INC => INC
=> BIG-PIXEL-HERE ))
)) OK)
}* ****NEW PART OF PROGRAM FOLLOWS HERE:***** }*
}* LOTS OF COMMENT LINES LIKE THIS, HERE, -- DON'T HAVE TO TYPE'EM! }*
}* JUST TYPE IN THE PROGRAM E X A C T L Y AND CHECK IT, LINE FOR }*
}* LINE, AND YOU HAVE A WORKING GAME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! }*
}* BUT OMIT ALL THESE LINES WITH A CURLY BRACKET FOLLOWED BY STAR. }*
((DATA GAME-CONTINUES GAME-CONTINUES => SETDANCE ))
((DATA QUANTITY-OF-TREASURES QUANTITY-OF-TREASURES => SETDANCE ))
}* THIS CONTAINS NUMBER OF TREASURES, AND WE }*
}* BEGIN WITH 1, AND INCREASE A LITTLE AS }*
}* THE DURATION OF THE GAME INCREASES. }*
((DATA GAME-BOARD 20 ; 20 => RAM-PM
GAME-BOARD <<ASSERT ))
}* NOTE: DIRECTIONS ARE 12, 15, 18, 21 AS A CLOCK. }*
}* THE GAME-BOARD HAS SUCH DIRECTIONS FOR THE }*
}* TREASURES. GAMER SYMBOL NOW ONLY MOVES BY KEY, }*
}* IN GAME-ACTION. }*
(( LOOKSTK ))
}* SEE NOTE ABOUT (COUNT INSIDE (COUNT LOOP AND ABOUT }*
}* FUNCTIONS WITH, AND, ISPRO FURTHER IN PROGRAM. }*
}* THIS ADDS SCORE AND REMOVES TREASURES WHEN THEY ARE }*
}* NEAR THE GAMER SYMBOL, AND IT IS CALLED AT "F". }*
}* NOTE THAT ADDVAR DOES THE SAME THING AS ADD, }*
}* FOLLOWED BY <<ASSERT -- ONE OF THE }*
}* NICE QUICKIES. SCORE GETS MUCH HIGHER WHEN MORE }*
}* COMPLICATED BOARD, FULL OF TREASURES ONE MUST }*
}* AVOID BUMPING INTO. }*
(LET CAPTURE-TREASURE-WHEN-NEAR BE (( ))
((
(( GAME-BOARD >>> => & ))
(( 20
(COUNT
(( 20
(COUNT
(( PLAYERS-COLUMN-NUMBER >>> => >N8 ))
(( PLAYERS-ROW-NUMBER >>> => >N9 ))
(( N1 ; (( N8 2 SUB )) ; (( N8 4 ADD )) => WITH ;
N3 ; (( N9 2 SUB )) ; (( N9 4 ADD )) => WITH => AND
(MATCHED
(( N1 ; N3 ; # => GM => ISPRO
(MATCHED
(( 100 ;
QUANTITY-OF-TREASURES >>> => MUL ;
THE-SCORE => ADDVAR ))
(( 0 ; N1 ; N3 ; # => PM ))
(( -1 ; QUANTITY-OF-TREASURES => ADDVAR ))
MATCHED) ))
MATCHED) ))
COUNTUP) ))
COUNTUP) ))
(( && ))
)) OK)
}* NEXT FUNCTION IS FIXED-ON COPY OF THE ABOVE, }*
}* BUT WITHOUT SCORE ADDED IN THE MIDDLE. }*
}* IT IS CALLED WHEN F IS NOT CLICKED. }*
(LET FINISH-IF-NEAR-TREASURE-WITHOUT-F BE (( ))
((
(( GAME-BOARD >>> => & ))
(( 20
(COUNT
(( 20
(COUNT
(( PLAYERS-COLUMN-NUMBER >>> => >N8 ))
(( PLAYERS-ROW-NUMBER >>> => >N9 ))
(( N1 ; (( N8 DEC )) ; (( N8 3 ADD )) => WITH ;
N3 ; (( N9 DEC )) ; (( N9 3 ADD )) => WITH => AND
(MATCHED
(( N1 ; N3 ; # => GM => ISPRO
(MATCHED
(( GAME-CONTINUES => SETBASIS ))
MATCHED) ))
MATCHED) ))
COUNTUP) ))
COUNTUP) ))
(( && ))
)) OK)
(LET SYMBOL-ADD-XY BE (( >N2 >N1 ))
((
(( PLAYERS-COLUMN-NUMBER >>> => >N8 ))
(( PLAYERS-ROW-NUMBER >>> => >N9 ))
(( N1 ; N8 => ADD ; 1 ; 20 => SET-RANGE => >N8 ))
(( N2 ; N9 => ADD ; 1 ; 20 => SET-RANGE => >N9 ))
(( N8 PLAYERS-COLUMN-NUMBER <<ASSERT ))
(( N9 PLAYERS-ROW-NUMBER <<ASSERT ))
}* WASN'T THAT NEAT? THE SET-RANGE ENSURES THAT YOU GET }*
}* NUMBERS WHICH ARE KEPT WITHIN A RANGE, HERE, 1 TO 20. }*
}* EXERCISE: TRY AND REWRITE THIS FUNCTION ENTIRELY WITHOUT }*
}* THE USE OF ANY N1, N2, .. N11, PUTTING TWO SEMICOLONS }*
}* INSIDE THE BE (( )) SO IT BECOMES BE (( ; ; )) }*
}* IT'S PROBABLY MORE THAN ONE WAY TO REWRITE IT, IT OFTEN IS. }*
}* ANOTHER THING: NOWHERE IN THIS PROGRAM DO WE USE GOLABEL: }*
}* AND THE GOUP1 .. GOFORWARD1 .. BUT IF YOU SEE THE F3DOCS }*
}* MANUAL, YOU CAN LEARN ABOUT THIS SIMPLE THING. WHY DON'T }*
}* YOU TRY TO PUT IT IN INSTEAD OF A (COUNT .. COUNTUP) WHERE }*
}* THE COUNT-LOOP IS GIVEN A VERY LARGE NUMBER LIKE 1000000? }*
}* SPEND TIME WITH IT! THE GOLABEL/GOUP/GOFORWARD DOESN'T USE }*
}* THE STACK, SO THERE IS NO RMS NOR ANY N1 COUNTER THEN. }*
}* AND THOUGH WE DON'T NEED WARPS IN THIS GAME, LOOK UP THE }*
}* QUESTION-MARK AND THE WORD HYPERCONNECT (OR JUST H ) }*
}* AND START EXPERIMENTING WITH IT A LITTLE BIT AT LEAST WHEN }*
}* YOU HAVE TIME. IT IS GOING TO BE HANDLED IN NEXT BOOKLET! }*
)) OK)
(LET GAME-ACTION BE (( ))
((
(( KEYTOUCH
(MATCHED
(( KEY ; ))
}* NEXT LINE ALLOWS EXIT IF BACKSPACE IS PRESSED. IT HAS A NUMBER, '8'. }*
(( ; => ONE ; '8' => EQ
}* THE WORD 'ONE' MEANS MAKE ONE COPY OF WHAT'S ON TOP OF STACK. }*
}* USE EQ FOR TEXTS AND FOR KEY, EQN FOR NUMBERS AND KEYNUM. }*
}* THE PECULIAR PHRASE '8' MEANS CONVERT THIS NUMBER INTO CHARACTER.}*
(MATCHED
}* WHEN MATCH, WE REMOVE (RM) THE COPY OF WHAT KEY THE USER PRESSED: }*
(( ; RM ))
(( GAME-CONTINUES => SETBASIS ))
}* SETBASIS, THEN, SETS TO BASIS (ZERO), WHILE SETDANCE TO DANCE (ONE). }*
}* THE FUNCTION 'EXIT', NEXT, EXITS ONLY FROM PRESENT FUNCTION. }*
(( EXIT ))
)(OTHER
}* IN NEXT LINES, WE USE THE = .. == .. === STYLE, WHICH IS }*
}* SHORT-HAND FOR (MATCHED .. )(OTHER .. MATCHED), SEE NEXT FUNCTION ALSO.}*
}* ALL THE SEMICOLONS, THE ; SIGNS, MEAN NOTHING TO THE PC. THEY ARE }*
}* BUT A REMINDER THAT SOMETHING IS ON THE STACK, NAMELY THE KEY PRESSED. }*
}* THE FUNCTION UPCM MEANS PUT TO UPPERCASE, ON THE MAIN STACK. }*
(( ; => UPCM => ONE ; :F => EQ
= CAPTURE-TREASURE-WHEN-NEAR ; ==
}* THE NEXT FUNCTION IS CALLED WHEN ANYTHING BUT F CLICKED }*
; FINISH-IF-NEAR-TREASURE-WITHOUT-F
; => ONE ; :H => EQ
= 4 ; 0 => SYMBOL-ADD-XY ; ==
; => ONE ; :G => EQ
= -4 ; 0 => SYMBOL-ADD-XY ; ==
; => ONE ; :Y => EQ
= 0 ; -4 => SYMBOL-ADD-XY ; ==
; => ONE ; :B => EQ
= 0 ; 4 => SYMBOL-ADD-XY ;
=== === === === ===
MATCHED) ; ))
(( ; RM ))
)(OTHER
(( FINISH-IF-NEAR-TREASURE-WITHOUT-F ))
MATCHED) ))
(( MANUAL-CLEAR-KEYBUF ))
)) OK)
(( LOOKSTK ))
}* THE MANUAL-CLEAR-KEYBUF CLEARS ALL CHARACTERS FROM }*
}* BEING STORED UP IF RAPID CLICKING ON KEYBOARD HAS TAKEN }*
}* PLACE. THIS IS IMPORTANT SINCE ONLY ONE CLICK IS }*
}* IS PROCESSED PR EACH 'TICK' TO KEEP INTERACTIVENESS. }*
}* THE NEXT FUNCTION USES ^4 FR GETV TO GET A FREE FUNNY }*
}* NUMBER SUITABLE FOR GAMING AND VARIABLE RESPONSES WHICH }*
}* IN THIS CASE VARIES FROM 1 TO 4. THIS IS CONVERTED TO }*
}* CLOCK NUMBER DIRECTIONS 12, 15, 18, 21. YOU NOTICE THE }*
}* COMPLETING LINE HAS N3 => => WHERE THE ARROWS }*
}* ARE DOUBLE AS OUR CONVENTION TO SAY: SOMETHING IS }*
}* LEFT ON THE STACK AFTER THIS FUNCTION HAS BEEN }*
}* PERFORMED, AND THIS OUGHT TO BE PICKED UP BY THE PLACE }*
}* WHERE THIS FUNCTION IS BEING CALLED (WHICH IS NEXT FUNC.)}*
(LET GET-A-FUNNY-FREE-DIRECTION BE (( ))
((
(( ^4 FR GETV => >N1 ))
(( N1 ; 1 => EQN = 15 => >N3
== N1 ; 2 => EQN = 18 => >N3
== N1 ; 3 => EQN = 21 => >N3
== 12 => >N3
=== === === ))
(( N3 => => ))
)) OK)
}* THE NEXT IS MODIFIED FROM A COPY OF SOME OF THE COUNT STUFF ABOVE. }*
}* WHEREAS .. => DIV IS A WHOLE NUMBER DIVISION, ONE CAN }*
}* USE THE DECIMAL NUMBER STACK, MENTIONED IN NEXT BOOKLET, }*
}* TO CALCULATE E.G. $8000 $5000 => \R => RICHTOSTK => POP }*
}* GIVES 1.6, APPROXIMATELY THE GOLDEN MEAN. DIVISION IS \ AND }*
}* THE R AFTER IT MEANS USE THE RICH NUMBER STACK, WITH DECIMALS. }*
}* A DOLLAR SIGN BEFORE NUMBERS ALSO MEANS USE RICH NUMBER STACK. }*
}* IF YOU LIKE, LOOK UP FUNCTION RICHTOSTK IN THE MANUAL. }*
}* BUT WE DON'T NEED ANYTHING OF THIS HERE. WHAT WE NEED IS TO }*
}* GRADUALLY, BUT NOT TOO QUICKLY, UP THE NUMBER OF TREASURES. }*
}* BY DECREASING THE NUMBER FED TO DIV IT GOES MORE QUICKLY UP.}*
(LET UPDATE-QUANTITY-OF-TREASURES BE (( >N9 ))
((
(( N9 ; 8 => DIV => INC => >N9 ))
(( QUANTITY-OF-TREASURES >>> ; N9 => INTGREATER
(MATCHED
(( EXIT ))
MATCHED) ))
}* IN THE MIDDLE OF THE COUNT LOOP, THE N9 ABOVE }*
}* MYSTERIOUSLY BECOMES N11, SOME HINTS ABOUT WHY ARE GIVEN }*
}* IN COMMENTS ABOUT COUNT LOOPS FURTHER AHEAD IN THIS PROGRAM! ;-) }*
}* NOTICE ALSO THE VERY CLEVER FUNCTION NOT WHICH IS AT A }*
}* LINE BY ITSELF AFTER THE ..WITH..WITH..AND STUFF, HERE. }*
}* YES => NOT GIVES NO WHILE NO => NOT GIVES YES. }*
}* WHAT WE'RE DRIVING AT HERE IS TO INSERT TREASURES AT GOOD }*
}* DISTANCE FROM THE GAMER SYMBOL. WE TRY A CERTAIN NUMBER OF }*
}* TIMES, THEN AFTER THAT NUMBER OF TIMES, WE DON'T PUSH IT. }*
(( GAME-BOARD >>> => & ))
(( 20 ; N9 => MUL
(COUNT
(( PLAYERS-COLUMN-NUMBER >>> => >N8 ))
(( PLAYERS-ROW-NUMBER >>> => >N9 ))
}* NOTE THAT INSIDE A COUNT LOOP WE'VE GOTTA WATCH OUT TO }*
}* STORE TEMPORARY STUFF NOT IN THE N1 AND N2 USED BY THE COUNT, }*
}* MORE COMMENTS ABOUT THIS ELSEWHERE IN PROGRAM, MORE IN F3DOCS. }*
(( 20 => FUNNYRFFG => >N4 ))
(( ^20 FR GETV => >N6 ))
(( N4 ; (( N8 3 SUB )) ; (( N8 5 ADD )) => WITH ;
N6 ; (( N9 3 SUB )) ; (( N9 5 ADD )) => WITH => AND
=> NOT
(MATCHED
(( N4 ; N6 ; # => GM => ISBASIS
(MATCHED
}* ISBASIS MEANS IT'S NOTHING THERE. INCVAR MEANS: ADD ONE TO THE VARIABLE. }*
(( QUANTITY-OF-TREASURES => INCVAR ))
(( QUANTITY-OF-TREASURES >>> ; N11 => INTGREATER
(MATCHED
}* THE NEXT LINE IS A GENTLE WAY TO EXIT THIS LOOP, WHEN ENOUGH. }*
}* THE DEEPER REASON IS THAT N2, INSIDE A COUNT, HAS THE TOP-COUNT. }*
(( N2 => >N1 ))
MATCHED) ))
MATCHED) ))
}* THIS WAS NOT MUCH PLANNED, BUT SEEMS RIGHT: IF THERE IS ALREADY A }*
}* TREASURE THERE, IT M I G H T GET A NEW DIRECTION. WHY NOT?! }*
(( GET-A-FUNNY-FREE-DIRECTION ; N4 ; N6 ; # => PM ))
MATCHED) ))
COUNTUP) ))
(( && ))
)) OK)
(LET DO-THE-MOTIONS BE (( ))
((
(( GAME-BOARD >>> => & ))
}* USING ONLY THE SAME VOCABULARY OF FUNCTIONS AS WE HAVE ALREADY }*
}* USED, WE GO THROUGH THE GAME-BOARD, EVERY PLACE IN IT (20X20) }*
}* AND MOVE EACH TREASURE SYMBOL TO THE PLACE IT OUGHT TO GO. }*
}* WE ADD A NUMBER -- 10,000 -- EACH TIME WE HAVE MOVED ONE, }*
}* SO THAT, IF WE RUN INTO IT ONCE MORE DURING THE LOOP-INSIDE- }*
}* THE-LOOP-OF-20-COLUMNS-AND-20-ROWS, WE DON'T MOVE IT TWICE. }*
}* BUT THEN WE GOTTA LOOP THROUGH IT AGAIN, GETTING THE NUMBERS }*
}* FIXED BACK TO THE ORIGINAL. HOWEVER 20X20=400 IS A SMALL LOOP }*
}* FOR THE COMPUTER DOES A LOT MORE THAN THAT IN A SPLIT SECOND. }*
(( 20
(COUNT
(( 20
(COUNT
}* NOTE THAT A (COUNT INSIDE A (COUNT MEANS THAT N3 BECOMES THE }*
}* COUNTER FOR THE OUTER LOOP, WHILE N1 THE INNER LOOP, AND ANY }*
}* PREVIOUS USE OF N1, N2, ETC, GETS CHANGED UP TO N4, N5, ETC. }*
}* THE VALUES OF N1..N11 ARE LOCAL TO EACH FUNCTION, BUT }*
}* EACH COUNT-LOOP PUSHES TWO NEW NUMBERS TO THIS 'SIMPLESTACK'.}*
}* THE FUNCTION INTGREATER COMPARES TWO NUMBERS FOR SIZE, }*
}* SO THAT 100 ; 10 => INTGREATER GIVES A YES, }*
}* WHILE THE FUNCTION ISPRO GIVES YES FOR VALUES ABOVE 0. }*
}* THEN, THE FUNCTION AND GIVES YES WHEN BOTH OF ITS INPUTS }*
}* ARE YES. SO THE NEXT CHECK IS WHETHER THE NUMBER IS NONZERO }*
}* BUT NOT TOO BIG: }*
(( N1 ; N3 ; # => GM => >N10 ))
(( 10000 ; N10 => INTGREATER ;
N10 => ISPRO => AND
(MATCHED
(( N1 => >N8 ))
(( N3 => >N9 ))
}* IN THE NEXT LINES, A SHORTER FORM OF (MATCHED..)(OTHER..MATCHED) }*
}* IS USED, NAMELY = .. == .. ===. WE MOVE TREASURES AROUND GIVEN }*
}* A CHECK ON WHICH OF THE FOUR DIRECTIONS THEY ARE MOVING. WE ALSO }*
}* HAVE TO DEAL WITH THOSE GOING OFF LIMIT, OTHERWISE PROGRAM CRASHES. }*
(( N10 ; 15 => EQN
= INCN8 ==
N10 ; 18 => EQN
= INCN9 ==
N10 ; 21 => EQN
= DECN8 ==
DECN9
}* THE RULE IS: ONE === FOR EACH =, NOT COUNTING THE ==. HERE, 3: }*
=== === ===
}* THE NEXT FUNCTION WITH GIVES A YES WHEN WITHIN GIVEN RANGE. }*
(( N8 ; 1 ; 20 => WITH ;
N9 ; 1 ; 20 => WITH => AND
(MATCHED
(( N10 ; 10000 => ADD ; N8 ; N9 ; # => PM ))
MATCHED) ))
(( 0 ; N1 ; N3 ; # => PM ))
MATCHED) ))
COUNTUP) ))
COUNTUP) ))
(( 128 => WIPE-CLEAR-GAME-BOARD-AREA ))
(( 191 USE-THIS-GREEN-TONE <<ASSERT ))
(( 20
(COUNT
(( 20
(COUNT
(( N1 ; N3 ; # => GM ; 10000 => INTGREATER
(MATCHED
(( N1 ; N3 ; # => GM ; 10000 => SUB ;
N1 ; N3 ; # => PM ))
(( N1 TREASURE-COLUMN-NUMBER <<ASSERT ))
(( N3 TREASURE-ROW-NUMBER <<ASSERT ))
(( TREASURE-SYMBOL ))
MATCHED) ))
COUNTUP) ))
COUNTUP) ))
(( GAMER-SYMBOL ))
}* DID YOU COUNT ONE COUNTUP) FOR EACH (COUNT, AND ONE }*
}* MATCHED) FOR EACH (MATCHED, IN THE ABOVE? THE USE OF }*
}* THE TABL (TABULATOR) KEY HELPS ENORMOUSLY TO ORGANISE }*
}* A FUNCTION WHEN IT HAS SUCH A HIEARCHY AS THIS. }*
(( && ))
}* NOTE THAT ANYTHING YOU STORE WITH ((DATA .. )) STAYS ON DURING }*
}* THE PROGRAM, TYPICALLY. THE & STUFF WITH THE # STUFF AND && }*
}* STUFF IS ALL ABOUT A SHORTCUT, SO WE DON'T HAVE TO REPEAT }*
}* THE LONG NAME OVER AND OVER AGAIN. NO DATA IS REALLY LOST WHEN }*
}* THE FUNCTION DOES THE && AT ITS COMPLETING LINE. ALL RIGHT? }*
)) OK)
}* THE LOOKSTK ON THE NEXT LINE MIGHT TELL IF THERE IS AN ISSUE }*
}* ABOUT THE HIERARCHY IN THE FUNCTIONS ABOVE IT. }*
}* BUT IF YOU LEAVE OUT THE OK) IT CAN MAKE VERY PECULIAR ERRORS, }*
}* WHICH USUALLY THEN ARE SHOWN AS SYNTAX ERRORS AT THE NEXT (LET }*
(( LOOKSTK ))
(LET GET-ON-WITH-THE-GAME BE (( ))
((
(( GAME-BOARD >>> => & ))
(( EXPLAIN-TO-THE-GAMER-SOME-GAME-CONTROLS ))
(( THE-SCORE => SETBASIS ))
(( SHOW-THE-GAMER-HER-PRESENT-SCORE ))
}* THE NEXT ROW.. AND COLUMN.. ARE SWAPPED AROUND, COMPARED TO BEFORE: }*
(( 15 PLAYERS-COLUMN-NUMBER <<ASSERT ))
(( 5 PLAYERS-ROW-NUMBER <<ASSERT ))
(( # => CLEAR-MATRIX ))
(( 5 TREASURE-COLUMN-NUMBER <<ASSERT ))
(( 15 TREASURE-ROW-NUMBER <<ASSERT ))
(( 15 ; 5 ; 15 ; # => PM ))
}* THIS MEANS: DIRECTION 15 FOR A TREASURE AT X 5 AND Y 15. }*
(( 191 USE-THIS-GREEN-TONE <<ASSERT ))
(( GAMER-SYMBOL ))
(( TREASURE-SYMBOL ))
(( 1000000000
(COUNT
(( GAME-ACTION ))
(( GAME-CONTINUES => VISDANCE
(MATCHED
(( N1 => UPDATE-QUANTITY-OF-TREASURES ))
(( DO-THE-MOTIONS ))
(( SHOW-THE-GAMER-HER-PRESENT-SCORE ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
)(OTHER
(( }***GAME DONE! USED } ; N1 => CONCAT ;
} TICKS TO SCORE } => CONCAT ;
THE-SCORE >>> => PRETTIFY-NUMBER => CONCAT ;
} POINTS.} => CONCAT ;
50 ; 50 => B9-POP ))
(( N2 => >N1 ))
}* THIS SAYS: PUT COUNTER TO FINISH-VALUE. EXIT LOOP. }*
MATCHED) ))
COUNTUP) ))
(( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED ))
(( TICKET >>> ; 10 => MUL TICKET <<ASSERT ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( && ))
)) OK)
}* ***NEW PART OF PROGRAM ABOVE HERE**** }*
(LET SUPERBT BE (( ))
((
(( GJ-ON ))
(( }MY DEAR GAMER! You must be sure} ;
10 ; 10 => B9-POP ))
(( }that you don't get absolutely addicted} ;
10 ; 50 => B9-POP ))
(( }to me. -- The program. ENTER if you dare!} ;
10 ; 90 => B9-POP ))
(( A-KEY ))
(( CLS ))
(( 100 ; 100 ; 400 ; 400 ; 1
=> RECT ))
(( BEAUTIFUL-CONTENT-OF-FRAME ))
(( GET-A-WONDERFUL-SENSE-OF-TIMING ))
(( SHOW-FUN-AT-FOUR-TIMES-THE-SPEED ))
(( USE-THE-TICKET-TO-TRAVEL-FAR ))
(( WIPE-CLEAR-GAME-MESSAGE-AREA ))
(( GET-ON-WITH-THE-GAME ))
(( GJ-DONE ))
)) OK)
(LET AUTOSTART BE SUPERBT OK)
}* IF YOU DON'T GET IT TO WORK AFTER TYPING IT IN, IT }*
}* IS LIKELY TO BE SOMETHING WHICH IS THERE, BUT HARD TO SEE }*
}* WITHOUT LOOKING AT E V E R Y LINE AFTER A WALK, -- }*
}* TRY THEN, IF THERE IS A MYSTERIOUS SUDDEN PROGRAM EXIT }*
}* WHILE YOU RUN THE PROGRAM, TO REMOVE THE CALL TO ONE FUNCTION, }*
}* BY PUTTING COMMENT SYMBOLS AROUND IT. THEN PUT IT BACK IF NO }*
}* CHANGE, AND PUT COMMENT SYMBOLS AROUND ANOTHER. }*
}* OR, PUT FOUR STARS **** ON LINE BEFORE A LOOP, AND LEFT-CURL }*
}* ON THE LINE AFTER, TO CHECK IF IT IS THAT LOOP CAUSING IT. }*
}* A TOO MUCH >N5 CAN REMOVE TOO MUCH ON STACK, OR A LACKING }*
}* && CAN FILL IT TOO MUCH; A CHANGE OF SEQUENCE OF NUMBERS }*
}* CAN MAKE A MATRIX SCREWED UP -- THERE ARE VERY MANY WAYS ONE }*
}* CAN MESS IT UP, AND IT IS A KIND OF GAME IN ITSELF TO GET IT }*
}* ENTIRELY RIGHT. }*
}* HEAD UP, TIGER, AND CORRECT ALL PROGRAM ISSUES, AND HAVE FUN! }*
}* IN NEXT BIG ART BOOKLET, WE GO INTO BOTH 3D A N D WARPS! }*
}* SEE YA! }*