sobota 31. července 2004

AnimAce - díl druhý: BASIC je báječné místo pro život

autor: George K.

Jak jsem slíbil minule, přišel čas pro nenáročnou hru - nemám sice za cíl ukázat vám, jak se píší hry, ale v BASICu se dost dobře animovat nedá a hra je ten nejlepší způsob, jak si to ukázat. Připravte si znakovou sadu z kapitoly 1.3.1 a hurá do toho...

Jednoduchá hra v BASICu

2.1 Neotřelý originální námět

Ještě než začnete přepisovat výpis programu do počítače, prozradím vám, o co ve hře půjde. Joe se nachází v místnosti plné lávek a jeho úkolem není nic překvapivějšího, než dostat se z té nejhořejší na tu nejspodnější. Aby to nebylo tak jednoduché, ne po každé lávce se dá bez problémů chodit a padat se smí pouze z omezené výšky. A teď ... hurá do opisování!!!
100 LET j$="!""%&#$'()*-.+,/0": LET lives=3: LET level=1
 102 GO SUB 1000
 104 GO SUB 1100
 106 GO SUB 1300
 110 IF konec=1 THEN LET lives=lives-1: BEEP 1,-10: IF lives>0 THEN GO TO 102
 112 IF konec=0 THEN GO TO 104
 120 CLS : PRINT AT 10,11;"GAME OVER"
 999 PAUSE 0: INK 0: PAPER 7: BORDER 7: CLS : STOP
1002 INK 7: PAPER 0: BORDER 0: CLS : PRINT AT 10,12;"LEVEL ";level
1004 PAUSE 0: CLS
1006 LET pad=0: LET konce=0: LET time=1000
1018 RESTORE (level-1)*10+9000
1020 READ y,x: LET pos=1
1022 READ lin,col,ink,pap,t$
1024 IF t$="" THEN GO TO 1200
1026 PRINT AT lin,col; INK ink; PAPER pap;t$: GO TO 1022
1102 IF INKEY$="s" THEN BEEP .1,1: PAUSE 0: PAUSE 0: BEEP .1,10: RETURN
1104 IF INKEY$="a" THEN LET konec=1: RETURN
1106 IF pad>0 THEN GO TO 1180
1108 IF INKEY$="o" THEN GO TO 1150
1110 IF INKEY$<>"p" THEN RETURN
1120 IF x=30 THEN RETURN
1132 GO SUB 1200
1134 IF pos=1 OR pos=13 THEN LET pos=5: GO TO 1200
1136 IF pos=5 OR pos=9 THEN LET pos=1: LETx=x+1: GO TO 1200
1150 IF x=1 THEN RETURN
1162 GO SUB 1200
1164 IF pos=9 OR pos=5 THEN LET pos=13: GO TO 1200
1166 IF pos=13 OR pos=1 THEN LET pos=9: LET x=x-1: GO TO 1200
1180 GO SUB 1200
1182 LET y=y+(y<20)
1200 PRINT OVER 1;AT y,x;j$(pos TO pos+1); AT y+1,x;j$(pos+2 TO pos+3)
1205 RETURN
1300 LET pad2=pad
1302 IF SCREEN$ (y+2,x)=" " THEN IF SCREEN$ (y+2,x+1)=" " THEN LET pad=pad+1
1304 IF y=19 THEN LET konec=1
1306 IF pad=pad2 THEN LET pad=0: IF pad2>4 THEN LET konec=1
1310 RETURN
9000 DATA 2,10,4,5,0,7,"111111111111111"
9001 DATA 8,1,0,7,"111111111111111111111111",8,10,0,0,"  "
9002 DATA 13,8,0,7,"11111111111"
9009 DATA 0,0,0,0,""

2.2 Komentář výpisu programu

Přece jenom, ne všichni mají náladu zkoumat, co jsem napsal, a tak svůj produkt trochu osvětlím:


  • je provedena inicializace (100), tj. počet životů (3), startovní místnost (1) a všechny Joeovy pozice se uloží do řetězce



  • je vykreslena místnost (102), otestován pohyb (104) a pád (106) a nastala li smrt, je odečten život (110), v horším případě hra končí (120), v lepším pokračuje (112)



  • podprogram na vykreslení místnosti (1000) má jako vstupní parametr číslo místnosti v proměnné level. Místnosti leží v datech (9000, 9010, 9020...): první a druhé číslo udávají, kde má Joe na začátku stát, zbývající data jsou organizována takto: řádek, sloupec, inkoust, papír a co vytisknout. Posloupnost je ukončena prázdným řetězcem (""). Data jedné místnosti se musí vejít do posloupnosti řádků ...0-...9, jak je vidět podle výrazu na ř.1018. Do proměnné pos je dána 1, což označuje fázi Joa snožmo vpravo a vykreslení místnosti je ukončeno jejím zobrazením (skok z ř. 1024 na ř. 1200)



  • další podprogram hlídá pohyb Joa (1100) a je-li třeba, pak i jeho pád. Po stisku klávesy S bude provedena pauza, dokud opět něco nezmáčkneme. Klávesa A umožňuje spáchat sebevraždu - hodí se to ve chvíli, kdy už je jasné, že jste to zkazili. Pro pohyb Joa zůstaly klávesy O a P. Jde-li ještě jít doleva či doprava, je nejprve smazána stará pozice a potom do proměnné pos uložena nová a návrat se opět provede přes vykreslení pozice



  • podprogram vytisknutí pozice vychází z toho, že jedna pozice má 4 znaky, které lze získat z řetězce J$ basicovským příkazem TO. Proto jsou také pozice číslovány 1, 5, 9, 13, protože každé číslo zároveň udává i kolikátým znakem pozice v řetězci začíná



  • poslední podprográmek (1300) nastavuje pád. Je-li pod nohama Joa prázdno, je hodnota proměnné pad zvýšena o jedničku. Smrt pádem nastává buď při dopadu Joa na řádek 19, nebo když je pád delší než 4 (1306). V podprogramu pohybu (1100) je testována hodnota pad a je-li nenulová, sune se Joe po obrazovce směrem dolů (1180). (Pozn.: výraz na ř. 1182 postupně zvyšuje číslo řádku, dokud Y<20.)


  • 2.3 Play the game

    Po spuštění se na obrazovce objeví 4 plošinky z jedniček a pár znaků představující Joa. S tím se ovšem nesmíříme a konečně udáme tu znakovou sadu z minule. Napište
    CLEAR 49999: LOAD ""CODE 50000
    a nahrajte upavený font. Dále doplňte program následovně:
    1000 POKE 23606,0: POKE 23607,60
    (tj. tiskni sadu z ROM)
    1008 POKE 23606, A: POKE 23607,B
    (kde A, B si musíme spočítat - viz. 1.2.2)
    Také je dobré dopsat řádek 118, kde bude to samé co na ř. 1000. Protože jsme si definovali pouze několik prvních znaků, není vrácení původních hodnot tak nutné, ale, obecně vzato, tam patří. (Abych nezapomněl: zaměňte v datech dvojice "0,7" za "7,0".)
    Spustíte-li znovu program, bude po obrazovce běhat Joe. Prozatím nevyužité předefinované znaky zneužijeme k následujícímu: !3! použijeme jako zarážku a "4" jako nebezpečnou podlahu, s "2" si naložte dle libosti. Rozšíříme data místností:
    9002 DATA 3,5,6,0,"3",8,12,5,0,"44"
    Pro hru to nebude mít zatím žádné důsledky, ty musíme vyrobit my. Tedy...
    1122 IF pos=5 THEN IF SCREEN$(y+1,x+3)="3" THEN RETURN
    1152 IF pos=12 THEN IF SCREEN$(y+1,x-1)="3" THEN RETURN
    a teď již nejde jít tam, kde stojí v cestě "3".
    Na závěr mám pro vás úkol: doplňte program tak, aby se Joe zabil i v případě, že vstoupí nohama na "44". Protože vás nechci napínat až do příště, najdete řešení na konci dílu.

    2.4 Jak snadno přijít k penězům

    Hru můžete ještě vylepšit o následující: když ji Joe stoupne na "22", postupuje do další místnosti, délky smrtelných pádů nemusí být konstantní, po pádu nebo průchodu místností zahraje nějaká znělka, ovládání klávesami by mohlo být předefinovatelné, neškodilo by ani ošetřit kempston joystick. Zatím nevyužitá proměnná time se může zapojit do hry a omezit dobu určenou k průchodu místnostmi, atd. Jsou to všechno samozřejmě nesmysly, které nemají praktický význam, ale pokud to ještě neumíte, můžete se na nich naučit spousy postupů a triků... Nakonec doporučuji ke hře dodělat pěkný obrázek, dobře znějící hudbu, hezké intro, pár zajímavých vizuálních efektů, a všechno to poslat do PROXIMY k distribuci... příjemnou zábavu.
    Příště nadobro opustíme starý dobrý BASIC a zavítáme do strojového kódu, jehož rychlost nám umožní daleko více. Bohužel už se nesetkáte s celým výpisem, ale pouze s úryvky z nejhrůznějších (pardon, překlep - správně nejrůznějších) rutin...

    Řešení (ovšem že ne jediné):

    1308 IF SCREEN$(y+2,x)="4" THEN IF SCREEN$(y+2,x+1)="4" THEN LET konec=1
    (pokračování příště)

    Žádné komentáře:

    Okomentovat