Vrámci vspomínania na IT krúžky v období 8-bitových počítačov som vytiahol starý pracovný zošit so zdrojovými kódmi hry s húsenicou. Logika hry je vlastne rovnaká ako neskôr rozšírená hra SNAKE na telefónoch Nokia. Vyhýbať sa stenám a otrave, pojedať len listy, pritom rast húsenice sťažuje neskoršie manévrovanie po obrazovke.
Skúsim najskôr zanalyzovať verzie pre PMD85 a PP01, ktoré príručka obsahuje. Porovnám ich voči sebe, v čom sa odlišujú a na záver vyrobím svoju verziu pre iný počítač.Verzia pre PMD85
Tieto počítače boli v tom období na Slovensku v krúžkoch asi najrozšírenejšie, aspoň v mojom okolí. Počítač ako dielo jedného človeka (Roman Kišš) z dielov ktoré zohnal ako zamestnanec Tesly Piešťany.
Pre odskúšanie funkcie som použil emulátor PMD85 od bratov Bórikovcov, ktorí zhotovili emulátor ako pre PMD85 tak aj pre PP01.
Zdrojový kód som preďatloval a prvé čo nastalo bolo hľadanie preklepov. Musím poznamenať, že som si na začiatok vybral počítač s menším priestorom pre BASIC a teda odľaďovanie nebolo také pohodlné ako na PP01. Skôr som prehľadával textový dokument zdrojového kódu ako ťukal na PMD.
Po rozbehaní programu ostali ešte nejaké logické chyby a tak nastal čas pre okomentovanie zdrojáku pre pochopenie jednotlivých častí programu a premenných.
1 REM ** WURMI **
5 GOSUB1000 # uvodna stranka
10 SCALE0,1,0,1
15 GCLEAR
20 DEFFNCA(WW)=6*WW+40 # funkcia FNCA(X) vrati lavy pixel (os x) pre dany znak v poradi
21 DIMX(999),Y(999) # do poli x()y() budu vkladane suradnice husenice, cyklicky
22 FORI=1TO6:READA:HT$=HT$+CHR$(A):NEXT # do HT$ vlozi znak ?
25 DATA45,12,0,18,45,18
30 FORI=1TO6:READA:P$=P$+CHR$(A):NEXT # do P$ vlozi znak plota
40 DATA21,42,21,42,21,42
50 FORI=0TO40:BMOVEI,FNCA(30):BPLOTP$,1:BMOVEI,40:BPLOTP$,1:NEXT # vykresli vrch a spod plotu
60 FORI=1TO29:BPLOTP$,1:NEXT # vykresli pravy plot
70 BMOVE0,46:FORI=1TO29:BPLOTP$,1:NEXT # vykresli lavy plot
80 FORI=1TO6:READA:T$=T$+CHR$(A):NEXT # do T$ vlozi znak tela husenice
90 DATA12,30,63,63,30,12,33,18,63,45,51,30
100 FORI=1TO6:READA:H$=H$+CHR$(A):NEXT # H$ hlava husenice
110 DATA97,82,76,76,82,97,12,18,33,51,12,30
120 FORI=1TO6:READA:N$=N$+CHR$(A):NEXT # N$ krizik (jed)
130 FORI=1TO6:READA:J$=J$+CHR$(A):NEXT # J$ list
140 BMOVE20,FNCA(15):BPLOTH$,1:BPLOTT$,1:BPLOTT$,1 # prva poloha husenice H+T+T
145 GOTO200
150 X=INT(RND(1)*39)+1:Y=INT(RND(1)*29)*6+46 # podprogram nahodna pozicia
160 BMOVEX,Y+3:IFUSR(-31501)>0THEN150 # ak je nieco na danej pozicii, pregeneruj
170 BMOVEX,Y:RETURN # kym x ide priamo po znakoch, y po 6ticiach pixelov
200 LI=50:KR=30 # na uvod 50 listov, 30 jedov
201 IFK<>ASC("J")THEN 209 # easter egg
202 LI=100:KR=100
209 FORI=1TOLI:GOSUB150:BPLOTJ$,1:NEXT # vykreslime listy
210 FORI=1TOKR:GOSUB150:BPLOTN$,1:NEXT # vykreslime jedy
220 FORI=0TO2:X(I)=17-I:Y(I)=20:NEXT:CM=2 # do poli x() a y() vlozime pozicie husenice, do cm jej dlzku
225 Z=2
227 A=1000
230 DISPCMTAB(10)"REKORD"RC # po vykresleni hracieho pola dole nahrane body a rekord
240 FORI=0TO3:READA(I),B(I):NEXT # nacitame do a() a b() poli posun osi x,y pre jednotlive klavesy
250 DATA0,-1,-1,0,1,0,0,1
260 BEEP # beep oznami hotovo
270 IN=INKEY:IFIN>3THEN270 # caka na prvu sipku
280 GOTO305 # prva klavesa je, skocime za citanie v hlavnom cykle
300 IFCM< 0THENFORI=1TO99:NEXT # --hlavny cyklus
301 IN=INKEY # nacitame klaves
305 IFIN<4THENM=IN # ak je sipka, dame do m
310 Q=Z-CM:IFQ<0THENQ=Q+A # q (koniec husenice) = z (zaciatok) - cm (dlzka)
340 Z1=Z+1:IF Z1 > A THEN Z1=Z1-A # zaciatok posunieme v poli, ak pretieklo, ideme od zaciatku
350 X(Z1)=X(Z)+A(M):Y(Z1)=Y(Z)+B(M) # nova pozicia hlavy podla a()b() pre poslednu sipku
360 BMOVEY(Z1),FNCA(X(Z1))+4:C=USR(-31501) # pozrieme na novu poziciu co tam je, nez tam pojdeme kreslit
362 BMOVEY(Q),FNCA(X(Q)):BPLOTT$,1:X(Q)=0:Y(Q)=0 # na konci husenice vycistime pole
365 BMOVEY(Z),FNCA(X(Z)):BPLOTHT$,1 # na zaciatok hlava
370 Z=Z1:BMOVEY(Z),FNCA(X(Z)):IFC=0THENBPLOTH$,1:GOTO300 # prazdne policko, kreslime hlavu a nazad
380 IFC<>12THEN500 # nieje to list, skocime na ukoncenie
385 BPLOTJ$,1 # je to list, pokracujeme
387 BMOVEY(Z),FNCA(X(Z)):BPLOTH$,1 # prekreslime list hlavou
390 OUT134,1:CM=CM+1:DISPCM # po zjedeni listu zvacsime dlzku
400 GOSUB150:BPLOTJ$,1:OUT134,0 # a pridame na nahodne miesto novy list
402 OUT134,2:FORI=1TO20:NEXT:OUT134,3:FORI=1TO20:NEXT:OUT134,0 # zahrame
410 IFCM<> 0THEN300 # --koniec hlavneho cyklu
420 DISP"DOBRE,VIDIM ZE SI PROFESIONAL..." # dosiahnuta urcita dlzka, pochvala
430 FORI=1TO200:OUT134,1:OUT134,0: NEXT
440 DISP"HHHHHHHH"
450 DISPCMTAB(10)"REKORD"RC
460 GOTO300 # --koniec hlavneho cyklu
500 REM--KONIEC # ukoncovacia sekcia
501 GOSUB1220 # zahra hudba
502 IFC=18THENDISP"NAZRAL SOM SA JEDU!!"
503 IFC=30THENDISP"SAM SEBA NEZERIEM!!"
505 CM$=MID$(STR$(CM),2)
507 IFC=21THENDISP"HLAVOU MUR NEPRERAZIM !"
530 OUT134,0
535 POKE-15878,176
540 Q=75:IFCM>9THENQ=50 # do Q pocita posun od lava
550 IFCM>99THENQ=25 # pre rozny pocet cifier
560 IFCM>999THENQ=0
570 SCALE0,255,0,242
580 MOVEQ,30 # posunie
585 POKE-16326,0
590 LABEL8,20;CM$ # vypise velikanskym pocet bodov
595 POKE-16326,0
600 FORI=1TO200:OUT134,RND(1)*0:NEXT:OUT134,0
610 IF CM<=RCTHEN GOTO860 # nieje to rekord, preskoc
613 GCLEAR # vymaz a slavnostne oznam
614 DISP"HHHHHHH"
615 MOVE53,212
616 LABEL2,1.5;"V" # makcen
620 MOVE0,180
630 LABEL4,4;"ZOZRAL SI"
640 MOVE35,120
645 POKE-16326,0
650 LABEL3,6;CM$" LISTOV"
660 IFRC=0ANDCM<10THENRC=CM:GOTO900 # no nebolo to aspon 10
670 IFCM<=RCTHEN750
675 MOVE113,93
676 LABEL1,2;"/"
680 MOVE0,50
685 POKE-16326,0
690 LABEL2,6;"TO JE NOVY REKORD !!"
695 RC=CM # nastavili sme novy rekord
700 GOTO900
750 MOVE168,104 # vypis ze uz tu bolo lepsie skore
760 LABEL1,1;"V" # makcen
770 MOVE120,104
780 LABEL1,1;"/"
800 MOVE0,81
805 POKE-16326,0
810 LABEL1.9,3;" DOBRE, ALE DNES UZ SOM ZOZRAL"
820 MOVE2,50
830 LABEL4,2;RC"LISTOV"
850 GOTO 900
860 PRINT:PRINT:PRINT " CHCES HRAT ZNOVU ?"
870 GOTO 930
900 POKE-16326,0
905 MOVE63,23
906 LABEL1,1;"V" # makcene
907 MOVE123,23
908 LABEL1,1;"V"
910 MOVE0,0
920 LABEL2,3;" CHCES HRAT ZNOVU ?"
930 K=USR(-31583):IFK<>ASC("A")ANDK<>ASC("N")ANDK<>ASC("J")THEN930 # znovu ano/nie
940 POKE-15878,168
950 IFK=ASC("N")THENEND # nie, ukonci
955 RESTORE # inak ideme na zaciatok, za menu
960 T$="":H$="":P$="":HT$="":J$="":N$=""
970 GCLEAR:SCALE0,1,0,1
980 GOTO22
1000 GCLEAR:SCALE0,255,0,242 # podprogram uvodna obrazovka
1001 PRINT"K0 = VLAVO":PRINT"K1 = HORE",,"KME EF * 1984"
1002 PRINT"K2 = DOLE":PRINT"K3 = VPRAVO":PRINT:PRINT
1010 MOVE0,100
1020 LABEL5,8;"HUSENICA"
1040 MOVE40,165
1050 LABEL2,2;"/" # dlzen na U
1080 MOVE155,40
1100 DISP"STLAC K9"
1200 IFINKEY<>9THEN1200
1210 RETURN
1220 REM
1230 OUT134,3:FORI=1TO200:NEXT:OUT134,2:FORI=1TO150:NEXT # podprogram zvucka na koniec
1240 OUT134,1:FORI=1TO100:NEXT:OUT134,3:FORI=1TO200:NEXT
1250 OUT134,2:FORI=1TO150:NEXT:OUT134,1:FORI=1TO100:NEXT
1260 OUT134,0
1270 RETURN
Z programu možno zistiť pár špecifík pre PMD85:
- medzery sú v príkazoch takmer nepotrebné
- zvuk sa generuje príkazmi OUT 134,x kde x je 0 až 3, 0 deaktivuje zvuk
- pre zistenie, čo sa nachádza pod "kurzorom" posunutým cez BMOVE použijeme USR(-31501), ide o prvé desiatkové číslo z "data" pre daný obrázok, teda prvý riadok pixelov
- basic vie škálovať rozmery písma v oboch osiach (LABEL aj 20 násobok)
Zaujímavosťou je krátky kód potrebný pre posun húsenice. Zaručuje to plynulosť hry. Ide o riadky 300-370 tvoriace "jadro" pohybu ak nemusí ošetriť kolíziu.
Posun húsenice na osi X a osi Y je zapamätaný dekódovaním z polí A a B až po najbližšie stlačenie klávesy. Hlava a telo húsenice majú súradnice v poliach X a Y. Ako sa hlava posunie, pridá sa na pozíciu Z+1 v týchto poliach jej súradnica. Súradnice odchádzajúceho tela sa prepisujú na pozícii Q na 0,0. Premenná CM udržuje dĺžku. Po minutí všetkých 999 pozícíí (krokov húsenice) je ošetrené používanie polí X a Y zas od začiatku (Z1=Z1-A). Táto dátová štruktúra sa nazýva kruhový buffer.
Ďalšia verzia v poradí bude pre PP01, podľa všetkého exotickejší počítač ako PMD85.
Žiadne komentáre:
Zverejnenie komentára