Autor Wątek: Tu kiedys powstanie wezzzowa gra w basicu  (Przeczytany 15122 razy)

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Tu kiedys powstanie wezzzowa gra w basicu
« dnia: 2014.12.23, 03:45:10 »
Zakladam watek zeby mnie mobilizowal do pracy. Watek jest powiazany z konkursem na napisanie gry-wariacji na temat gry "snake".
http://speccy.pl/forum/index.php/topic,1635.0.html
Gre pisze w jezyku basic ktorego zbytnio nie pamietam. Nie posiadam komputera zx spectrum wiec pisal bede w programie BASin. Traktuje to jako przyjemna wycieczke w dziecinstwo. Obiecuje ze postaram sie gre ukonczyc. Przez kilka dni bede siedzial nad nia przynajmniej po godzinie.

KONCEPT: Gra bedzie bardzo prosta, w zalozeniu miala byc szybkosciowo-zreczniosciowa gierka, ale dzisiaj przekonalem sie ze zapomnialem juz jaki spectrum potrafi byc wolny :)
Mam tylko nadzieje ze gra bedzie na tyle szybka by byla chociaz minimalnie grywalna.
W grze bedziemy pilnowac zeby nasz robak nie uciekl z trawnika. Cala gra bedzie w trybie znakowym, a trawnik bedzie kolem o promieniu 10 znakow... czyli wlasciwie trawniczek, a nie trawnik. Na brzegach trawniczka rosna krzaki ktore tworza mini labirynty.
 
ciemnozielony kolor jest poza polem gry.
rozowy to jest tor po ktorym poruszamy sie my
jasnozielony to oczywiscie trawniczek.
( nie planuje zeby gra byla taka ladna jak na rysunku- jestem tylko czlowiekiem  :) )

Dzisiejszy dzien to dzien ZERO:
Wymyslilem wstepny koncept mojej gry, sciagnalem program BASin i pobawilem sie nim, na ile potrafie. Prace przy grze rozpoczne jutro.

W grze planuje intensywnie korzystac z tablic dim() stad krotki programik:
5 RANDOMIZE
7 CLS
10 DIM c(22,22)
20 FOR x=1 TO 22
30 FOR y=1 TO 22
40 LET c(x,y)=INT (RND*7)
50 NEXT y
60 NEXT x
Czyli 484 losowania koloru i zapisywanie ich w tablicy c. Czas wykonaniania...  :o

Efekty zobaczylem po dopisaniu:
100 FOR y=1 TO 22
110 FOR x=1 TO 22
120 INK c(x,y)
130 PRINT AT y-1,x+4;
140 NEXT x
150 NEXT y

Mozaika.
Druga proba to narysowanie znakami kolka. Niestety rysowanie sin/cos okazalo sie koszmarnie wolne.
Stad kolko( tzn okrag) rysowany szybsza metoda:
10 CLS
20 GO SUB 5100
30 GO TO 30
5100 REM PRZYGOTOWANIE POLA GRY
5200 REM OKRAG
5210 LET x=0: LET y=10: LET a0=0
5220 PRINT AT 11+y,14+x;"X";: PRINT AT 11+y,14-x;"X";: PRINT AT 11-y,14-x;"X";: PRINT AT 11-y,14+x;"X";
5225 PRINT AT 11+x,14+y;"X";: PRINT AT 11+x,14-y;"X";: PRINT AT 11-x,14-y;"X";: PRINT AT 11-x,14+y;"X";
5230 IF y<=x THEN RETURN
5240 LET a0=a0+1+(2*x): LET x=x+1
5250 IF a0>y THEN LET a0=a0+1-(2*y): LET y=y-1
5260 GO TO 5220
...Uups! Kolko nie jest na tyle okragle by ladnie wyznaczalo tor ruchu naszej paletki.

Na koniec dnia zerowego wiem juz ze okragly trawniczek z pierwszego rysunku zmienie jednak na osmiokatny.
Jutro pierwszy dzien. Mysle ze rozpoczne od przygotowania pola gry i moze uda mi sie dodac ruchoma paletke. Jestem ogromnie ciekawy jaka predkosc uzyska. Od tego zalezy czy nie runie caly pomysl gry.



Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #1 dnia: 2014.12.23, 09:24:00 »
Trzymam kciuki za projekt ;)
A co do nieokrągłego trawnika - pamiętaj że masz rozdzielczość 32x24 punkty/znaki, zatem trudno jest narysować idealny okrąg.

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #2 dnia: 2014.12.23, 21:48:34 »
Trzymam kciuki za projekt ;)
A co do nieokrągłego trawnika - pamiętaj że masz rozdzielczość 32x24 punkty/znaki, zatem trudno jest narysować idealny okrąg.
Dzieki Tygrysie. Milo mi ze moge w niewielki sposob i na swe skromne mozliwosci przylozyc sie do rozwoju forum. Nic wielkiego tu nie powstanie ale jest to jakas odskocznia od "ciezkich" tematow ktore dominuja na forum.
**********************************************************************************
Wciaz mam sporo luk. Dzisiaj na przyklad chcialem zapetlic kilka if'ow i ..nie wiem jak to zrobic. Widze ze po pierwszym if'ie moge wstawic kolejny, ale jak go zakonczyc i prtezjsc do pierwszego? nie wiem. Jakis endif czy '}' by sie przydalo. Na razie zeby nie tracic czasu przyjmuje ze sie nie da.
Dzien Pierwszy
 Widok rozgrywki na ekranie bedzie powieleniem rozgrywki ktora bedzie odbywala sie w zadeklarowanych przeze mnie danych. Czyli widzac na przyklad weza na ekranie, wiadomo bedzie ze taki drugi waz sunie gdzies w bebechach komputera (poza pamiecia ekranu!)
Pole bitwy.
Kwadrat rogrywki z pierwszego ekranu ( zmienna a(x,y)) zostanie wypelniony liczbami, gdzie:
0 oznacza wode ( gdy waz wpadnie w wode -przegrywamy gdyz nie udalo sie nam go uchronic)
1 to paletka i krzaki. Waz po prostu skreci w bok. Czyli widzac ze zbliza sie do wody musimy podjechac szybko paletka i tak ja ustawic zeby waz nie wpadl do wody.
2 to jabluszko
4 zwyczajna trawa, bez wplywu na rozgrywke.
Czyli rozpoczynam od przygotowanie tablicy. Najpierw dim a(21,21) i nastepnie wypelnie wszystkie 21*21 elementow czworkami:
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=1 TO 21
5130 LET a(x,y)=4
5140 NEXT y
5150 NEXT x
Wczoraj uznalem ze okrag nie spelni swej roli, wiec dzisiaj narysuje trawnik w ksztalcie osmiokata:
5200 REM OSMIOKAT
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i)=0: LET a(xc+10-i,yc-4-i)=0: LET a(xc+3-i,yc-10)=0: LET a(xc-4-i,yc-10+i)=0
5240 LET a(xc-10,yc-3+i)=0: LET a(xc-10+i,yc+4+i)=0: LET a(xc-3+i,yc+10)=0: LET a(xc+4+i,yc+10-i)=0
5290 NEXT i
5300 RETURN
Teraz pokaz komputerku jak wyglada pole gry:
7010 FOR x=1 TO 21
7020 FOR y=1 TO 21
7030 PRINT AT x,y+4;a(x,y)
7040 NEXT y
7050 NEXT x
i mam wyrazny trawnik czworek i granice zer w ksztalcie osmiokata

Mam to co chcialem :)
Teraz bardzo wazna sprawa. Paletka gracza bedzie sie poruszala tylko ta sciezka gdzie sa 'zera'. Zeby w trakcie gry komputer nie rozpraszal sie na wyliczanie drogi paletki... wszystkie wspolrzedne kaze mu wyliczyc juz teraz ;)
Tym razem beda 2 dim'y. Jeden dla x'ow drugi dla y'grekow:
Czyli uzupelniam linie z deklaracja tablic na:
5010 DIM a(21,21): DIM b(56): DIM c(56)
Dlaczego 56? bo kazdy bok osmiokata ma 7 elementow (7*8=56)
I ponownie 'narysuje' osmiobok z tym ze tym razem wszystkie wspolrzedne x zachowam w dim b(n), a wspolrzedne y w dim c(n)
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4: LET c(i+50)=yc+10-i+4
5290 NEXT i
....
...
...
Niestety nie zdazylem zrobic sterowania paletka, czyli bedzie to w nastepnym poscie :)
Obecny kod wyglada nastepujaco:
10 CLS
20 GO SUB 5000
30 GO SUB 5100
90 FOR x=1 TO 21
92 FOR y=1 TO 21
94 PRINT AT x,y+4;a(x,y)
96 NEXT y
98 NEXT x
1000 GO TO 1000
5000 REM DEKLARACJA ZMIENNYCH
5002 REM DIM a-pole gry, DIM bic-x,y paletki
5010 DIM a(21,21): DIM b(56): DIM c(56)
5020 LET pos=0
5090 RETURN
5100 REM PRZYGOTOWANIE POLA GRY
5102 REM WARTOSCI TAB 0-woda, 1-paletka lub krzak, 2-jablko, 4-trawa
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=1 TO 21
5130 LET a(x,y)=4
5140 NEXT y
5150 NEXT x
5200 REM OSMIOKAT
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i)=0: LET a(xc+10-i,yc-4-i)=0: LET a(xc+3-i,yc-10)=0: LET a(xc-4-i,yc-10+i)=0
5240 LET a(xc-10,yc-3+i)=0: LET a(xc-10+i,yc+4+i)=0: LET a(xc-3+i,yc+10)=0: LET a(xc+4+i,yc+10-i)=0
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4: LET c(i+50)=yc+10-i+4
5290 NEXT i
5300 RETURN

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #3 dnia: 2014.12.25, 19:26:16 »
SUPER HIPER TURBO PREDKOSC PALETKI:
Na wstepie pochwale sie pewnym osiagnieciem. Chyba w pierwszym poscie pisalem o tym czego brakuje mi w instrukcji 'if then'
Moze jeszcze raz. Brakowalo mi takiej konstrukcji ( przyklad):
10 if a==1 then
{
   if b==1 then print b;
   if c==1 then print c;
   if d==1 then print d
}
Czyli gdy faktycznie a=1 to sprawdzane sa zawsze kolejne 3 warunki. To co oferuje spectrum to:
8000 LET a=1: LET b=1: LET c=1: LET d=1
8010 IF a=1 THEN PRINT a;: IF b=1 THEN PRINT a;: IF c=1 THEN PRINT c;: IF d=1 THEN PRINT d
Tu jest niby wszystko OK i na ekranie faktycznie zobaczylem 1111. Jednak wystarczy zmienic w kodzie np b=0
i na ekranie... pojawi sie tylko 1 jedynka. Dlaczego? no zx spectrum calkiem rozsadnie po napotkaniu falszu przestaje dalej sprawdzac zawartosc linj i przechodzi do nastepnej. Pierwsze co mi sie nasunelo to wykorzystanie go sub np tak:
8000 LET a=1: LET b=0: LET c=1: LET d=1
8010 IF a=1 THEN gosub 9000
...
...
9000 PRINT a;
9010if b=1 THEN PRINT b;
9020 if c=1 THEN PRINT c;
9030 IF d=1 THEN PRINT d
9040 RETURN
Dziala fajnie. Do wiekszych obliczen jak w sam raz. Jednak to o czym chcialem napisac to jeszcze inne rozwiazanie. Zamiast sie rozpisywac to ten sam przyklad jeszcze raz:
8000 LET a=1: LET b=0: LET c=1: LET d=1
8010 IF a=1 THEN PRINT a;: PRINT b AND b=1;: PRINT c AND c=1;: PRINT d AND d=1
Wynik na ekranie: 1011
Ta! dam!

I wlasnie to rozwiazanie zastosowalem w sterowaniu w mojej wezowej grze( ktora mam nadziej powstanie tu kiedys :) )
************
*DZIEN DRUGI*
************
Dzisiaj bedzie "z gorki". Wszystko przygotowane, wiec sterowanie powinno pojsc latwo.
Instrukcja PRINT AT wyswietli paletke w odpowiednim miejscu, a 'LET' updejtuje zawartosc tablicy a.
No to do roboty:
Sterowanie bedzie sie odbywalo klawiszami 'v' w lewo i 'b' w prawo. Nie bedzie zadnych obliczen gdzie paletka ma sie znalezc tylko bede zwiekszal 'posl' i 'posr' o zmienna 'predkosc'.
Naciskajac klawisz 'v' pos++ lub gdy nacisne klawisz b to wtedy pos--
Wyglada na kaszke z mleczkiem... jednak gdy bede juz na pos==56 ( objechalem caly osmiokat do okola) to gdybym dodal jeszcze 1 (56++) to wylece poza zakres zadeklarowany tablicy c(56). Potrzebuje sprytny mechanizm ktory sprawi ze:
56+1 -->1z kolej w druga strone. Gdy bede naciskal klawisz 'b' :
1-1 -->56O tym wlasnie pisalem na poczatku dzisiejszego postu. Czyli:
'v'
LET pos=pos+(-56 AND pos>56)'b'
LET pos=pos+(56 AND pos<1)Paletke zrobie z 3 spectrumowych znakow 143.
5315 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (143): LET a(b(i),c(i)-4)=1
5340 NEXT i
Oczywiscie cala paletke rysuje tylko jeden raz na poczatku gry. Pozniej bede dorysowywal tylko jeden znak w kierunku ruch i usowal jeden znak na samym koncu paletki.
Co mi jeszcze przyszlo do glowy? to to ze moge latwo zrobic turbo predkosc paletki :)
Po prostu skopiuje ruch pod kazdym z klawiszy. Da to 3 predkosci paletki oraz... olbrzymia i nieczytelna linie kodu:
110 IF k$="v" THEN LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol>4 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)... ale czego sie nie robi by zobaczyc cieknaca struzke sliny na skamienialych twarzach zazdrosnych asemblerowcow!
           ;)          ;)         ;)         ;)         ;)         ;)         ;)         ;)         ;)         ;)          ;)
Okej, wyraznie widac o czym mowilem, mowiac o zastosowaniu AND, widac tez ze to ze zx spectrum przestaje czytac linie w momencie napotakania falszu w warunku instrukcji 'IF'. Po prostu gdy paletka porusza sie wolno, zx spectrum odczytuje tylko 1/3 linii. Gdy przyspiesza 2/3 i przy maksymalnej predkosci odczytuje ja do konca gdyz wszystkie 'IF' zwracaja prawde.
Doszedl niestety jeszcze jeden warunek tzn zeruje predkosc gdy zaden klawisz nie jest nacisniety:
105 IF k$="" THEN LET turbor=0: LET turbol=0No to na dzisiaj chyba wystarczy.
Poniewaz wczoraj nic nie napisalem, to dzisiaj w ramach samo -ukarania uporzadkowalem nieco kod mojej gry:
10 CLS
20 GO SUB 5000
30 GO SUB 5100
40 GO SUB 5300
95 REM          ******************
98 REM          *GLOWNA PETLA GRY*
99 REM          ******************
100 LET k$=INKEY$
105 IF k$="" THEN LET turbor=0: LET turbol=0
110 IF k$="v" THEN LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$

(143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56):

IF turbol>4 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b

(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET

posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): LET a(b(posl),c(posl)-4)=1: PRINT AT b(posr),c(posr);CHR$ (32): LET a(b(posl),c(posl)-4)=0:

LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)
120 IF k$="b" THEN LET turbol=0: LET turbor=turbor+(1 AND turbor<8): LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$

(143): LET a(b(posr),c(posr)-4)=1: PRINT AT b(posl),c(posl);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF

turbor>4 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): LET a(b(posr),c(posr)-4)=1: PRINT AT b(posl),c

(posl);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor=8 THEN LET posr=posr-predkosc: LET posr=posr

+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): LET a(b(posr),c(posr)-4)=1: PRINT AT b(posl),c(posl);CHR$ (32): LET a(b(posl),c(posl)-4)=0: LET

posl=posl-predkosc: LET posl=posl+(56 AND posl<1)
1995 REM          ******************
1997 REM          *KONIEC PETLI GRY*
1999 REM          ******************
2000 GO TO 100
2015 REM ************
2017 REM **        **
2020 REM ************
5000 REM DEKLARACJA ZMIENNYCH
5002 REM DIM a-pole gry, DIM bic-x,y paletki, DIM d rysowanie i czyszczenie sladow paletki
5005 PRINT AT 21,0;"Inicjalizacja danych"
5010 DIM a(21,21): DIM b(56): DIM c(56)
5020 LET posl=3: LET posr=1: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=5
5030 LET k$=""
5090 RETURN
5100 REM PRZYGOTOWANIE POLA GRY
5102 REM WARTOSCI TAB 0-woda, 1-paletka lub krzak, 2-jablko, 4-trawa
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=1 TO 21
5130 LET a(x,y)=4
5140 NEXT y
5150 NEXT x
5200 REM OSMIOKAT
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i)=0: LET a(xc+10-i,yc-4-i)=0: LET a(xc+3-i,yc-10)=0: LET a(xc-4-i,yc-10+i)=0
5240 LET a(xc-10,yc-3+i)=0: LET a(xc-10+i,yc+4+i)=0: LET a(xc-3+i,yc+10)=0: LET a(xc+4+i,yc+10-i)=0
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)

=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4:

LET c(i+50)=yc+10-i+4
5270 NEXT i
5290 RETURN
5300 REM RYTSOWANIE ELEMENTOW GRY
5310 CLS
5315 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (143): LET a(b(i),c(i)-4)=1
5340 NEXT i
5390 RETURN
7000 REM ****************************
7002 REM TESTY -do usuniecia na koncu
7006 REM ****************************
7010 FOR x=1 TO 21
7020 FOR y=1 TO 21
7030 PRINT AT x,y+4;a(x,y)
7040 NEXT y
7050 NEXT x
7090 RETURN
Reasumijac dzisiejszy kod. Mam ruchoma paletke, ktora jezdzi po boku osmiokata. Gdy naciskam klawisz -palteka rusza powoli by zaraz przyspieszy raz i za chwilke gdy wydaje sie to juz zupelnie niemozliwe ;) zx spectrum przyspiesza jeszcze raz.



« Ostatnia zmiana: 2014.12.25, 19:41:19 wysłana przez zx81 »

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #4 dnia: 2014.12.26, 15:01:22 »
Dzisiaj luzny dzien. To znaczy nad gra siedzialem dzisiaj najdluzej, ale byla to glownie zabawa grafika  :-\
Wymyslilem tez jak sie gra bedzie nazywala i zaraz zmienie ... ( niestety nie moge zmienic)nazwe watku.
Obecny wyglad gry
"3Ewy i waazzz"

Do kazdego postu z postepem prac bede od dzisiaj dolaczal plik .bas
... tak od wypadku jakby ktos mial  ochote :)
Acha, zrezygnowalem z podwojnego zapisu gry, Przepisalem tablice i od teraz sluza po prostu do wczytywania obrazka. Postanowilem zdac sie jednak na sprawdzanie kolizji w pamieci ekranu.
Gra jest pisana w 100% basicu.
Tradycyjnie listing
10 BORDER 1: BRIGHT 1: PAPER 6: INK 0: CLEAR
20 GO SUB 5000
30 GO SUB 5100
40 GO SUB 5300
95 REM          ******************
98 REM          *GLOWNA PETLA GRY*
99 REM          ******************
100 LET k$=INKEY$
105 IF k$="" THEN LET turbor=0: LET turbol=0
110 IF k$="v" THEN PAPER 5: INK 2: BRIGHT 1: LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (158): PRINT AT b(posr),c(posr);CHR$ (154): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol>2 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (158): PRINT AT b(posr),c(posr);CHR$ (154): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (158): PRINT AT b(posr),c(posr);CHR$ (154): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)
120 IF k$="b" THEN PAPER 5: INK 2: BRIGHT 1: LET turbol=0: LET turbor=turbor+(1 AND turbor<8): LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (158): PRINT AT b(posl),c(posl);CHR$ (154): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor>2 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (158): PRINT AT b(posl),c(posl);CHR$ (154): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor=8 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (158): PRINT AT b(posl),c(posl);CHR$ (154): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1)
1995 REM          ******************
1997 REM          *KONIEC PETLI GRY*
1999 REM          ******************
2000 GO TO 100
2015 REM ************
2017 REM **        **
2020 REM ************
5000 REM DEKLARACJA ZMIENNYCH
5002 REM DIM a-pole gry, DIM bic-x,y paletki, DIM d rysowanie i czyszczenie sladow paletki
5005 PRINT AT 21,0;"Inicjalizacja danych"
5010 DIM a(21,32): DIM b(56): DIM c(56)
5020 LET posl=5: LET posr=3: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=posl: LET top=0: LET score=0
5030 LET k$=""
5044 REM kopce kreta
5046 DATA 14,4,18,5,9,8,8,11,9,14,14,17,18,18,23,15,23,8,24,11,15,9,17,10,15,12
5048 REM Trawa, Jablko,Krzaki, Glowa,Morze, Pagorek,paletka
5050 DATA 0,0,16,56,28,8,0,0
5052 DATA 8,16,62,79,199,206,222,124
5054 DATA 9,138,82,82,84,84,84,84
5056 DATA 24,126,255,153,255,255,66,126
5058 DATA 33,0,0,24,36,0,0,192
5059 DATA 20,28,62,62,62,126,255,127,255,219,219,255,189,219,231,255
5090 RETURN
5100 REM PRZYGOTOWANIE POLA GRY
5102 REM WARTOSCI TAB 154-krzaki, 143-paletka, 153-jablko, 163-trawa, 159-pagorek, 156-woda
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=6 TO 26
5130 LET a(x,y)=163
5140 NEXT y
5150 NEXT x
5160 FOR x=1 TO 21: FOR y=27 TO 32: LET a(x,y)=156: NEXT y: NEXT x
5170 FOR x=1 TO 21: FOR y=1 TO 5: LET a(x,y)=156: NEXT y: NEXT x
5200 REM OSMIOKAT
5205 PAPER 4: CLS : PRINT AT 21,0;"Inicjalizacja danych"
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i+5)=154: LET a(xc+10-i,yc-4-i+5)=154: LET a(xc+3-i,yc-10+5)=154: LET a(xc-4-i,yc-10+i+5)=154
5240 LET a(xc-10,yc-3+i+5)=154: LET a(xc-10+i,yc+4+i+5)=154: LET a(xc-3+i,yc+10+5)=154: LET a(xc+4+i,yc+10-i+5)=154
5242 FOR x=6-i TO 1 STEP -1: LET a(1+i,x+5)=156: LET a(21-i,x+5)=156: LET a(1+i,15+i+x+5)=156: LET a(21-i,15+i+x+5)=156: NEXT x
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4: LET c(i+50)=yc+10-i+4
5270 NEXT i
5272 REM kopce kreta
5274 FOR i=1 TO 13: READ y: READ x: LET a(x,y)=159: NEXT i
5278 REM grafika definiowana
5280 LET a=0
5282 FOR i=0 TO 7: READ a: POKE USR "T"+i,a: NEXT i
5284 FOR i=0 TO 7: READ a: POKE USR "J"+i,a: NEXT i
5286 FOR i=0 TO 7: READ a: POKE USR "K"+i,a: NEXT i
5288 FOR i=0 TO 7: READ a: POKE USR "G"+i,a: NEXT i
5289 FOR i=0 TO 7: READ a: POKE USR "M"+i,a: NEXT i
5290 FOR i=1 TO 7: READ a: POKE USR "P"+i,a: NEXT i
5292 FOR i=1 TO 7: READ a: POKE USR "O"+i,a: NEXT i
5295 RETURN
5300 REM RYTSOWANIE ELEMENTOW GRY
5305 PAPER 5: BRIGHT 1: CLS : INK 1: PRINT AT 21,5;"zx81.gerard\@gmail.com": INK 3: PRINT AT 0,3;"TOP ";top;AT 0,22;"SCORE ";score
5307 FOR x=1 TO 21: FOR y=1 TO 32
5309 IF a(x,y)=163 THEN PAPER 4: INK 6
5310 IF a(x,y)=156 THEN PAPER 5: INK 7: BRIGHT 1
5311 IF a(x,y)=154 THEN PAPER 5: INK 2: BRIGHT 1
5312 IF a(x,y)=159 THEN PAPER 4: INK 2: BRIGHT 0
5313 PRINT AT x,y-1;CHR$ a(x,y): BRIGHT 0
5314 NEXT y: NEXT x
5315 PAPER 5: INK 2
5318 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (158)
5340 NEXT i
5390 RETURN

ps:znal;azlem jakis dziwny blad w BASin. instrukcja BIN po kazdym uruchomieniu zjada mi czesc kodu. Po 3 uruchomieniach z 8 bitow zostaja mi 2,3 bity? Poradzilem sobie z tym przeliczajac moje znaki graficzne na system dziesietny.

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #5 dnia: 2014.12.29, 02:09:47 »
Coraz mniej wolnego czasu mam w tych 'wolnych; dniach. Znowu dzien przerwy, a i dzisiaj nie mam za bardzo o czym pisac. Obejdzie sie bez listingu i pliku. Jutro dodam AI dla weza zeby zachowywal sie nieprzewidywalnie i wtedy dodam listing oraz plik w zalaczniku.
Dzien Czwarty:
Kolejny raz zx spectrum basic mnie zaskoczyl. To ze " AT " zaokragla liczby mozna sie bylo domyslec. Jednak dzisiaj rysujac znak lecacy do gory zdziwilem sie gdy dolecial do gory ...zaczal spadac w dol. Wychodzi wiec na to ze gdy wspolrzedna robi sie mniejsza od zera, AT nie tylko zaokragla wartosc ale takze wylicza jej wartosc bezwzgledna. Czyli naprawde wyglada tak: AT ABS( INT (x)), ABS( INT( y)). Dobrze wiedziec, chociaz wolalbym zwykly komunikat o bledzie niz nieoczekiwane 'odbicie' od zera.
Wracajac do weza.
Jak napisac snake'a i ile to moze potrwac?
Z czego sklada sie waz? z glowy, wezowego ciala oraz ze... znaku o kodzie podloza( lub po prostu " " na podlozu wypelnionym spacjami) na samym koncu ktory wymazuje ostatni znak ogona. Czyli np tak:
130 PRINT AT xhead,yhead;CHR$ (znak glowy)
140 FOR i=dlugoscweza TO 2 STEP -1
150 LET d(i)=d(i-1): LET e(i)=e(i-1)
160 NEXT i
170 LET d(1)=xhead: LET e(1)=yhead
180 PRINT AT d(dlugoscweza),e(dlugoscweza);CHR$ (znak mazania)
Gdzie d(x) i e(y) sa tablicami wspolrzednych wszystich znakow z jakich zbudowany jest waz, a zmienna 'dlugoscweza' to ilosc znakow z ilu zbudowany jest waz ale liczona bez glowy- co widac w petli 'FOR' ze jest liczona tylko do 2 elementu. Dodac do tego strowanie i "ramke" obszru gry i.. koniec, kropka gra napisana
Pewnie sa lepsze i efektywniejsze sposoby ale sadze ze wszystkie maja bardzo zblizone 'serce'.  Rozwiazanie ma dwie istotne wady. Pierwsza to taka ze musze okreslic jaka najwieksza dlugosc moze osiagnac waz w grze, np gdy uznam ze gracz nigdy nie osiagnie wiekszej dlugosci niz 30 znakow.
Jezeli jednak waz osiagnie w grze dlugosc wieksza niz przewidzialem to gra sie po prostu wykrzaczy. Druga wada ktora naprawde jest problemem to widoczna w przykladzie petla for -next. Niesamowicie spowalnia gre. Jutro kontynujac pisanie gry, sprobuje ja po prostu zastapic drzewkiem if'ow( jezeli drzewko ifow to maksymalna dlugosc weza bedzie niewielka)Tak przynajmniej wynika z dzisiejszych testow. Ma to o tyle dobra strone ze przy dlugosci mniejszej niz 7 znakow, waz nie moze sam siebie zablokowac, wiec nie bede tego musial sprawdzac.
Acha znalazlem blad we wczesniejszym poscie.
5290 FOR i=1 TO 7: READ a: POKE USR "P"+i,a: NEXT iOczywiscie powinno byc I=0, skad mi sie wziela ta jedynka ??? zwlaszca ze w nastepnej linijce bezmyslnie ja skopiowalem :/
( w jutrzejszym listingu poprawie)

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #6 dnia: 2015.01.02, 14:11:47 »
Gra nie zostala ukonczona na czas niestety. Niby nie wiele braklo, wylozylem sie po prostu na odczycie ekranu.
Nie moglem znalezc bledu w kodzie, a waz robil zupelnie co innego niz powinien ...
Dopiero dzisiaj doczytalem o ograniczeniach 'SCREEN$".
Funkcja ktora miala sprawdzac kolizje weza z paletkami, kopcami kretow i szuwarami niestety nie odczytuje grafiki definiowanej, a taka wlasnie grafika wypelnilem cala plansze gry.
SCREEN$ napotykajac taka grafike zwraca zawsze po prostu "" czyli pusty lancuch.
Zapamietam to na przyszlosc. Obecnie jestem w o tyle dobrej sytuacji ze cala grafike mam juz umieszczona w tablicy wiec moge:
a) odczytywac kolizje z tablicy
b) zamienic grafike na taka wzieta ze standartowego zestawu ROM
...
rzut moneta i...
 bede kontynuowal gre oparta na grafice definiowanej... czyli:
DZIEN PIATY :
Pojawily sie 3 nowe tablice i teraz linia definicji tablic wyglada tak:
5010 DIM a(21,32): DIM b(56): DIM c(56): DIM d(6): DIM e(6): DIM f(13): DIM g(13): DIM h(25): DIM m(10)f i g to wspolrzedne jabluszek ktore beda sie pojawiac w grze.
h to 25 rzutow kostka o 4 sciankach { 0, 1, 2, 3}
FOR i=1 TO 25: LET h(i)=INT (RND*4): NEXT iTablica 'm' to z kolei 10 rzutow moneta czyli tablica 10 wartosci prawda/falsz

tablica 'i' bedzie odczytywana standartowo jako
if m(x) then ...Natomiast przy tablicy h korzystam z tego ze dla zx spectrum basic kazda wartosc ktora nie jest zerem jest prawda, czyli
135 IF NOT h(i) THEN GO SUB 5500 powinno w efekcie wykonywac skok do podprogramu tylko gdy h(i)==0 ( na co mam 25% szansy)
Od linii 5500 zaczyna sie krociutki podprogram odpowiedzialny za 'inteligencje' weza.
« Ostatnia zmiana: 2015.01.02, 14:17:58 wysłana przez zx81 »

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #7 dnia: 2015.01.06, 15:03:54 »
(...)moge:
a) odczytywac kolizje z tablicy
b) zamienic grafike na taka wzieta ze standartowego zestawu ROM
i jeszcze do wczoraj bralem mozliwosc
c) zapisywac/odczytywac znaki do pamieci ekranu instrukcja POKE/PEEK.
Tak bylo gdy w mlodosci bawilem sie w programowanie na komputerze meritum. Wczoraj poczytalem o organizacji obrazu w zx spectrum i mina mi zrzedla :/
Z poziomu basica nie widze mozliwosci by zrobic cokolwiek efektywnego w kwesti zapis/odczyt pamieci ekranu instrukcjami POKE/PEEK.
Zeby pojsc do przodu zlikwidowalem wiekszosc grafik definiowanych. Zatrzymalem tylko:
-fale morskie ( z nimi kolizja i tak nie bedzie sprawdzana gdyz sa poza zasiegiem weza)
-glowe weza( glowa z glowa sie nie zderzy)
-kopce kreta(!)
Kopce kreta zatrzymalem z uwagi ze sa jedyna grafika definiowana z ktora waz moze sie zderzyc. Wniosek:
jezeli kod sprawdzania kolizji zwroci mi ze przed wezem nic nie ma:
z$=""oznacza to ze wlasnie waz natrafil na na kopiec kreta, czyli na znak CHR$( 159).
Wiec w ten 'sprytny' sposob udalo mi sie utrzymac przy opcji odczytu kolizji z ekranu a nie z tablicy 'a'.
DZIEN SZOSTY:
Usunalem niepotrzebna grafike definiowana. Czyli program gry zamiast wydlurzac sie, skrocil sie znaczaco :)
Zakonczylem takze prace nad AI weza. To zaledwie kilka lini, ale tchnely inteligencje w bohatera gry:
Wczytanie 'mozgu' weza:
5022  FOR i=1 TO 50: LET h(i)=INT (RND*4): NEXT i: LET ai=1i tak to wyglada w petli gry:
102 LET ai=1+(ai AND ai<50)
130 GO SUB 5600-(100 AND (NOT h(ai)))
W linia 102 to zwiekszanie w kolko zmiennej 'ai' od 1 do 50.
Natomiast w lini 130 odbywa sie skok do podprogramu 'AI' ( szansa na skok do linii 5500 wynosi 25%)
Kod AI operuje na zmiennych 'xpomoc' i 'ypomoc'. Po wykonaniu przechodzi w kod sprawdzania kolizji( od linii 5600) i jezeli 'AI' zasugerowalo wezowi zderzenie to nie jest wiecej brane pod uwage tylko zapominane.
Podprogram kolizji ( 5600) jest wykonywany w kazdym cyklu gry.
5500 REM AI
5510 IF xsnake<>0 THEN LET xpomoc=0: LET ypomoc=1-(2 AND g(posjablko)<yhead): GO TO 5530
5520 LET ypomoc=0: LET xpomoc=1-(2 AND f(posjablko)<xhead)
5530 IF SCREEN$ (xhead+xpomoc,yhead+ypomoc)<>CHR$ (143) AND SCREEN$ (xhead+xpomoc,yhead+ypomoc)<>"" THEN LET xsnake=xpomoc: LET ysnake=ypomoc
5599 REM KOLIZJE
5600 LET z$=SCREEN$ (xhead+xsnake,yhead+ysnake)
5605 IF z$=CHR$ (126) THEN RETURN
5610 IF z$=CHR$ (36) THEN LET dlugoscweza=dlugoscweza+(1 AND dlugoscweza<6): GO TO 5700
5620 IF z$=CHR$ (124) THEN LET koniecgry=1: RETURN
5630 LET zwrot=1+(zwrot AND zwrot<10)
5640 IF xsnake<>0 THEN LET xsnake=0: LET ysnake=-1+(2 AND m(zwrot)): GO TO 5680
5650 LET ysnake=0: LET xsnake=-1+(2 AND m(zwrot))
5660 IF SCREEN$ (xhead+xsnake,yhead+ysnake)=CHR$ (143) OR SCREEN$ (xhead+xsnake,yhead+ysnake)="" THEN LET xsnake=xsnake*(-1)
5670 RETURN
5680 IF SCREEN$ (xhead+xsnake,yhead+ysnake)=CHR$ (143) OR SCREEN$ (xhead+xsnake,yhead+ysnake)="" THEN LET ysnake=ysnake*(-1)
5690 RETURN
5699 REM JABLUSZKA
5700 LET posjablko=1+(posjablko AND posjablko<13): IF SCREEN$ (f(posjablko),g(posjablko))=CHR$ (88) THEN GO TO 5700
5710 PAPER 4: INK 2: BRIGHT 1: FLASH 1: PRINT AT f(posjablko),g(posjablko);CHR$ (36): FLASH 0: RETURN
Kolejne jabluszko ( czyli znak dolara) przed pojawieniem sie sprawdza czy w miejscu gdzie sie ma pojawic nie znaiduje sie cialo weza ( linia 5700)
Tablica 'm' to 10 wartosci zero-jedynkowych ktore okreslaja w ktora strone waz ma skrecic przy zderzeniu. Korzystam z tej przygotowanej tablicy dla tego by w trakcie gry nie korzystac z funkcji losowej RND.
Obecny wyglad gry:

Pelny listing:
10 BORDER 1: BRIGHT 1: PAPER 6: INK 0: CLEAR
20 GO SUB 5000
30 GO SUB 5100
40 GO SUB 5300
45 GO SUB 5400
95 REM          ******************
98 REM          *GLOWNA PETLA GRY*
99 REM          ******************
100 LET k$=INKEY$
102 LET ai=1+(ai AND ai<50)
105 IF k$="" THEN LET turbor=0: LET turbol=0
110 IF k$="v" THEN PAPER 5: INK 2: BRIGHT 1: LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): PRINT AT b(posr),c(posr);CHR$ (124): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol>2 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): PRINT AT b(posr),c(posr);CHR$ (124): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): PRINT AT b(posr),c(posr);CHR$ (124): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)
120 IF k$="b" THEN PAPER 5: INK 2: BRIGHT 1: LET turbol=0: LET turbor=turbor+(1 AND turbor<8): LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): PRINT AT b(posl),c(posl);CHR$ (124): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor>2 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): PRINT AT b(posl),c(posl);CHR$ (124): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor=8 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): PRINT AT b(posl),c(posl);CHR$ (124): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1)
130 GO SUB 5600-(100 AND (NOT h(ai)))
140 LET xhead=xhead+xsnake: LET yhead=yhead+ysnake
170 LET d(6)=d(5): LET e(6)=e(5): LET d(5)=d(4): LET e(5)=e(4): LET d(4)=d(3): LET e(4)=e(3): LET d(3)=d(2): LET e(3)=e(2): LET d(2)=d(1): LET e(2)=e(1): LET d(1)=xhead: LET e(1)=yhead
180 PAPER 4: INK 3: BRIGHT 1: PRINT AT d(1),e(1);CHR$ (150): BRIGHT 0: PRINT AT d(2),e(2);CHR$ (88): PAPER 4: INK 6: PRINT AT d(dlugoscweza),e(dlugoscweza);CHR$ (126)
900 IF (koniecgry) THEN GO SUB 6100
1995 REM          ******************
1997 REM          *KONIEC PETLI GRY*
1999 REM          ******************
2000 GO TO 100
2015 REM ************
2017 REM **        **
2020 REM ************
5000 REM DEKLARACJA ZMIENNYCH
5002 REM DIM a-pole gry, DIM bic-x,y paletki, DIM d rysowanie i czyszczenie sladow paletki. D i E to x i y weza
5003 REM fF i G to x i y jabluszek. H to inteligencja weza, a M to pierwszy wybor kierunku zwrotu
5005 PRINT AT 21,0;"Inicjalizacja danych"
5007 RANDOMIZE
5010 DIM a(21,32): DIM b(56): DIM c(56): DIM d(6): DIM e(6): DIM f(13): DIM g(13): DIM h(50): DIM m(10)
5020 LET posl=5: LET posr=3: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=posl
5022 LET dlugoscweza=3: LET d(1)=11: LET e(1)=16: LET d(2)=d(1)+1: LET e(2)=e(1): LET xsnake=-1: LET ysnake=0: LET xpomoc=0: LET ypomoc=0: LET xhead=d(1): LET yhead=e(1): FOR i=1 TO 50: LET h(i)=INT (RND*4): NEXT i: FOR i=1 TO 10: LET m(i)=INT (RND*2): NEXT i: LET ai=1: LET zwrot=0: LET posjablko=1+(INT (RND*13)): LET xjablko=f(posjablko): LET yjablko=g(posjablko): LET koniecgry=0
5023 LET f(1)=3: LET f(2)=5: LET f(3)=4: LET f(4)=6: LET f(5)=9: LET f(6)=8: LET f(7)=11: LET f(8)=14: LET f(9)=15: LET f(10)=18: LET f(11)=20: LET f(12)=16: LET f(13)=9: LET g(1)=12: LET g(2)=16: LET g(3)=19: LET g(4)=9: LET g(5)=13: LET g(6)=19: LET g(7)=22: LET g(8)=18: LET g(9)=14: LET g(10)=11: LET g(11)=16: LET g(12)=20: LET g(13)=24
5024 LET top=0: LET score=0
5030 LET k$="": LET z$=""
5044 REM dane do jabblek, kopce kreta
5046 DATA 14,4,18,5,9,8,8,11,9,14,14,17,18,18,23,15,23,8,24,11,15,9,17,10,15,12
5048 REM Trawa,tlow,  Jablko,Krzaki, Glowa,Morze, Pagorek,paletka
5056 DATA 24,126,255,153,255,255,66,126
5058 DATA 33,0,0,24,36,0,0,192
5059 DATA 20,28,62,62,62,126,255,126
5090 RETURN
5100 REM PRZYGOTOWANIE POLA GRY
5102 REM WARTOSCI TAB 164-krzaki, 143-paletka, 153-jablko, 163-trawa, 159-pagorek, 156-woda
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=6 TO 26
5130 LET a(x,y)=126
5140 NEXT y
5150 NEXT x
5160 FOR x=1 TO 21: FOR y=27 TO 32: LET a(x,y)=156: NEXT y: NEXT x
5170 FOR x=1 TO 21: FOR y=1 TO 5: LET a(x,y)=156: NEXT y: NEXT x
5200 REM OSMIOKAT
5205 PAPER 4: CLS : PRINT AT 21,0;"Inicjalizacja danych"
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i+5)=124: LET a(xc+10-i,yc-4-i+5)=124: LET a(xc+3-i,yc-10+5)=124: LET a(xc-4-i,yc-10+i+5)=124
5240 LET a(xc-10,yc-3+i+5)=124: LET a(xc-10+i,yc+4+i+5)=124: LET a(xc-3+i,yc+10+5)=124: LET a(xc+4+i,yc+10-i+5)=124
5242 FOR x=6-i TO 1 STEP -1: LET a(1+i,x+5)=156: LET a(21-i,x+5)=156: LET a(1+i,15+i+x+5)=156: LET a(21-i,15+i+x+5)=156: NEXT x
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4: LET c(i+50)=yc+10-i+4
5270 NEXT i
5272 REM kopce kreta
5274 FOR i=1 TO 13: READ y: READ x: LET a(x,y)=159: NEXT i
5278 REM grafika definiowana
5280 LET a=0
5288 FOR i=0 TO 7: READ a: POKE USR "G"+i,a: NEXT i
5289 FOR i=0 TO 7: READ a: POKE USR "M"+i,a: NEXT i
5290 FOR i=0 TO 7: READ a: POKE USR "P"+i,a: NEXT i
5295 RETURN
5300 REM RYTSOWANIE ELEMENTOW GRY
5305 PAPER 5: BRIGHT 1: CLS : INK 1: PRINT AT 21,32-LEN ("zx81.gerard\@gmail.com");"zx81.gerard\@gmail.com": INK 3: PRINT AT 0,3;"TOP ";top;AT 0,22;"SCORE ";score
5307 FOR x=1 TO 21: FOR y=1 TO 32
5309 IF a(x,y)=126 THEN PAPER 4: INK 6
5310 IF a(x,y)=156 THEN PAPER 5: INK 7: BRIGHT 1
5311 IF a(x,y)=124 THEN PAPER 5: INK 2: BRIGHT 1
5312 IF a(x,y)=159 THEN PAPER 4: INK 2
5313 PRINT AT x,y-1;CHR$ a(x,y): BRIGHT 0
5314 NEXT y: NEXT x
5315 PAPER 5: INK 2: BRIGHT 1
5318 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (143)
5340 NEXT i
5342 BRIGHT 0
5390 RETURN
5400 REM LOSOWANIE JABLUSZEK (czyli $)
5420 PAPER 4: INK 2: BRIGHT 1: FLASH 1: PRINT AT f(posjablko),g(posjablko);CHR$ (36): FLASH 0
5430 RETURN
5500 REM AI
5510 IF xsnake<>0 THEN LET xpomoc=0: LET ypomoc=1-(2 AND g(posjablko)<yhead): GO TO 5530
5520 LET ypomoc=0: LET xpomoc=1-(2 AND f(posjablko)<xhead)
5530 IF SCREEN$ (xhead+xpomoc,yhead+ypomoc)<>CHR$ (143) AND SCREEN$ (xhead+xpomoc,yhead+ypomoc)<>"" THEN LET xsnake=xpomoc: LET ysnake=ypomoc
5599 REM KOLIZJE
5600 LET z$=SCREEN$ (xhead+xsnake,yhead+ysnake)
5605 IF z$=CHR$ (126) THEN RETURN
5610 IF z$=CHR$ (36) THEN LET dlugoscweza=dlugoscweza+(1 AND dlugoscweza<6): GO TO 5700
5620 IF z$=CHR$ (124) THEN LET koniecgry=1: RETURN
5630 LET zwrot=1+(zwrot AND zwrot<10)
5640 IF xsnake<>0 THEN LET xsnake=0: LET ysnake=-1+(2 AND m(zwrot)): GO TO 5680
5650 LET ysnake=0: LET xsnake=-1+(2 AND m(zwrot)):
5660 IF SCREEN$ (xhead+xsnake,yhead+ysnake)=CHR$ (143) OR SCREEN$ (xhead+xsnake,yhead+ysnake)="" THEN LET xsnake=xsnake*(-1)
5670 RETURN
5680 IF SCREEN$ (xhead+xsnake,yhead+ysnake)=CHR$ (143) OR SCREEN$ (xhead+xsnake,yhead+ysnake)="" THEN LET ysnake=ysnake*(-1)
5690 RETURN
5699 REM JABLUSZKA
5700 LET posjablko=1+(posjablko AND posjablko<13): IF SCREEN$ (f(posjablko),g(posjablko))=CHR$ (88) THEN GO TO 5700
5710 PAPER 4: INK 2: BRIGHT 1: FLASH 1: PRINT AT f(posjablko),g(posjablko);CHR$ (36): FLASH 0: RETURN
6099 REM CZYSZCZENIE EKRANU
6100 PAPER 4: INK 6: PRINT AT f(posjablko),g(posjablko);CHR$ (126): FOR i=2 TO dlugoscweza: PRINT AT d(i),e(i);CHR$ (126): NEXT i: PAPER 5: INK 2: BRIGHT 1: PRINT AT d(1),e(1);CHR$ (124): FOR i=1 TO 56: PRINT AT b(i),c(i);CHR$ (124): NEXT i
6199 REM PRZYWROCENIE DANYCH
6200 LET posl=5: LET posr=3: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=posl
6210 LET dlugoscweza=3: LET d(1)=11: LET e(1)=16: LET d(2)=d(1)+1: LET e(2)=e(1): LET xsnake=-1: LET ysnake=0: LET xpomoc=0: LET ypomoc=0: LET xhead=d(1): LET yhead=e(1): FOR i=1 TO 50: LET h(i)=INT (RND*4): NEXT i: FOR i=1 TO 10: LET m(i)=INT (RND*2): NEXT i: LET ai=1: LET zwrot=0: LET xjablko=f(posjablko): LET yjablko=g(posjablko): LET koniecgry=0

6230 LET k$="": LET z$=""
6240 FOR i=pos-2 TO pos: PRINT AT b(i),c(i);CHR$ (143): NEXT i
6250 GO SUB 5699
6300 RETURN
Do zrobienia jeszcze:
-dzwieki
-poprawa grafiki
-liczenie punktow
-opisy itd itp.
... jakkolwiek w gre da sie juz zagrac :)





Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #8 dnia: 2015.01.07, 14:45:51 »
(...)moge:
a) odczytywac kolizje z tablicy
b) zamienic grafike na taka wzieta ze standartowego zestawu ROM
i jeszcze do wczoraj bralem mozliwosc
c) zapisywac/odczytywac znaki do pamieci ekranu instrukcja POKE/PEEK.
Tak bylo gdy w mlodosci bawilem sie w programowanie na komputerze meritum. Wczoraj poczytalem o organizacji obrazu w zx spectrum i mina mi zrzedla :/
Z poziomu basica nie widze mozliwosci by zrobic cokolwiek efektywnego w kwesti zapis/odczyt pamieci ekranu instrukcjami POKE/PEEK.

O ile POKE/PEEK nie pomoże, za to może się przydać SCREEN$(Y,X) gdzie Y,X to parametry identyczne jak w AT.


pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #9 dnia: 2015.01.07, 14:51:57 »
Tyle, że autor już sam doszedł do miejsca, w którym odkrył, że SCREEN$ nie odczytuje z ekranu znaków UDG.
ZX/Enterprise/CPC/Robotron/C128D

matofesi

  • *****
  • Wiadomości: 2050
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #10 dnia: 2015.01.07, 15:01:19 »
Ale... SCREEN$ działa poprawnie na przedefiniowanym zestawie znaków -  na przykład: podstawiamy własne grafiki pod małe litery, przestawiamy CHARS, w kodzie używamy małych liter jako grafiki i możemy używać SCREEN$ do rozpoznawania zawartości ekranu.

zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #11 dnia: 2015.01.07, 17:12:07 »
Po zamianie grafiki UDG na standartowa problem zniknal. Znalazlem tez opis ze SCREEN$ porownuje zawartosc pola wylacznie z z tym co ma w pamieci ROM, czyli przedefinowanie znaku czyni go niewidocznym.
Cytuj
"(...)grafika definiowana przez użytkownika i znaki graficzne dają w wyniku pusty łańcuch. Tak samo będzie, gdy zostanie zastosowana funkcja OVER do otrzymania znaku złożonego. Powodem takiego zachowania się SCREEN$ jest to, iż porównuje ona zawartość pola znaku na ekranie z matrycami kształtów znaków w ROM.()"
http://edu.i-lo.tarnow.pl/inf/retro/006_zx_spect_inst/0015.php

matofesi

  • *****
  • Wiadomości: 2050
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #12 dnia: 2015.01.08, 07:57:34 »
To akurat nie jest prawda. SCREEN$ porównuje zawartość ekranu z tym, co ma zapisane pod adresem zmiennej systemowej CHARS (23606/23607) - jeśli skopiujesz cały generator znaków z ROM (768 bajtów od adresu 15616) do RAM (pod adres będący wielokrotnością 256) a następnie przestawisz CHARS tak, żeby wskazywał na ten nowy adres (-256, bo CHARS zasadniczo wskazuje na zestaw znaków zaczynając od kodu 0) to potem możesz sobie dowolnie zmieniać wszystkie znaki (np. jak pisałem wyżej używać do wyświetlania tekstów tylko dużych liter a małe przedefiniować jako grafikę dokładnie tak jak UDG) i SCREEN$ będzie ci poprawnie rozpoznawać to, co sobie przedefiniowałeś. Takie rozwiązanie ma jedną wadę - jeśli piszesz kod na fizycznej maszynie musisz pamiętać, żeby przełączać CHARS na znaki w ROMie wracając do edycji bo inaczej w tekście programu będziesz miał swoje grafiki w miejscu normalnie występujących tam znaków ;)

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #13 dnia: 2015.01.08, 10:19:17 »
A jak ktoś jest hardkorem to może sobie wszystkie znaki ASCII pozamieniać na własną grafikę :)

Ot choćby taka gra. W życiu bym nie powiedział że napisana w Basicu ale można użyć Break i sprawdzić:

http://www.worldofspectrum.org/infoseekid.cgi?id=0027564


zx81

  • **
  • Wiadomości: 71
  • Miejsce pobytu:
    krakow
Odp: Tu kiedys powstanie wezzzowa gra w basicu
« Odpowiedź #14 dnia: 2015.01.10, 00:06:33 »
@matofesi, Dobrze wiedziec. Teraz tego juz nie wykorzystam, ale zapamietam na przyszlosc. (zastosowanie widze w tej grze ponizej Twojego postu od RafalaM)

DZIEN SIODMY-ostatni.
Gra skonczona. Dodalem muzyczke i musze powiedziec ze mialem z tym kupe zabawy bo musialem "przywitac sie" z nutami :)
Konczylem juz na sile. Gdzies tak od 13 kilobajta zaczalem miec problemy z nieoczekiwanym zawieszaniem sie systemu w trakcie pisania i edytowania.
Jednak napisanie tej gierki dalo mi duza frajde... cos jak wehikul czasu :)
Dodalem dzwieki, punktacje, opis gry, prosciutki system osiagniec ...oraz zmienilem grafike UDG.
...
Ostateczny ytul gry to "Snake and Tits". Tym razem grafiki z gameplay'u nie dolaczam bo moga nas ogladac dzieci  ;D



Listing
10 BORDER 1: BRIGHT 1: PAPER 5: INK 0: FLASH 0: CLEAR
15 GO SUB 6600
20 GO SUB 5000
30 GO SUB 5100
40 GO SUB 5300
45 GO SUB 5400
95 REM          ******************
98 REM          *GLOWNA PETLA GRY*
99 REM          ******************
100 LET k$=INKEY$
102 LET ai=1+(ai AND ai<50)
105 IF k$="" THEN LET turbor=0: LET turbol=0
110 IF k$="v" THEN PAPER 5: INK 2: BRIGHT 1: LET turbor=0: LET turbol=turbol+(1 AND turbol<8): LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): PRINT AT b(posr),c(posr);CHR$ (124): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol>2 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): PRINT AT b(posr),c(posr);CHR$ (124): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56): IF turbol=8 THEN LET posl=posl+predkosc: LET posl=posl+(-56 AND posl>56): PRINT AT b(posl),c(posl);CHR$ (143): PRINT AT b(posr),c(posr);CHR$ (124): LET posr=posr+predkosc: LET posr=posr+(-56 AND posr>56)
120 IF k$="b" THEN PAPER 5: INK 2: BRIGHT 1: LET turbol=0: LET turbor=turbor+(1 AND turbor<8): LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): PRINT AT b(posl),c(posl);CHR$ (124): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor>2 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): PRINT AT b(posl),c(posl);CHR$ (124): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1): IF turbor=8 THEN LET posr=posr-predkosc: LET posr=posr+(56 AND posr<1): PRINT AT b(posr),c(posr);CHR$ (143): PRINT AT b(posl),c(posl);CHR$ (124): LET posl=posl-predkosc: LET posl=posl+(56 AND posl<1)
130 GO SUB 5600-(100 AND (NOT h(ai)))
140 LET xhead=xhead+xsnake: LET yhead=yhead+ysnake
170 LET d(6)=d(5): LET e(6)=e(5): LET d(5)=d(4): LET e(5)=e(4): LET d(4)=d(3): LET e(4)=e(3): LET d(3)=d(2): LET e(3)=e(2): LET d(2)=d(1): LET e(2)=e(1): LET d(1)=xhead: LET e(1)=yhead
180 PAPER 4: INK 3: BRIGHT 1: PRINT AT d(1),e(1);CHR$ (150): BRIGHT 0: PRINT AT d(2),e(2);CHR$ (88): PAPER 4: INK 6: PRINT AT d(dlugoscweza),e(dlugoscweza);CHR$ (126)
900 IF (koniecgry) THEN GO SUB 6100
939 REM LICZNIKI
940 LET score1=score1+1: IF score1=5 THEN LET score0=score0+score1*(dlugoscweza-1): LET score1=0
950 IF score0<>0 THEN LET score=score+score0: LET top=top+(score-top AND NOT (flag)): LET score0=0: LET oktawa=(NOT (oktawa)*12): BEEP 0.125,24-oktawa: BEEP 0.125,13-oktawa: INK 3: PAPER 5: BRIGHT 1: FLASH 1: PRINT AT 0,3; FLASH NOT flag;(("TOP "+STR$ top) AND NOT (flag)); FLASH 0;AT 0,28;score;: FLASH 0: IF (flag) THEN IF score>top THEN LET flag=0: LET top=score: LET i$="NOWY REKORD!": GO SUB komunikaty
960 IF score>o(osiagniecie) THEN LET osiagniecie=osiagniecie+(1 AND osiagniecie<10): READ i$: GO SUB komunikaty
1995 REM          ******************
1997 REM          *KONIEC PETLI GRY*
1999 REM          ******************
2000 GO TO 100
2015 REM ************
2017 REM **        **
2020 REM ************
5000 REM DEKLARACJA ZMIENNYCH
5002 REM DIM a-pole gry, DIM bic-x,y paletki, DIM d rysowanie i czyszczenie sladow paletki. D i E to x i y weza
5003 REM fF i G to x i y jabluszek. H to inteligencja weza, a M to pierwszy wybor kierunku zwrotu
5005 PRINT AT 21,32-LEN ("Inicjalizacja danych");"Inicjalizacja danych"
5007 RANDOMIZE
5010 DIM a(21,32): DIM b(56): DIM c(56): DIM d(6): DIM e(6): DIM f(13): DIM g(13): DIM h(50): DIM m(10): DIM t(14): DIM s(14): DIM o(10)
5020 LET posl=5: LET posr=3: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=posl
5022 LET dlugoscweza=2: LET d(1)=17: LET e(1)=15: LET d(2)=d(1)+1: LET e(2)=e(1): LET xsnake=-1: LET ysnake=0: LET xpomoc=0: LET ypomoc=0: LET xhead=d(1): LET yhead=e(1): FOR i=1 TO 50: LET h(i)=INT (RND*4): NEXT i: FOR i=1 TO 10: LET m(i)=INT (RND*2): NEXT i: LET ai=1: LET zwrot=0: LET posjablko=1+(INT (RND*13)): LET xjablko=f(posjablko): LET yjablko=g(posjablko): LET koniecgry=0: LET anykey=6400: LET triumf=6450: LET komunikaty=6500: LET oktawa=1: LET opoznienie=2: LET flag=1: LET flag1=1
5023 LET f(1)=3: LET f(2)=5: LET f(3)=4: LET f(4)=6: LET f(5)=9: LET f(6)=8: LET f(7)=11: LET f(8)=14: LET f(9)=15: LET f(10)=18: LET f(11)=20: LET f(12)=16: LET f(13)=9: LET g(1)=12: LET g(2)=16: LET g(3)=19: LET g(4)=9: LET g(5)=13: LET g(6)=19: LET g(7)=20: LET g(8)=18: LET g(9)=14: LET g(10)=11: LET g(11)=16: LET g(12)=20: LET g(13)=24
5024 LET top=25: LET score=0: LET score0=0: LET score1=0: LET osiagniecie=1
5030 LET k$="": LET z$="": LET i$=""
5044 REM dane do jabblek, kopce kreta
5045 DATA 1,6,0.5,6,0.5,6,0.5,0,0.5,6,1,9,0.5,6,1,9,0.5,9,0.5,9,0.5,6,0.5,12,2,11,2,9,25,100,150,300,500,750,1000,1500,2000,5000
5046 DATA 14,4,18,5,8,8,9,11,8,14,14,17,18,18,21,15,23,8,22,11,15,9,18,10,15,12
5048 REM Trawa,tlow,  Jablko,Krzaki, Glowa,Morze, Pagorek,paletka
5056 DATA 24,126,255,153,255,255,66,126
5058 DATA 33,0,0,24,36,0,0,192
5059 DATA 28,62,127,255,239,255,126,62
5060 DATA 60,126,126,255,247,255,254,124
5090 DATA "DOBRZE CI IDZIE!","SWIETNA ROBOTA","TO TY! JESTES TYGRYSEM","GRASZ JAK KASPAROW","WOW!","SPECTRUMOWY NAPOLEON","WEZOWY MISTRZ","SWIETNA STRATEGIA","BRAWO","JESTES NAJLEPSZY"
5095 RETURN
5100 REM PRZYGOTOWANIE POLA GRY
5102 REM WARTOSCI TAB 164-krzaki, 143-paletka, 153-jablko, 163-trawa, 159-pagorek, 156-woda
5105 REM PLANSZA KWADRATOWA
5110 FOR x=1 TO 21
5120 FOR y=6 TO 26
5130 LET a(x,y)=126
5140 NEXT y
5150 NEXT x
5160 FOR x=1 TO 21: FOR y=27 TO 32: LET a(x,y)=156: NEXT y: NEXT x
5170 FOR x=1 TO 21: FOR y=1 TO 5: LET a(x,y)=156: NEXT y: NEXT x
5200 REM OSMIOKAT
5205 PAPER 5: PRINT AT 21,32-LEN ("..trwa inicjalizacja danych"); FLASH 1;".."; FLASH 0;"trwa inicjalizacja danych";
5210 LET xc=11: LET yc=11
5220 FOR i=0 TO 6
5230 LET a(xc+10,yc+3-i+5)=124: LET a(xc+10-i,yc-4-i+5)=124: LET a(xc+3-i,yc-10+5)=124: LET a(xc-4-i,yc-10+i+5)=124
5240 LET a(xc-10,yc-3+i+5)=124: LET a(xc-10+i,yc+4+i+5)=124: LET a(xc-3+i,yc+10+5)=124: LET a(xc+4+i,yc+10-i+5)=124
5242 FOR x=6-i TO 1 STEP -1: LET a(1+i,x+5)=156: LET a(21-i,x+5)=156: LET a(1+i,15+i+x+5)=156: LET a(21-i,15+i+x+5)=156: NEXT x
5248 REM trasa paletki x
5250 LET b(i+1)=xc+10: LET b(i+8)=xc+10-i: LET b(i+15)=xc+3-i: LET b(i+22)=xc-4-i: LET b(i+29)=xc-10: LET b(i+36)=xc-10+i: LET b(i+43)=xc-3+i: LET b(i+50)=xc+4+i
5258 REM trasa paletki y
5260 LET c(i+1)=yc+3-i+4: LET c(i+8)=yc-4-i+4: LET c(i+15)=yc-10+4: LET c(i+22)=yc-10+i+4: LET c(i+29)=yc-3+i+4: LET c(i+36)=yc+4+i+4: LET c(i+43)=yc+10+4: LET c(i+50)=yc+10-i+4
5270 NEXT i
5272 FOR i=1 TO 14: READ x: READ y: LET t(i)=x: LET s(i)=y: NEXT i
5273 FOR i=1 TO 10: READ x: LET o(i)=x: NEXT i
5274 FOR i=1 TO 13: READ y: READ x: LET a(x,y)=159: LET a(x,y+1)=160: NEXT i
5278 REM grafika definiowana
5280 LET a=0
5288 FOR i=0 TO 7: READ a: POKE USR "G"+i,a: NEXT i
5289 FOR i=0 TO 7: READ a: POKE USR "M"+i,a: NEXT i
5290 FOR i=0 TO 7: READ a: POKE USR "P"+i,a: NEXT i: FOR i=0 TO 7: READ a: POKE USR "Q"+i,a: NEXT i
5291 PRINT AT 21,32-LEN ("..trwa inicjalizacja danych"); BRIGHT 1;"                           ";
5292 GO SUB anykey
5295 RETURN
5300 REM RYTSOWANIE ELEMENTOW GRY
5305 PAPER 5: BRIGHT 1: CLS : INK 1: PRINT AT 21,32-LEN ("zx81.gerard\@gmail.com");"zx81.gerard\@gmail.com": INK 3: PRINT AT 0,3;"TOP ";top;AT 0,22;"SCORE ";score
5307 FOR x=1 TO 21: FOR y=1 TO 32
5309 IF a(x,y)=126 THEN PAPER 4: INK 6
5310 IF a(x,y)=156 THEN PAPER 5: INK 7: BRIGHT 1
5311 IF a(x,y)=124 THEN PAPER 5: INK 2: BRIGHT 1
5312 IF a(x,y)=159 OR a(x,y)=160 THEN PAPER 2: INK 6
5313 PRINT AT x,y-1;CHR$ a(x,y): BRIGHT 0
5314 NEXT y: NEXT x
5315 PAPER 5: INK 2: BRIGHT 1
5318 FOR i=pos-2 TO pos
5320 PRINT AT b(i),c(i);CHR$ (143)
5340 NEXT i
5342 BRIGHT 0
5360 GO SUB anykey
5370 LET opoznienie=4
5390 RETURN
5400 REM LOSOWANIE JABLUSZEK (czyli $)
5420 PAPER 4: INK 2: BRIGHT 1: FLASH 1: PRINT AT f(posjablko),g(posjablko);CHR$ (36): FLASH 0
5430 RETURN
5500 REM AI
5510 IF xsnake<>0 THEN LET xpomoc=0: LET ypomoc=1-(2 AND g(posjablko)<yhead): GO TO 5530
5520 LET ypomoc=0: LET xpomoc=1-(2 AND f(posjablko)<xhead)
5530 IF SCREEN$ (xhead+xpomoc,yhead+ypomoc)<>CHR$ (143) AND SCREEN$ (xhead+xpomoc,yhead+ypomoc)<>"" THEN LET xsnake=xpomoc: LET ysnake=ypomoc
5599 REM KOLIZJE
5600 LET z$=SCREEN$ (xhead+xsnake,yhead+ysnake)
5605 IF z$=CHR$ (126) THEN RETURN
5610 IF z$=CHR$ (36) THEN LET dlugoscweza=dlugoscweza+(1 AND dlugoscweza<6): GO TO 5700
5620 IF z$=CHR$ (124) THEN LET koniecgry=1: RETURN
5630 LET zwrot=1+(zwrot AND zwrot<10)
5640 IF xsnake<>0 THEN LET xsnake=0: LET ysnake=-1+(2 AND m(zwrot)): GO TO 5680
5650 LET ysnake=0: LET xsnake=-1+(2 AND m(zwrot)):
5660 IF SCREEN$ (xhead+xsnake,yhead+ysnake)=CHR$ (143) OR SCREEN$ (xhead+xsnake,yhead+ysnake)="" THEN LET xsnake=xsnake*(-1)
5670 RETURN
5680 IF SCREEN$ (xhead+xsnake,yhead+ysnake)=CHR$ (143) OR SCREEN$ (xhead+xsnake,yhead+ysnake)="" THEN LET ysnake=ysnake*(-1)
5690 RETURN
5699 REM JABLUSZKA
5700 LET score0=score0+50: IF (flag1) THEN LET flag1=0: LET i$="ROSNIE! ROSNIE!": GO SUB komunikaty
5705 LET posjablko=1+(posjablko AND posjablko<13): IF SCREEN$ (f(posjablko),g(posjablko))=CHR$ (88) THEN GO TO 5705
5710 PAPER 4: INK 2: BRIGHT 1: FLASH 1: PRINT AT f(posjablko),g(posjablko);CHR$ (36): FLASH 0: RETURN
6099 REM CZYSZCZENIE EKRANU
6100 GO SUB anykey
6110 PAPER 4: INK 6: FLASH 0: PRINT AT f(posjablko),g(posjablko);CHR$ (126): FOR i=2 TO dlugoscweza: PRINT AT d(i),e(i);CHR$ (126): NEXT i: PAPER 5: INK 2: BRIGHT 1: PRINT AT d(1),e(1);CHR$ (124): FOR i=1 TO 56: PRINT AT b(i),c(i);CHR$ (124): NEXT i: INK 3: PRINT AT 0,0;"                                ";: PRINT AT 0,3;"TOP ";top;AT 0,22;"SCORE 0";: INK 2
6199 REM PRZYWROCENIE DANYCH
6200 LET posl=5: LET posr=3: LET predkosc=1: LET turbol=0: LET turbor=0: LET pos=posl
6210 LET dlugoscweza=2: LET d(1)=17: LET e(1)=15: LET d(2)=d(1)+1: LET e(2)=e(1): LET xsnake=-1: LET ysnake=0: LET xpomoc=0: LET ypomoc=0: LET xhead=d(1): LET yhead=e(1): FOR i=1 TO 50: LET h(i)=INT (RND*4): NEXT i: FOR i=1 TO 10: LET m(i)=INT (RND*2): NEXT i: LET ai=1: LET zwrot=0: LET xjablko=f(posjablko): LET yjablko=g(posjablko): LET koniecgry=0: LET score=0: LET score0=0: LET score1=0: LET flag=1: LET flag1=1: LET oktawa=1: LET osiagniecie=1: RESTORE 5090
6230 LET k$="": LET z$=""
6240 FOR i=pos-2 TO pos: PRINT AT b(i),c(i);CHR$ (143): NEXT i
6250 GO SUB 5705
6300 RETURN
6399 REM ANY KEY
6400 LET i=0
6402 PAPER 5: INK 3: BRIGHT 1: PRINT AT 0,13; FLASH 1;"ANY KEY";
6405 LET k$=INKEY$: LET i=i+1
6407 IF i>14 THEN LET i=1: LET oktawa=(NOT (oktawa)*12)
6410 IF k$="" THEN BEEP t(i)/opoznienie,s(i)+oktawa: GO TO 6405
6415 BEEP 0,0
6417 PRINT AT 0,0;"                                ": PRINT AT 0,3;"TOP "+STR$ top; FLASH 0;AT 0,28;score: PAPER 5: INK 3: BRIGHT 0
6420 RETURN
6449 REM TRIUMF
6450 BEEP 0.125,12: BEEP 0.125,1
6460 RETURN
6499 REM KOMUNIKATY
6500 PAPER 5: INK 3: BRIGHT 1: PRINT AT 0,0;"                                ";: FLASH 1: PRINT AT 0,16-(LEN (i$)/2);i$;
6540 BEEP 0.5,6: BEEP 0.06,5: BEEP 0.06,6: BEEP 1,9
6545 PRINT AT 0,0; FLASH 0;"                                ";: FLASH NOT flag: PRINT AT 0,3;"TOP "+STR$ top; FLASH 0;AT 0,28;score;: FLASH 0
6550 RETURN
6600 PRINT AT 2,10; INK 2; BRIGHT 1;"SNAKE and TITS";
6610 INK 3: BRIGHT 1: PRINT AT 4,3;"Witaj na przerazajacej wyspie pelnej cyckow, wsrod ktorych   buszuje waz. Pas swojego gada na zielonych lakach i pilnuj zeby nie wpadl do wody!!";
6630 PRINT AT 11,11;"STEROWANIE";
6640 PRINT AT 12,5;"Klawisz "; FLASH 1;"v"; FLASH 0;" i klawisz "; FLASH 1;"b";
6650 PRINT AT 14,11;"PUNKTACJA";
6670 PRINT AT 15,0; INK 2;"5"; INK 3;" pkt za kazdy cm. dlugosci";
6680 PRINT AT 16,0; INK 2;"50"; INK 3;" pkt extra za zjedzenie $";
6690 INK 1: BRIGHT 0
6700 RETURN
Sporo sie nauczylem o specusiu i myslalem ze zdaze zrobic jeszcze jedna gre na konkurs. Troche zniechecilo mnie to wieszanie sie systemu... zobacze jutro. Waz w trakcie kolizji sprawdza tylko 2 kierunki. Czasem moze "przeslizgnac sie przez paletke... jak to waz.
Dolaczam plik .bas jesliby komus sie chcialo zagrac ( jak bedzie sam w domu ^^)
Wszelkie uwagi mile widziane ;)
« Ostatnia zmiana: 2015.01.10, 00:15:35 wysłana przez zx81 »