projekt wą?ż

0

Chodzi o grę wąż. Opracowałem go na jednej tablicy dwuwymiarowej, waz ma numery od 1 wzwyż (zaczynając od ogona, głowa jest najwyższym numerem i określa m.in. długość węża). wolne pola są opisane cyframi 0, jedzenie bodajrze -1, a ściana -2. Przy każdym ruchu liczby dodatnie zmniejszają się o 1, a tam gdzie ma pójść wąż, to pole ma przypisywany numer głowy. I tutaj jest pies pogrzebany :) przy każdym odczycie z klawiatury, program zmniejsza mi dlugosc węża. Przy normalnym ruchu (bez podania komend z klawiatury wszystko działa nienagannie). Nie wiem gdzie popełniłem błąd :( Pomóżcie.
To jest kod źródłowy który nie chodzi tak jak powinien:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>

int mapa[33][20];

void inicjuj_gre()
{
   clrscr();
   for(int i=0; i<20; i++)
      for(int j = 0; j<33; j++)
	 mapa[j][i] = 0;
}
void rysuj_mape()
{
   clrscr();
   for(int i=0;i<33;i++)
      for(int j=0;j<20;j++)
      {
	 gotoxy(2*i+1,j+1);
	 switch(mapa[i][j])
	 {
	 case 0:
	    printf("  ");
	    break;
	 default:
	    printf("%d%c", mapa[i][j], 219);
	    break;
	 }
      }
}
struct punkt
{
   int x, y;
};
punkt glowa, ogon;
punkt poprzedni(punkt p)
{
   punkt ret;
   ret.x = -1;
   ret.y = -1;
   if( mapa[p.x+1][p.y] == mapa[p.x][p.y] - 1 )
   {
      ret.x = p.x+1;
      ret.y = p.y;
   }
   if( mapa[p.x-1][p.y] == mapa[p.x][p.y] - 1 )
   {
      ret.x = p.x-1;
      ret.y = p.y;
   }
   if( mapa[p.x][p.y+1] == mapa[p.x][p.y] - 1 )
   {
      ret.x = p.x;
      ret.y = p.y+1;
   }
   if( mapa[p.x][p.y-1] == mapa[p.x][p.y] - 1 )
   {
      ret.x = p.x;
      ret.y = p.y-1;
   }
   return ret;
}
int main()
{
   inicjuj_gre();
   mapa[2][10] = 1;
   mapa[3][10] = 2;
   mapa[4][10] = 3;

   glowa.x=4;
   glowa.y = 10;
   ogon.x = 2;
   ogon.y = 10;
   //ogon = glowa;
   char klawisz = 77;
   punkt stara_glowa;
   while(klawisz != 27)
   {
      stara_glowa = glowa;
      if(kbhit())
      {
	 klawisz = getch();
	 //fflush();
      }
      switch(klawisz)
      {
      case 72: // gora
	 glowa.y --;
	 break;
      case 80: // dol
	 glowa.y ++;
	 break;
      case 75: // lewo
	 glowa.x --;
	 break;
      case 77: // prawo
	 glowa.x ++;
	 break;
      }
      //mapa[glowa.x][glowa.y] = mapa[stara_glowa.x][stara_glowa.y];
      mapa[glowa.x][glowa.y] = mapa[stara_glowa.x][stara_glowa.y];
      punkt aktualny;
      aktualny = stara_glowa;
      do
      {
	 aktualny = poprzedni(aktualny);
	 mapa[stara_glowa.x][stara_glowa.y] --;
	// if( mapa[aktualny.x][aktualny.y] > 0 )
	    stara_glowa = aktualny;
	 if( mapa[aktualny.x][aktualny.y] == 2 )
	    ogon = aktualny;
      }while(mapa[aktualny.x][aktualny.y] > 0);
      //ogon = stara_glowa;
      //gotoxy(glowa.x * 2 +1, glowa.y +1);
      textcolor(WHITE);
      //cprintf("%c%c", 219, 219);
      //gotoxy(2*stara_glowa.x+1, stara_glowa.y+1);
      //textcolor(BLACK);
      //cprintf("%c%c", 219,219);
      rysuj_mape();
      delay(1000);
   }
   return 0;
}
0

Szczerze powiem , że długo szukałem błędu , ale postanowiłem nie dawać za wygraną ;) . Okazało się , że mam sklerozę w zaawansowanym stadium . Zapomniałem , że przy naciśnięciu strzałki najpierw wysyłany jest znak o kodzie ASCII = 0 , a dopiero potem kod danego klawisza : 77 , 75 itp . Wprowadziłem malutkie poprawki w głównej pętli na początku , teraz działa idealnie . Jednak twój sposób i tak ma błędziki , np : zaraz po starcie naciśnij strzałkę w lewo a potem w górę . Podejrzewam , że więcej by się tego znalazło . Powodzenia !

while(1)
   {
      stara_glowa = glowa;

      if(kbhit())
      {
	switch(getch())
	{
	  case 0:
	  klawisz=getch();
	  break;

	  case 27:
	  return 0;
	}
      }

      switch(klawisz)
      {
      case 72: // gora
	glowa.y --;
	break;

      case 80: // dol
	glowa.y ++;
	break;

      case 75: // lewo
	glowa.x --;
	break;

      case 77: // prawo
	glowa.x ++;
	break;
      }

      //mapa[glowa.x][glowa.y] = mapa[stara_glowa.x][stara_glowa.y];
      mapa[glowa.x][glowa.y]=mapa[stara_glowa.x][stara_glowa.y];
      punkt aktualny;
      aktualny = stara_glowa;
      do
      {
aktualny = poprzedni(aktualny);
mapa[stara_glowa.x][stara_glowa.y] --;
// if( mapa[aktualny.x][aktualny.y] > 0 )
    stara_glowa = aktualny;
if( mapa[aktualny.x][aktualny.y] == 2 )
    ogon = aktualny;
      }while(mapa[aktualny.x][aktualny.y] > 0);
      //ogon = stara_glowa;
      //gotoxy(glowa.x * 2 +1, glowa.y +1);
      textcolor(WHITE);
      //cprintf("%c%c", 219, 219);
      //gotoxy(2*stara_glowa.x+1, stara_glowa.y+1);
      //textcolor(BLACK);
      //cprintf("%c%c", 219,219);
      rysuj_mape();
      delay(1000);
    }
0

Dzieki myslalem, ze nikt nie moze znalezc bledu. Jezeli ktos znajdzie jeszcze jakies bledy to dziekuje za opublikowanie ich. Ja dopiero zaczynam programowac i niestety nie wiem o takich niuansach. z tym poczatkiem to mam zamiar zrbic aby waz wychodzil z dolu, np. z srodka dolnej sciany po uprzednim nacisnieciu strzalki do gory.
Pozdrowienia

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