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;
}