#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <ncurses.h>

#define X 80       
#define Y 25
#define MAXDLUGOSC 2000

char A[X][Y];	//pamięc na plansze do gry

typedef struct
  {
    char x;
    char y;
    }
 element;
	

element waz [MAXDLUGOSC];
char wazc[MAXDLUGOSC];


void randomize(void) //inicjalizaczja generatora liczb losowych
{
    srand((int) time(NULL));
}
    
inline int randominteger(int low, int high) // zwraca losową liczbę z podanego zakresu
{
    return (rand() % (high - low +1))+low;
}
	

void rysuj () 
{
  int i, j;
  for (i = 0; i < X; i++)
    {
      for (j = 0; j < Y; j++)
        if (A[i][j])  
	  {
	    bkgdset (COLOR_PAIR (A[i][j]));
	    mvaddch (j, i, '*');
	  }
	else 
	    mvaddch (j, i, ' ');
	  
    }
}

void zeruj () //czyści pamięć
{
int i,j;
  for (i = 0; i < X; i++)
    for (j = 0; j < Y; j++)
      A[i][j] = 0;  
}

void dodajweza(int d) //dodaje węża do pamięci
{
int i;
for (i = 0; i < d; i++)
  A[waz[i].x][waz[i].y] = wazc[i];
} 

int main (int argc, char **argv) 
{
  int c, kierunekx=1, kieruneky=0;
  int i, dl=5, jx,jy;

  initscr (); // inicjalizacja ncurses
  noecho (); 
  keypad (stdscr, TRUE);
  start_color ();
for (i = 1; i <= 7; i++)
  init_pair (i, i, COLOR_BLACK); 
  randomize();
  clear ();

for (i = 0; i < MAXDLUGOSC; i++)
  {
  waz[i].x=X/2;
  waz[i].y=Y/2;
  wazc[i]=randominteger(1,7); //losuje kolory segmentów węża
  }
/*
for (i = 1; i <= 7; i++)
  {
  bkgdset (COLOR_PAIR (i));
  mvaddch (Y, X/2+i, i+'0');
  }*/
zeruj();
jx=randominteger(0,X-1);
jy=randominteger(0,Y-1);
halfdelay(1); // ustawia czas oczekiwania na naciśnięcie klawisza
while (A[waz[0].x][waz[0].y]==0) //tak długo ża na coś nie najedzie
  {   
      zeruj ();
      dodajweza(dl);
      rysuj ();
      bkgdset (COLOR_PAIR (wazc[dl]));
      mvaddch (jy, jx, 'X');
      move(jy,jx);
      refresh ();
      c = getch ();
      if (c == KEY_DOWN && kieruneky!= -1) {kieruneky=1; kierunekx=0;}
      if (c == KEY_UP && kieruneky!= 1) {kieruneky=-1; kierunekx=0;}
      if (c == KEY_LEFT && kierunekx!= 1 ) {kieruneky=0; kierunekx=-1;}
      if (c == KEY_RIGHT && kierunekx!= -1) {kieruneky=0; kierunekx=1;}
      
      for (i=MAXDLUGOSC-1;i>0;i--) // wykonuje ruch
        waz[i]=waz[i-1];
      waz[0].x+=kierunekx;
      waz[0].y+=kieruneky;
      
      if (waz[0].x==X) waz[0].x=0; //zawijanie na krańcu ekranu
      if (waz[0].y==Y) waz[0].y=0;
      if (waz[0].x==-1) waz[0].x=X-1;
      if (waz[0].y==-1) waz[0].y=Y-1;
      
      if (waz[0].x==jx && waz[0].y==jy) // wydłużanie węża
         {
	 dl++;
	 do {
	     jx=randominteger(0,X-1);
             jy=randominteger(0,Y-1);
	     }
	 while(A[jx][jy]);
	 }
  }
  halfdelay(255);
  getch();
  endwin ();
  return 0;
}