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! }*