Snake i Turbo Pascal

0

:::::::: KŁANIAM SIĘ SPOŁECZNOŚCI!

Chciałbym wam przedstawić mój kod konsolowego snake'a.
Chciałbym również zapytać was o opinie o nim ( może być? / może być lepiej ?/ zjeżdzaj facet z takim postem?).

Chwalić skrypty!

:::::::: END

{================================================
  SNAKE ver 0.04.2007
  	                  Copyright (C) M33, 2007 
  
  *mozliwe jest zawracanie w miejscu
  *mozliwe jest "przechodzenie przez siebie"
 ================================================
 ! Nie gwarantuje zrozumialosci			!
 ! komentarzy :)				!
 ================================================
 ? This is OPEN SOURCE
 ? 
 ? NIECH ZYJE WOLNE OPROGRAMOWANIE!!!!!
 ================================================
}
USES Crt;

CONST
 MaxS=99; {max dlugosc weza}

TYPE
 TSnake= RECORD
	 how_long: byte; {czyli "Jak dlugi jest ten waz?"}
	        x: ARRAY[0..MaxS] of integer; {kolejne wspolrzedne x}
	        y: ARRAY[0..MaxS] of integer; {kolejne wspolrzedne y}
              dir:byte;{oznaczenia kierunku ruchu}
	 END;
{
 w zdefiniowanym wyzej typie 
 naszego weza rozumiemy jako 
 zbior wspolzednych Snake.x oraz Snake.y

 Odwolujemy sie do konkretnego elementu Zbioru wspolrzednych poprzez 
 podanie jego numeru np. Snake.x[10]  - odwolanie sie do 10-tej wspolrzednej zbioru Snake.x
					co u nas stanowi jednoczesnie wspolrzedna x
					10-go elementu weza

 ogolnie zapisujemu Snake.x[i] - dla zbioru wspolrzednych x
		    Snake.y[i] - dla zbioru wspolrzednych y
 gdzie "i" to numer elementu o wartosci od 0 do MaxS.
}
 
{
 Program wyswietla znak '*' 
 o wspolrzednych (Snake.x[i];snake.y[i])
 jesli tylko wartosc "i" nie jest wieksza niz wartosc Snake.how_long.
}

VAR
 Snake: TSnake; {nasz waz}
  copy: TSnake; {do tej zmiennej kopiujemy "starego" weza przed jego przesuwaniem"}
     i: byte;
    ch: char;
old_ch: char;

BEGIN {poczatek programu}

Snake.how_long:=9;

Snake.x[0]:=12;
Snake.y[0]:=10;

Snake.x[1]:=11;
Snake.y[1]:=10;

Snake.x[2]:=10;
Snake.y[2]:=10;


Snake.x[3]:=9;
Snake.y[3]:=10;

Snake.x[4]:=8;
Snake.y[4]:=10;

Snake.x[5]:=7;
Snake.y[5]:=10;

Snake.x[6]:=6;
Snake.y[6]:=10;

Snake.x[7]:=5;
Snake.y[7]:=10;

Snake.x[8]:=4;
Snake.y[8]:=10;

ch:='6'; {inicjujemy "ch" nadajac wezowi kierunek poczÄ…tkowy}

while (1=1) do {czyli jeśli 1=1 to wykonaj ***MAIN*** - czyli petla w nieskonczonosc 8) }
Begin{***MAIN***}

while not KeyPressed do {wykonuj tak dlugo jak nie wcisnieto klawisza}

BEGIN {=== NOT KeyPressed ===}

ClrScr;
{wyswietla elementy weza od elementu 0 do Snake.how_long}
for i:=0 to Snake.how_long-1 do begin GoToXY(Snake.x[i],Snake.y[i]); write('#'); end;
copy:=Snake;{kopiuj aktualnego weza do copy - teraz snake i copy to to samo;}

Delay(100);{odczekaj 100 milisekund}

GoToXY(0,0);
WriteLn('');	


case ch of
		'8':begin Snake.y[0]:=Snake.y[0]-1; Snake.dir:=8;end;{w gore}
		'2':begin Snake.y[0]:=Snake.y[0]+1; Snake.dir:=2;end;{w dol}
		'4':begin Snake.x[0]:=Snake.x[0]-1; Snake.dir:=4;end;{w lewo}
		'6':begin Snake.x[0]:=Snake.x[0]+1; Snake.dir:=6;end;{w prawo}
		#27: BEGIN ClrScr; WriteLn('(C) M33, 2007'); halt(0); END; {koniec programu}
	end;
{zostal zmodyfikowany snake.x[0] lub snake.y[0]}

for i:=1 to Snake.how_long-1 do begin Snake.x[i]:=Copy.x[i-1]; Snake.y[i]:=Copy.y[i-1]; end; 
{CZYLI: 
 kazdej wspolzednej weza poczynajac od Snake.x[1] i Snake.y[1]
 przypisuje sie copy.x[i-1] copy.y[i-1], gdzie "i" to numer elementu 
 czyli kazdy kolejny element weza otrzymuje polozenie elementu 
 ktory wczesniej znajdowal sie "przed nim"
}

END;{=== NOT KeyPressed ===}

old_ch:=ch; 
ch:=ReadKey; {pobranie wcisnietego klawisza} {jesli nacisnieto klawisz to zostaje on wczytany do "ch"}
if not ((ch='8')or(ch='2')or(ch='4')or(ch='6')or(ch=#27)) then ch:=old_ch;  
{Jesli wcisnieto klawisz inny niz uzywany w grze to przywroc zmiennej "ch" jej poprzednia wartosc}

End;{***MAIN***}
END.{koniec programu}
0

Ja jóż gdzieś widziałem ten kod (chyba) :>

0

:::::::::: Zapewne w dziale download gdzie go opublikowalem. :-)

0

Może :P
Oczywiście ja nic nie sugerowałem ;D

0

::::::::: A co tu takie wrogie nastawienie do tego posta? 1 za i 2 przeciw. Czyżby kostruktywna krytyka? :-)

0

Mnie się nie podoba, bo nie ma żarcia, bonusów i wąż nie rośnie ;P Z tego co pamiętam takie właśnie opcje umieściłem w moim kodzie węża, poza tym była jeszcze pauza i lista najlepszych graczy. Mój "Snake" nazywał się "Crazy penis", wąż wyglądał jak tytułowy penis, a jedzenie jak pigułka Viagry :D

Co do kodu to proponuję wprowadzić zmienną kierunek, którą modyfikowałbyś w zależności od wciśniętego klawisza. Wtedy nie musiałbyś np. obsługiwać innych klawiszy, program zwyczajnie na nie by nie reagował i nie byłaby potrzebna ta pętla [b]if not[/b].

0

::::::::: Hmm... ale to by pożarło dodatkowa pamięć [green].
Żarcie się doda.
Będzie w sam raz klon snake'a dla BSD, albo innego tekstoweho UNIXopodobszczyka.

0

Jeżeli mówisz o tej proponowanej zmiennej to przecież ona zastąpiłaby zmienną old_key, więc nic by nie pożarło. Jeżeli masz na myśli dodatkowe opcje to nie mogę Ciebie nazwać poważnym twórcą gier ;) w grze przede wszystkim liczy się grywalność oraz ostatnio grafika i dźwięk. Zasobożerność odchodzi na dalszy plan.

0

::::::::: WITAM PONOWNIE !!!
Napisalem snejka jeszcze raz. Teraz bez kopiowania weza (bo poco zasmiecac pamiec :) ).
Z wykrywaniem kolizjii z brzegiem planszy oraz sprawdzaniem czy waz się nie ugryzl :).
na razie bez jedzenia.

{============================================
 SNAKE v. 0.5
  * na planszy 80 x 25 znakow (ibmpc)
  * jeszcze bez jedzenia
                               (C) m33, 2007
 ============================================
}

USES Crt;

CONST
 MAXS = 255; {stala okreslajaca maksymalnÄ… dlugosc weza}

TYPE
 TSnake = RECORD
	   how_long: byte;
		dir: byte;
	          x: array[0..MAXS] of byte;
		  y: array[0..MAXS] of byte;
	  end;

VAR
 snake: TSnake;
     i: byte;
   key: char;

Procedure Intro;
Begin
ClrScr;
WriteLn('mSnake (C) m33, 22 IV 2007');
WriteLn('plansza 80x25 znakow');
WriteLn;
WriteLn('[8] w gore');
WriteLn('[2] w dol');
WriteLn('[4] w lewo');
WriteLn('[6] w prawo');
WriteLn('[P] pauza');
WriteLn('[Esc] koniec');
Repeat until KeyPressed;
End;

Procedure Draw_snake;
Begin
 for i:= 0 to snake.how_long-1 
   do 
    begin 
	GoToXY(snake.x[i],snake.y[i]);
	write('#');
    end;
End;

Procedure Game_over;
Begin
ClrScr;
WriteLn('GAME OVER');
halt(0); 
End;

BEGIN
Intro;

 snake.how_long:=7; {poczatkowa dlugosc}
 snake.dir:=1; {poczatkowy kierunek - w prawo}

 snake.x[0]:=10; {poczatkowa wspolrzedna x "glowy"}
 snake.y[0]:=5;  {poczatkowa wspolrzedna y "glowy"}

 
 snake.x[1]:=9; {poczatkowa wspolrzedna x elementu "tulowia"}
 snake.y[1]:=5; {poczatkowa wspolrzedna y elementu "tulowia"}
 
 snake.x[2]:=8; {j.w}
 snake.y[2]:=5;
 
 snake.x[3]:=7;
 snake.y[3]:=5;
 
 snake.x[4]:=6;
 snake.y[4]:=5;

 snake.x[5]:=5;
 snake.y[5]:=5;
 
 snake.x[6]:=4;
 snake.y[6]:=5;

while (1=1) do
Begin{while (1=1)}

while not KeyPressed do
Begin{while not KeyPressed}

for i:=snake.how_long-1 downto 1
 do
  begin{przesuwanie "tulowia"}
   snake.x[i]:=snake.x[i-1]; snake.y[i]:=snake.y[i-1];
  end;

 case snake.dir of {przesuwanie "glowy" zgodnie z kierunkiem ruchu}
		 1:begin snake.x[0]:=snake.x[0]+1; end; {1- w prawo}
		 2:begin snake.y[0]:=snake.y[0]+1; end; {2- w dol}
		 3:begin snake.x[0]:=snake.x[0]-1; end; {3- w lewo}
		 4:begin snake.y[0]:=snake.y[0]-1; end; {4- p gore}
		end;
{sprawdzanie czy waz siÄ™ "nie ugryzl"}
 for i:=1 to snake.how_long-1 do if snake.x[0]=snake.x[i] then if snake.y[0]=snake.y[i] then Game_over;

{czy nie uderzyl glowa w ktoras krawedz planszy}
if snake.x[0]=0 then Game_over;
if snake.y[0]=0 then Game_over;
if snake.x[0]=81 then Game_over;
if snake.y[0]=26 then Game_over;

ClrScr;
Draw_snake; {rysowanie weza}
Delay(100); {odczekaj 100 milisekund}
End;{while not KeyPressed}

key:=ReadKey; {odczytanie klawisza}

 case key of {zmiana snake.dir chyba ĹĽe gracz chce zmienic kierunek weza na przeciwny od obecnego}
		'6': begin if snake.dir<>3 then snake.dir:=1; end;
		'4': begin if snake.dir<>1 then snake.dir:=3; end;
		'8': begin if snake.dir<>2 then snake.dir:=4; end;
		'2': begin if snake.dir<>4 then snake.dir:=2; end;
	    'P','p': begin ClrScr; GoToXY(30,12); write('*** PAUSE ***'); repeat until ReadKey in ['p','P'] end;
		#27: begin Game_over; end;
	  end;

End;{while (1=1)}
END.
0

To już jest coś! Tylko ja wolę jednak Snake'a w odmianie gdzie po minięciu krawędzi planszy pojawia się on z drugiej strony i gra trwa nadal ;) Teraz jednak Twoim priorytetem powinno być zrobienie jedzenia :)

0
AdamPL napisał(a)

ja wolę jednak Snake'a w odmianie gdzie po minięciu krawędzi planszy pojawia się on z drugiej strony i gra trwa nadal

Mozna dodac opcje gdzie sie wybierze rozne opcje gry... :>

0

::::::::: Oto i kod z opcją tegoż zawijania planszy lub zwykłego zderzenia ze ścianą:

Hmm.. dodanie jedzenia będzie wymagało odwrócenia sposobu zapisu weza. Glowa powinna byc tam gdzie teraz koniec ogona, jeśli nie chcę nadurzywac iteracji. Optymalizacja przede wszystkim! ;]

{============================================
 mSnake v. 0.51                 (C) m33, 2007
 ============================================
 ! poczatek 22 IV 2007                      !
 ============================================

  * dla konsoli
  * na planszy 80 x 25 znakow (ibmpc)

  * dodano opcje 
       *** dnia 24 IV 2007
          - wlacz/wylacz zawijanie
          - regulacja tempa gry

  * jeszcze bez jedzenia

 ============================================}

USES Crt;


CONST
 MAXS = 255; {stala okreslajaca maksymalną dlugosc weza}


TYPE
 TSnake = RECORD
	   how_long: byte; {jak dlugi jest waz}
		dir: byte; {jaki jest kierunek weza}
	          x: array[0..MAXS] of byte; {wspolzedne x segmentow}
		  y: array[0..MAXS] of byte; {wspolzedne y segmentow}
	  end;


VAR
 snake: TSnake; {waz}

      i: byte; {zmienna wykorzystywana do iteracji}
    key: char; {zmienna do przechowywania kodu wcisnietego klawisza}

zawijaj: boolean; {opcja - zawijanie}
  speed: integer; {opcja - opoznienie weza}


{----------------------------------------------------------------------}

Procedure Options;
Begin

Repeat
 ClrScr;
 WriteLn('* OPCJE **********************************************');
 WriteLn;
 if zawijaj=TRUE then WriteLn('[1] - wylacz "zawijanie" planszy')
 else WriteLn('[1] - wlacz "zawijanie" planszy');
 WriteLn;
 WriteLn('[+/-] OPOZNIENIE WEZA: ',speed,' milisekund');
 WriteLn;
 WriteLn('[Esc] - powrot do gry ********************************');

 Key:=ReadKey;
 case Key of
          '1':  zawijaj:=not(zawijaj);
          '+': speed:=speed+1;
          '-': speed:=speed-1;
          end;

 if speed<1    then speed:=1; {zeby nie zawiesic}
 if speed>1000 then speed:=1000; {zeby nie przedobrzyc}

Until Key=#27;

End;


{----------------------------------------------------------------------}

Procedure Intro;
Begin
 ClrScr;
 WriteLn('mSnake (C) m33, 24 IV 2007');
 WriteLn('plansza 80x25 znakow');
 WriteLn;
 WriteLn('[8] w gore');
 WriteLn('[2] w dol');
 WriteLn('[4] w lewo');
 WriteLn('[6] w prawo');
 WriteLn('[P] pauza');
 WriteLn('[O] opcje');
 WriteLn('[Esc] koniec');
Repeat until KeyPressed;
End;


{----------------------------------------------------------------------}

Procedure Draw_snake;
Begin
 for i:= 0 to snake.how_long-1 
   do 
    begin 
	GoToXY(snake.x[i],snake.y[i]);
	write('#');
    end;
End;


{----------------------------------------------------------------------}

Procedure Game_over;
Begin
 ClrScr;
 WriteLn('GAME OVER');
 halt(0); 
End;


{! MAIN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
BEGIN {main}
 Intro;

{opcje poczatkowe}
 zawijaj:=FALSE;{"zawijanie" wylaczone}
 speed:=100; {poczatkowe opoznienie weza}

{snake poczatkowe}
 snake.how_long:=7; {poczatkowa dlugosc}
 snake.dir:=1; {poczatkowy kierunek - w prawo}
 
 snake.x[0]:=10; {poczatkowa wspolrzedna x "glowy"}
 snake.y[0]:=5;  {poczatkowa wspolrzedna y "glowy"}

 snake.x[1]:=9; {poczatkowa wspolrzedna x elementu "tulowia"}
 snake.y[1]:=5; {poczatkowa wspolrzedna y elementu "tulowia"}
 
 snake.x[2]:=8; {j.w}
 snake.y[2]:=5;
 
 snake.x[3]:=7;
 snake.y[3]:=5;
 
 snake.x[4]:=6;
 snake.y[4]:=5;

 snake.x[5]:=5;
 snake.y[5]:=5;
 
 snake.x[6]:=4;
 snake.y[6]:=5;

while (1=1) do
 Begin{while (1=1)*************************************************************************************}

  while not KeyPressed do
  Begin{while not KeyPressed}

    for i:=snake.how_long-1 downto 1
     do
      begin{przesuwanie "tulowia"}
       snake.x[i]:=snake.x[i-1]; snake.y[i]:=snake.y[i-1];
      end;

    case snake.dir of {przesuwanie "glowy" zgodnie z kierunkiem ruchu}
	 	1:begin snake.x[0]:=snake.x[0]+1; end; {1- w prawo}
	 	2:begin snake.y[0]:=snake.y[0]+1; end; {2- w dol}
	 	3:begin snake.x[0]:=snake.x[0]-1; end; {3- w lewo}
	 	4:begin snake.y[0]:=snake.y[0]-1; end; {4- p gore}
		end;

    {sprawdzanie czy waz się "nie ugryzl"}
    for i:=1 to snake.how_long-1 do if snake.x[0]=snake.x[i] then if snake.y[0]=snake.y[i] then Game_over;

{---------- TU OPCJE GRY WPLYWAJA --------------------------------------------------------------------}
    if zawijaj=FALSE then {opcja "zawijanie" wylaczona}
     begin {czy nie uderzyl glowa w ktoras krawedz planszy}
      if snake.x[0]=0 then Game_over;
      if snake.y[0]=0 then Game_over;
      if snake.x[0]=81 then Game_over;
      if snake.y[0]=26 then Game_over;
     end
      else {opcja "zawijanie" wlaczona}
     begin {czesc weza pojawia sie po przeciwnej stronie planszy}
      for i:= 0 to snake.how_long-1 do begin 
  					if snake.x[i]=0 then snake.x[i]:=79;
  					if snake.y[i]=0 then snake.y[i]:=25;
  					if snake.x[i]=81 then snake.x[i]:=1;
  					if snake.y[i]=26 then snake.y[i]:=1;
  			              end;
     end;
{---------- TU OPCJE GRY WPLYW KONCZA -----------------------------------------------------------------}

    ClrScr; {Czyszczenie ekranu}
    Draw_snake; {rysowanie weza}

    Delay(speed); {odczekaj 100 milisekund - wartosc zmieniasz w opcjach}

   End;{while not KeyPressed}

  key:=ReadKey; {odczytanie klawisza}

  case key of {zmiana snake.dir chyba że gracz chce zmienic kierunek weza na przeciwny od obecnego}
		'6': begin if snake.dir<>3 then snake.dir:=1; end;
		'4': begin if snake.dir<>1 then snake.dir:=3; end;
		'8': begin if snake.dir<>2 then snake.dir:=4; end;
		'2': begin if snake.dir<>4 then snake.dir:=2; end;
	    'P','p': begin 
			ClrScr; GoToXY(30,12); write('*** PAUSE ***'); 
			repeat until ReadKey in ['p','P'] 
		     end;
	    'O','o': Options;

		#27: begin Game_over; end;
           end;

 End;{while (1=1) *************************************************************************************}
END.{main}
0

::::::::: [browar] Z dniem dzisiejszym ogłaszam, że gra mSnake jest już kompletnym snejkiem! [browar] :::::::::
Posiada już jedzenie , rosnięcie węża, licznik punktów.

I można włączyć alternatywny tryb rozgrywki - gdy wąż wychodzi za planszę to pojawia się po jej przeciwnej stronie bez konczenia gry. Jak chciał AdamPL

Od teraz będę dodawał dodatkowe opcje.
Jak ktoś mi wyjaśni jak uruchomić w Free Pascalu pod Linuxem grafikę to ją dodam do gry.

{============================================
 mSnake v. 0.61                (C) m33, 2007
 ============================================
 ! poczatek 22 IV 2007                      !
 ============================================
 ! * dla konsoli                            !
 ! * na planszy 80 x 25 znakow (ibmpc)      !
 ============================================ 
      *** dnia 24 IV 2007
        * dodano opcje 
         - wlacz/wylacz zawijanie
         - regulacja tempa gry
      *** dnia 28 IV 2007
	* zmiany
	 - "odwrocene" zapisu weza
	 - po narysowaniu glowy
	   kursor jest przesuwany na nia
         - NARESZCIE DODANO JEDZENIE
      *** dnia 28 IV 2007
	* optymalizacja procedury 
          losowania xy jedzenia

 ============================================
  ZNANE BUGI:
   + TEST na LINUXie  
       1. przy szybkich skretach:
           - mozna przejsc glowa przez ogon
             i dalej grac
           - mozna zawrocic w miejscu 
             co konczy gre
  ******** PODEJRZENIA co dp powodow:
       1. przy szybkich skretach:
          - moze miec to zwiazek 
	   ze stosowaniem procedury delay
	   do chwilowego wstrzymania pracy
 ============================================}

USES Crt;


CONST
 MAXS = 255; {stala okreslajaca maksymalnÄ dlugosc weza}


TYPE
 TSnake = RECORD
	   how_long: byte; {jak dlugi jest waz}
		dir: byte; {jaki jest kierunek weza}
	          x: array[0..MAXS] of byte; {wspolzedne x segmentow}
		  y: array[0..MAXS] of byte; {wspolzedne y segmentow}
	  end;
 TFood = RECORD
	  vis: boolean;
	    x: byte;
	    y: byte;
	 end;


VAR
 snake: TSnake; {waz}
  food: TFood; {jedzenie}

      i: byte; {zmienna wykorzystywana do iteracji}
    key: char; {zmienna do przechowywania kodu wcisnietego klawisza}
  logic: boolean; {do wszelkich warunkow w petlach}

zawijaj: boolean; {opcja - zawijanie}
  speed: integer; {opcja - opoznienie weza}


{------------------------------------------------------------------------------}

Procedure Options;
Begin

Repeat
 ClrScr;
 WriteLn('* OPCJE **********************************************');
 WriteLn;
 if zawijaj=TRUE then WriteLn('[1] - wylacz "zawijanie" planszy')
 else WriteLn('[1] - wlacz "zawijanie" planszy');
 WriteLn;
 WriteLn('[+/-] OPOZNIENIE WEZA: ',speed,' milisekund');
 WriteLn;
 WriteLn('[Esc] - powrot do gry ********************************');

 Key:=ReadKey;
 case Key of
          '1':  zawijaj:=not(zawijaj);
          '+': speed:=speed+1;
          '-': speed:=speed-1;
          end;

 if speed<1    then speed:=1; {zeby nie zawiesic}
 if speed>1000 then speed:=1000; {zeby nie przedobrzyc}

Until Key=#27;

End;


{------------------------------------------------------------------------------}

Procedure Intro;
Begin
 ClrScr;
 WriteLn('mSnake (C) m33, 28 IV 2007');
 WriteLn('plansza 80x25 znakow');
 WriteLn;
 WriteLn('[8] w gore');
 WriteLn('[2] w dol');
 WriteLn('[4] w lewo');
 WriteLn('[6] w prawo');
 WriteLn('[P] pauza');
 WriteLn('[O] opcje');
 WriteLn('[Esc] koniec');
Repeat until KeyPressed;
End;


{------------------------------------------------------------------------------}

Procedure Draw_snake; {rysowanie weza}
Begin
 for i:= 0 to snake.how_long-1 
   do 
    begin 
     GoToXY(snake.x[i],snake.y[i]);
     if i=snake.how_long-1 then begin 
                                 write('0');  GoToXY(snake.x[i],snake.y[i]); 
                                end
     else write('#');
    end;
End;

{------------------------------------------------------------------------------}

Procedure Draw_food; {rysowanie jedzenia}
Begin
 if food.vis=TRUE then 
		     begin 
		      GoToXY(food.x,food.y);
		      Write('*');
		      GoToXY(food.x,food.y);
		     end;
End;

{------------------------------------------------------------------------------}

Procedure Game_over;
Begin
 ClrScr;
 WriteLn('GAME OVER');
 WriteLn('punktow: ',snake.how_long-3);
 halt(0); 
End;


{! MAIN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
BEGIN {main}
 Intro;

{opcje poczatkowe}
 zawijaj:=FALSE;{"zawijanie" wylaczone}
 speed:=100; {poczatkowe opoznienie weza}

{snake poczatkowe}
 snake.how_long:=3; {poczatkowa dlugosc}
 snake.dir:=1; {poczatkowy kierunek - w prawo}
 
 snake.x[2]:=10; {poczatkowa wspolrzedna x "glowy"}
 snake.y[2]:=5;  {poczatkowa wspolrzedna y "glowy"}

 snake.x[1]:=9; {poczatkowa wspolrzedna x elementu "tulowia"}
 snake.y[1]:=5; {poczatkowa wspolrzedna y elementu "tulowia"}
 
 snake.x[0]:=9; {tulowia ciag dalszy}
 snake.y[0]:=5; 

 food.vis:=FALSE; {jedzenie na starcie niewidoczne}

 RANDOMIZE; {inicjowanie generatora liczb pseudolosowych}
while (1=1) do
 Begin{while (1=1)*************************************************************}

  while not KeyPressed do
  Begin{while not KeyPressed}

    for i:=0 to snake.how_long-2
     do
      begin{przesuwanie "tulowia"}
       snake.x[i]:=snake.x[i+1]; snake.y[i]:=snake.y[i+1];
      end;

    case snake.dir of {przesuwanie "glowy" zgodnie z kierunkiem ruchu}
	 	    1:begin snake.x[snake.how_long-1]:=snake.x[snake.how_long-1]+1; end; {1- w prawo}
	 	    2:begin snake.y[snake.how_long-1]:=snake.y[snake.how_long-1]+1; end; {2- w dol}
	 	    3:begin snake.x[snake.how_long-1]:=snake.x[snake.how_long-1]-1; end; {3- w lewo}
	 	    4:begin snake.y[snake.how_long-1]:=snake.y[snake.how_long-1]-1; end; {4- p gore}
		   end;

    {sprawdzanie czy waz siÄ "nie ugryzl"}
    for i:=0 to snake.how_long-2 do if snake.x[snake.how_long-1]=snake.x[i] then if snake.y[snake.how_long-1]=snake.y[i] then Game_over;

{---------- kolizja z jedzeniem  ----------------------------------------------}
    if food.vis=TRUE then { jesli jedzenie widoczne }
			begin 
			 if snake.x[snake.how_long-1]=food.x 
			 then if snake.y[snake.how_long-1]=food.y then 
								   begin 
								     snake.how_long:=snake.how_long+1;

								     case snake.dir of {przyrost weza na dlugosc}
	 								1:begin
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2]+1;
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2];
									  end;
	 								2:begin
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2]+1;
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2];
									  end;
	 								3:begin
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2]-1;
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2];
									  end;
	 								4:begin
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2]-1;
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2]; 
									  end;
								     end;
								     food.vis:=FALSE; {usuwanie jedzenia z widoku}
				   				   end;

			end;

{------------------------------------------------------------------------------}

{--- LOSOWANIE xy jedzenia}
  if food.vis=FALSE then 
		     if snake.how_long<MAXS {jesli waz nie jest juz za dlugi zeby rosnac}
                      then 
		        begin
			 food.vis:=TRUE;
			 logic:=FALSE;
			  repeat {tak dlugo dopoki x i y jedzenie nie "wejda" na weza }
			   food.x:=random(79)+1; 
                           food.y:=random(24)+1;
			   logic:=TRUE;
			   i:=0;
			   while (i<snake.how_long-1)and(logic=TRUE) 
                            do 
                             begin 
				i:=i+1;
				if (food.x=snake.x[i]) then if (food.y=snake.y[i]) then logic:=FALSE; 
			     end;
			  until logic=TRUE;
		       end;	
{-------------------------}

{---------- TU OPCJE GRY WPLYWAJA ---------------------------------------------}
    if zawijaj=FALSE then {opcja "zawijanie" wylaczona}
     begin {czy nie uderzyl glowa w ktoras krawedz planszy}
      if snake.x[snake.how_long-1]<1 then Game_over;
      if snake.y[snake.how_long-1]<1 then Game_over;
      if snake.x[snake.how_long-1]>80 then Game_over;
      if snake.y[snake.how_long-1]>25 then Game_over;
     end
    else {opcja "zawijanie" wlaczona}
     begin {czesc weza pojawia sie po przeciwnej stronie planszy}
      for i:= 0 to snake.how_long-1 do begin 
  					if snake.x[i]=0 then snake.x[i]:=79;
  					if snake.y[i]=0 then snake.y[i]:=25;
  					if snake.x[i]=81 then snake.x[i]:=1;
  					if snake.y[i]=26 then snake.y[i]:=1;
  			              end;
     end;
{---------- TU OPCJE GRY WPLYW KONCZA -----------------------------------------}

    ClrScr; {Czyszczenie ekranu}
    Draw_snake; {rysowanie weza}
    Draw_food; {rysowanie jedzenia}

    Delay(speed); {odczekaj 100 milisekund - wartosc zmieniasz w opcjach}

   End;{while not KeyPressed}

  key:=ReadKey; {odczytanie klawisza}

  case key of {zmiana snake.dir chyba Ĺźe gracz chce zmienic kierunek weza na przeciwny od obecnego}
	    '6': begin if snake.dir<>3 then snake.dir:=1; end;
	    '4': begin if snake.dir<>1 then snake.dir:=3; end;
	    '8': begin if snake.dir<>2 then snake.dir:=4; end;
	    '2': begin if snake.dir<>4 then snake.dir:=2; end;
	    'P','p': begin 
		      ClrScr; GoToXY(30,12); write('*** PAUSE ***'); 
		      repeat until ReadKey in ['p','P'];
	             end;
	    'O','o': Options;
	    #27: begin Game_over; end;
           end;

 End;{while (1=1) *************************************************************}
END.{main}
0

Ta... jeszcze tylko efektowne intro autora.

0

::::::::: WITAM!

Publikuj kod aktualnej wersji, bo w downloadyie cyepia si e nieprawidowz tzp MIME. Co wzđcie tam nakrcili_ Wcyesniej sie niecyepial! ;-)

Dodano w nim animowane intro i outro (game over) :>

{============================================
 mSnake v. 0.6.5              (C) m33, 2007
 ============================================
 ! poczatek 22 IV 2007                      !
 ============================================
 ! * dla konsoli                            !
 ! * na planszy 80 x 25 znakow (ibmpc)      !
 ============================================ 
  ZMIANY & INNOWACJE:
      *** dnia 24 IV 2007
        * dodano opcje 
         - wlacz/wylacz zawijanie
         - regulacja tempa gry
      *** dnia 28 IV 2007
	* zmiany
	 - "odwrocene" zapisu weza
	 - po narysowaniu glowy
	   kursor jest przesuwany na nia
         - NARESZCIE DODANO JEDZENIE
      *** dnia 28 IV 2007
	* optymalizacja procedury 
          losowania xy jedzenia
      *** dnia 3 V 2007
	* dodanie kolorow
	* wykrywanie kolizji z jedzeniem i 
	  losowaniejego nowych xy przesunieto 
	  na koniec glownej petli
      *** dnia 14 V 2007
	* animowane menu startowe
      *** dnia 18 V 2007
	* animaowany napi "GAME OVER"
	* wydluzono max. dlugosc weza	

 ============================================
  ZNANE BUGI:
   + TEST na LINUXie  
       1. przy szybkich skretach:
           - mozna przejsc glowa przez ogon
             i dalej grac
           - mozna zawrocic w miejscu 
             co konczy gre
  ******** PODEJRZENIA co dp powodow:
       1. przy szybkich skretach:
          - moze miec to zwiazek 
	   ze stosowaniem procedury delay
	   do chwilowego wstrzymania pracy
 ============================================}

USES Crt;

CONST
{naspis "SNAKE"}
logo:array [0..9,0..59] of byte=(
(0,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,8,0,0,0,8,8,8,0,0,0,0,0,0,8,8,8,0,0,0,0,0,8,8,8,8,0,0,0,0,8,8,8,8,0,8,8,8,8,8,8,8,8,8),
(8,8,8,8,8,8,8,8,8,8,8,8,0,8,8,8,8,8,0,0,0,8,8,8,0,0,0,0,0,8,8,8,8,8,0,0,0,0,8,8,8,8,0,0,8,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8),
(8,8,8,8,0,0,0,0,8,8,8,8,0,8,8,8,8,8,8,0,0,8,8,8,0,0,0,0,0,8,8,8,8,8,0,0,0,0,8,8,8,8,8,8,8,8,8,0,0,0,0,8,8,8,8,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,0,8,8,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,0,0,0,0,8,8,8,8,8,8,8,0,0),
(0,8,8,8,8,8,8,8,8,8,8,8,0,8,8,8,0,8,8,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,0,0),
(0,0,0,0,0,0,0,0,8,8,8,8,0,8,8,8,0,0,8,8,8,8,8,8,0,0,8,8,8,8,0,0,8,8,8,8,0,0,8,8,8,8,0,0,8,8,8,8,8,0,0,8,8,8,8,0,0,0,0,0),
(8,8,8,8,8,8,8,8,8,8,8,8,0,8,8,8,0,0,8,8,8,8,8,8,0,0,8,8,8,8,0,0,0,8,8,8,8,0,8,8,8,8,0,0,0,8,8,8,8,8,0,8,8,8,8,8,8,8,8,8),
(8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,0,0,0,8,8,8,8,8,0,8,8,8,8,0,0,0,0,8,8,8,8,0,8,8,8,8,0,0,0,0,8,8,8,8,0,8,8,8,8,8,8,8,8,8)
);

{napis "GAME OVER"}
g_over: array [0..19,0..72] of byte=
(
(0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8),
(0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,0),
(0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,0,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,0,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,0,0,8,8,8,8,8,8,8,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0),
(0,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8,8,0,0,0,8,8,8,8,8,0,0,8,8,8,8,0,0,0,0,0,8,8,8,0,0,8,8,8,0,0,0,8,8,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0),
(0,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,8,8,8,8,0,0,0,8,8,8,8,0,0,0,0,0,8,8,8,0,0,8,8,8,0,8,8,8,8,0,8,8,8,8,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0),
(0,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,8,8,8,8,0,0,8,8,8,8,8,8,8,0,0,8,8,8,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0),
(8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,8,8,8,0,0,0,8,8,8,8,8,8,0,0,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0),
(8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,0,0,0,8,8,8,0,0,0,0,8,8,8,0,0,0,0,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,0,0,0,0,0,0,0,0,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0),
(0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,8,8,8,0,0,0,0,0,0,0,0,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0),
(0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,8,8,8,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,0),
(0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,8,8,8,8,0,0,0,0,8,8,8,8,0,0,0,0,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0),
(0,0,0,0,8,8,8,0,0,0,0,0,0,0,0,0,8,8,8,0,0,0,0,0,8,8,8,8,0,0,0,8,8,8,8,8,0,0,0,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,0,0),
(0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,8,8,8,8,0,0,0,8,8,8,8,0,0,0,0,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0),
(0,0,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,8,8,8,8,0,0,8,8,8,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,8,8,8,8,0,0,0,0),
(0,0,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,8,8,8,8,0,8,8,8,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,0,0,0,0),
(0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0),
(0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,8,8,8,0,0,0,0,0,0,0,0,8,8,8,0,0,0,0,0)
);


CONST
 MAXS = 500; {stala okreslajaca maksymalną dlugosc weza}


TYPE
 TSnake = RECORD
	   how_long: byte; {jak dlugi jest waz}
		dir: byte; {jaki jest kierunek weza}
	          x: array[0..MAXS] of byte; {wspolzedne x segmentow}
		  y: array[0..MAXS] of byte; {wspolzedne y segmentow}
	  end;
 TFood = RECORD
	  vis: boolean;
	    x: byte;
	    y: byte;
	 end;


VAR
 snake: TSnake; {waz}
  food: TFood; {jedzenie}

      i: integer; {zmienna wykorzystywana do iteracji}
    key: char; {zmienna do przechowywania kodu wcisnietego klawisza}
  logic: boolean; {do wszelkich warunkow w petlach}

zawijaj: boolean; {opcja - zawijanie}
  speed: integer; {opcja - opoznienie weza}


{------------------------------------------------------------------------------}

Procedure Options;
Begin

Repeat
 ClrScr;
 TextColor(White);
 WriteLn('* OPCJE **********************************************');
 WriteLn;
 TextColor(LightGray);
 if zawijaj=TRUE then WriteLn('[1] - wylacz "zawijanie" planszy')
 else WriteLn('[1] - wlacz "zawijanie" planszy');
 WriteLn;
 WriteLn('[+/-] OPOZNIENIE WEZA: ',speed,' milisekund');
 WriteLn;
 TextColor(White);
 WriteLn('[Esc] - powrot do gry ********************************');

 Key:=ReadKey;
 case Key of
          '1':  zawijaj:=not(zawijaj);
          '+': speed:=speed+1;
          '-': speed:=speed-1;
          end;

 if speed<1    then speed:=1; {zeby nie zawiesic}
 if speed>1000 then speed:=1000; {zeby nie przedobrzyc}

Until Key=#27;

End;


{------------------------------------------------------------------------------}

Procedure Intro;{animowane intro}
Begin
 ClrScr;
for i:=0 to 9   
	do begin 
		for speed:=0 to 59 
			do begin
				if logo[i,speed]=8 then begin  
				 			GoToXY(speed+1,i+1);
								case i of
								0..1:TextColor(cyan);
								2..4:TextColor(lightCyan);
								5..6:TextColor(white);
								7..9:TextColor(lightGreen);
								end;
							Write('8'); 	
							TextColor(DarkGray);
							GoToXY(speed+1,i+1+1);Write('&'); 
							
							end;
				
			   end;
	 for speed:= 1 to 80 do begin 
					gotoxy(speed,i+3);
					write(' ');
					textcolor(white);
					gotoxy(speed,i+4);
					write('=');
				end;
 TextColor(Cyan);
WriteLn;
 WriteLn('(C) m33, 18 V 2007       ');
WriteLn('                           ');
 TextColor(White);
 WriteLn('plansza 80x25 znakow      ');
 TextColor(LightGray);
WriteLn('                           ');
 WriteLn('[8] w gore  ');
 WriteLn('[2] w dol   ');
 WriteLn('[4] w lewo  ');
 WriteLn('[6] w prawo ');
 WriteLn('[P] pauza   ');
 WriteLn('[O] opcje   ');
 WriteLn('[Esc] koniec');
delay(50);
	end;
GoToXY(62,10);
write('v 0.65');
GoToXY(62,10);
Repeat until KeyPressed;
End;


{------------------------------------------------------------------------------}

Procedure Draw_snake; {rysowanie weza}
Begin
 for i:= 0 to snake.how_long-1 
   do 
    begin 
     TextColor(LightGreen);
     GoToXY(snake.x[i],snake.y[i]);
     if i=snake.how_long-1 then begin 
                                 write('0');  GoToXY(snake.x[i],snake.y[i]); 
                                end
     else write('#');
    end;
End;

{------------------------------------------------------------------------------}

Procedure Draw_food; {rysowanie jedzenia}
Begin
 if food.vis=TRUE then 
		     begin 
		      GoToXY(food.x,food.y);
		     TextColor(cyan);
		      Write('*');
		      GoToXY(food.x,food.y);
		     end;
End;

{------------------------------------------------------------------------------}

Procedure Game_over;
Begin
 ClrScr;
 for i:=0 to 19   
	do begin 
		for speed:=0 to 72 
			do begin
				if g_over[i,speed]=8 then begin  
				 			GoToXY(speed+5,i+3);
								case i of
								0,2,4,6,8,10,12,14,16,18:TextColor(Red);
								1,3,5,7,9,11,13,15,17,19:TextColor(lightRed);
								end;
							Write('8'); 	
							TextColor(LightGray);
							GoToXY(speed+5+1,i+3+1);Write('&'); 
							end;
		
			end;

		Delay(50);
 		if i=9 then delay(250);
		
	end;

 	Delay(250);
	i:=0;
 		repeat
			GoToXY(random(80+1),random(25+1));
			 write(' '); 
			if i mod 33 =0 then delay(1);
			i:=i+1;
		until (i=5000) or (KeyPressed);
 ClrScr;
 TextColor(White);
 WriteLn('punktow: ',snake.how_long-3);
 TextColor(LightGray);
 halt(0); 
End;

{------------------------------------------------------------------------------}

{! MAIN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
BEGIN {main}
 
 Intro;

{opcje poczatkowe}
 zawijaj:=FALSE;{"zawijanie" wylaczone}
 speed:=100; {poczatkowe opoznienie weza}

{snake poczatkowe}
 snake.how_long:=3; {poczatkowa dlugosc}
 snake.dir:=1; {poczatkowy kierunek - w prawo}
 
 snake.x[2]:=10; {poczatkowa wspolrzedna x "glowy"}
 snake.y[2]:=5;  {poczatkowa wspolrzedna y "glowy"}

 snake.x[1]:=9; {poczatkowa wspolrzedna x elementu "tulowia"}
 snake.y[1]:=5; {poczatkowa wspolrzedna y elementu "tulowia"}
 
 snake.x[0]:=9; {tulowia ciag dalszy}
 snake.y[0]:=5; 

 food.vis:=FALSE; {jedzenie na starcie niewidoczne}

 RANDOMIZE; {inicjowanie generatora liczb pseudolosowych}

while (1=1) do
 Begin{while (1=1)*************************************************************}

  while not KeyPressed do
  Begin{while not KeyPressed}

    for i:=0 to snake.how_long-2
     do
      begin{przesuwanie "tulowia"}
       snake.x[i]:=snake.x[i+1]; snake.y[i]:=snake.y[i+1];
      end;

    case snake.dir of {przesuwanie "glowy" zgodnie z kierunkiem ruchu}
	 	    1:begin snake.x[snake.how_long-1]:=snake.x[snake.how_long-1]+1; end; {1- w prawo}
	 	    2:begin snake.y[snake.how_long-1]:=snake.y[snake.how_long-1]+1; end; {2- w dol}
	 	    3:begin snake.x[snake.how_long-1]:=snake.x[snake.how_long-1]-1; end; {3- w lewo}
	 	    4:begin snake.y[snake.how_long-1]:=snake.y[snake.how_long-1]-1; end; {4- p gore}
		   end;

    {sprawdzanie czy waz się "nie ugryzl"}
    for i:=0 to snake.how_long-2 do if snake.x[snake.how_long-1]=snake.x[i] then if snake.y[snake.how_long-1]=snake.y[i] then Game_over;


{---------- TU OPCJE GRY WPLYWAJA ---------------------------------------------}
    if zawijaj=FALSE then {opcja "zawijanie" wylaczona}
     begin {czy nie uderzyl glowa w ktoras krawedz planszy}
      if snake.x[snake.how_long-1]<1 then Game_over;
      if snake.y[snake.how_long-1]<1 then Game_over;
      if snake.x[snake.how_long-1]>80 then Game_over;
      if snake.y[snake.how_long-1]>25 then Game_over;
     end
    else {opcja "zawijanie" wlaczona}
     begin {czesc weza pojawia sie po przeciwnej stronie planszy}
      for i:= 0 to snake.how_long-1 do begin 
  					if snake.x[i]=0 then snake.x[i]:=79;
  					if snake.y[i]=0 then snake.y[i]:=25;
  					if snake.x[i]=81 then snake.x[i]:=1;
  					if snake.y[i]=26 then snake.y[i]:=1;
  			              end;
     end;
{---------- TU OPCJE GRY WPLYW KONCZA -----------------------------------------}
{---------- kolizja z jedzeniem  ----------------------------------------------}
{po wszelkich przesunieciach!!!}
    if food.vis=TRUE then { jesli jedzenie widoczne }
			begin 
			 if snake.x[snake.how_long-1]=food.x 
			 then if snake.y[snake.how_long-1]=food.y then 
								   begin 
								     snake.how_long:=snake.how_long+1;

								     case snake.dir of {przyrost weza na dlugosc}
	 								1:begin
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2]+1;
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2];
									  end;
	 								2:begin
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2]+1;
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2];
									  end;
	 								3:begin
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2]-1;
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2];
									  end;
	 								4:begin
									   snake.y[snake.how_long-1]:=snake.y[snake.how_long-2]-1;
									   snake.x[snake.how_long-1]:=snake.x[snake.how_long-2]; 
									  end;
								     end;
								     food.vis:=FALSE; {usuwanie jedzenia z widoku}
				   				   end;

			end;

{------------------------------------------------------------------------------}

{--- LOSOWANIE xy jedzenia}
  if food.vis=FALSE then 
		     if snake.how_long<MAXS {jesli waz nie jest juz za dlugi zeby rosnac}
                      then 
		        begin
			 food.vis:=TRUE;
			 logic:=FALSE;
			  repeat {tak dlugo dopoki x i y jedzenie nie "wejda" na weza }
			   food.x:=random(79)+1; 
                           food.y:=random(24)+1;
			   logic:=TRUE;
			   i:=0;
			   while (i<snake.how_long-1)and(logic=TRUE) 
                            do 
                             begin 
				i:=i+1;
				if (food.x=snake.x[i]) then if (food.y=snake.y[i]) then logic:=FALSE; 
			     end;
			  until logic=TRUE;
		       end;	
{-------------------------}

    ClrScr; {Czyszczenie ekranu}
    Draw_snake; {rysowanie weza}
    Draw_food; {rysowanie jedzenia}

    Delay(speed); {odczekaj 100 milisekund - wartosc zmieniasz w opcjach}

   End;{while not KeyPressed}

  key:=ReadKey; {odczytanie klawisza}

  case key of {zmiana snake.dir chyba że gracz chce zmienic kierunek weza na przeciwny od obecnego}
	    '6': begin if snake.dir<>3 then snake.dir:=1; end;
	    '4': begin if snake.dir<>1 then snake.dir:=3; end;
	    '8': begin if snake.dir<>2 then snake.dir:=4; end;
	    '2': begin if snake.dir<>4 then snake.dir:=2; end;
	    'P','p': begin 
		      TextColor(LightRed);
		      ClrScr; GoToXY(30,12); 
		      write('*** PAUSE ***'); 
		      repeat until ReadKey in ['p','P'];
	             end;
	    'O','o': Options;
	    #27: begin Game_over; end;
           end;

 End;{while (1=1) *************************************************************}
END.{main}
0

To chyba najdluzszy post na tym forum... Respect dla tych, ktorym chcialo sie to czytac [diabel] . Co do kodu, to mysle, ze lepiej wygladalby waz z jakas grafika, a nie z 8 czy czego tam jest :P Fajnie gdyby bylo kilka wezy o roznych kolorach i wlasciwosciach (np. jeden bardzo szybki, inny moze sie skrucic czy cus), i przydalyby sie premie jakies.

0
WIktorDelphi napisał(a)

To chyba najdluzszy post na tym forum... Respect dla tych, ktorym chcialo sie to czytac [diabel] . Co do kodu, to mysle, ze lepiej wygladalby waz z jakas grafika, a nie z 8 czy czego tam jest :P Fajnie gdyby bylo kilka wezy o roznych kolorach i wlasciwosciach (np. jeden bardzo szybki, inny moze sie skrucic czy cus), i przydalyby sie premie jakies.

Premie bedą juz niedlugo. Grafikę dodam, a może i nie ( niejaki talent w dziedzinie grafiki mam, ale czy w tej grze jest ona konieczna? ), jak będzie życie pokaże.

Póki co w tygodniu mam jakieś 80 pobrań i coraz wyżej pnie się w rankingu liczby pobrań. [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1