Snake nie "sprząta" po sobie

0

Witam. Jestem początkującym "programistą", który porwał się z motyką na słońce. Mianowicie stworzyłem snake'a w tablicy dwuwymiarowej. Właściwe chyba prawie wszystko jest z nim w porządku, gdyby nie fakt, że zostawia po sobie ślady. Chodzi o to, że przy poruszaniu w linii prostej, kasuje odpowiednio za sobą elementy, ale przy skręcie kończy kasować, zostawia niedokończoną robotę i zaczyna kasować od nowa w linii obróconej o 90 stopni. Myślę nad tym od tygodnia, ale chyba jestem zbyt głupi :v

Help plz. Wiem, strasznie długi kod :c

#include <iostream>
#include <conio.h>
#include <iomanip>  // do czego to dałem to nie wiem
#include <ctime>    //do losowosci
#include <windows.h>  //do odczekania chwili na ruch
using namespace std;
void ramka(), tablica(), jedzenie(), ruch(), ruch_swobodny(), koniec();  //deklaracje funkcji

const int W = 20;  //wiersze
const int K = 20;  //komórki
char plansza[W][K];
int d = 5, x = 5, c = 1, t = 0, P, X, D, T, S;
char o = 'o', czubek = '#', amciu = '+';	// o - ściana, czubek - wąż, amciu - jedzenie


void ramka()
{
	for (int i = 0; i < W; i++) 	//wpisanie ścian do tablicy 'plansza'
	{
		for (int j = 0; j < K; j++)   //lewy gorny rog do prawego
		{
			plansza[0][j] = o;
		}

		for (int j = 1; j < K; j++)   //prawy gorny rog do dolu
		{
			plansza[j][K - 1] = o;
		}

		for (int j = K - 2; j >= 0; j--)   //prawy dolny róg do lewego
		{
			plansza[K - 1][j] = o;
		}

		for (int j = K - 2; j >= 1; j--)   //lewy dolny róg do górnego
		{
			plansza[j][0] = o;
		}
	}
}


void jedzenie()
{
	int i, z;
	srand(time(NULL));

	i = (rand() % (W-2)) + 1;  //losowanie liczby z przedzialu (1-23)
	z = (rand() % (K-2)) + 1;  //losowanie liczby z przedzialu (1-23)

	if (plansza[i][z] != czubek)  //żeby nie wstawiało X na wężu
	{
		plansza[i][z] = amciu;
	}
	else jedzenie();	//czy to aby na pewno jest okey?
}


void ruch()     //ruch powodowany wciśnięciem klawisza
{
	int a;
	if (_kbhit())
	{
		a = _getch();

		switch (a)
		{
		case 119:  //w
		{
			P = 119;  //kod wejścia do odpowiedniej pozycji w ruchu swobodnym
			ruch_swobodny();
			break;
		}

		case 115:   //s
		{
			P = 115;
			ruch_swobodny();			
			break;
		}

		case 100:   //d
		{
			P = 100;
			ruch_swobodny();
			break;
		}

		case 97:    //a
		{
			P = 97;
			ruch_swobodny();
			break;
		}

		default:
			break;
		}
	}

	if (!_kbhit())   //jesli zaden klawisz niewciśnięty
	{
		ruch_swobodny();
	}
}


void ruch_swobodny()
{
	switch (P)
	{
	case 119: //góra
	{
		if (plansza[x - 2][d] == o || plansza[x - 2][d] == czubek)   //dotkniecie ściany lub samego siebie
		{
			koniec();
		}

		x--;

		if (plansza[x - 1][d] == amciu)  //jeśli zje X
		{
			jedzenie();
			plansza[x + t + 1][d] = czubek;  //wydłużanie
			c++;   //licznik punktów
			t++;
		}

		plansza[x - 1][d] = czubek;
		plansza[x + t + 1][d] = NULL;
		break;
	}

	case 115:  //dół
	{
		if (plansza[x][d] == o || plansza[x][d] == czubek)   //dotkniecie ściany lub samego siebie
		{
			koniec();
		}
		x++;

		if (plansza[x - 1][d] == amciu)
		{
			jedzenie();
			plansza[x - t][d] = czubek;
			c++;   //licznik punktów
			t++;
		}

		plansza[x - 1][d] = czubek;
		plansza[x - t - 3][d] = NULL;
		break;
	}

	case 100:  //prawo
	{
		if (plansza[x - 1][d + 1] == o || plansza[x - 1][d + 1] == czubek)   //dotkniecie ściany lub samego siebie
		{
			koniec();
		}

		d++;
		if (plansza[x - 1][d] == amciu)
		{
			jedzenie();
			plansza[x - 1][d - t - 1] = czubek;
			c++;   //licznik punktów
			t++;
		}

		plansza[x - 1][d] = czubek;
		plansza[x - 1][d - t - 2] = NULL;
		break;
	}

	case 97:  //lewo
	{
		if (plansza[x - 1][d - 1] == o || plansza[x - 1][d - 1] == czubek)   //dotkniecie ściany lub samego siebie
		{
			koniec();
		}

		if (plansza[x - 1][d - 1] == amciu)
		{
			jedzenie();
			plansza[x - 1][d + t] = czubek;
			c++;   //licznik punktów
			t++;
		}
	
		plansza[x - 1][d - 1] = czubek;
		plansza[x - 1][d + t + 1] = NULL;
		d--;
		break;
	}
	}
}


void tablica()
{
	for (int i = 0; i < W; i++)						//wypisanie tablicy 'plansza'
	{
		for (int j = 0; j < K; j++)
		{
			cout << plansza[i][j] << " ";
		}
		cout << endl;
	}
}


void koniec()
{
	system("cls");
	cout << "You lost :c \n";
	Sleep(1500);
	exit(0);    //definitywny koniec
}


int main()
{
	cout << "Hello !\nWelcome in SNAKE - The Game!\nUse W(up) S(down) A(left) D(right) to move!\n";
	cout << "Turn off CAPS LOCK\nU can only use one button at a same time\nStart New Game(press D)" << endl;
	while (!_kbhit());  //oczekiwanie na wcisniecie dowolnego klawisza 
	system("cls");     //czyszczenie ekranu
	plansza[4][10] = '+';  //startowe jedzonko


	for (int R = 0; R < 50000; R++)
	{
		ramka();
		ruch();
		tablica();
		cout << endl << "Points: " << c - 1;
		Sleep(1);
		system("cls");
	}
} 
0

podoba mi sie to

#include <iomanip>  // do czego to dałem to nie wiem

watpie zeby ktos sie przez to chcial przedzierac... Ten kod do najwyzszych lotow nie nalezy.

Probowales sprawdzic debuggerem przy skrecie co sie dzieje?

Moje przypuszczenie ze przy skrecie te Twoje -1 +1 zaczynaja nie dzialac bo przesunales tablice...

Nie lepiej trzymac w std::vector pozycje snake'a i go rysowac? pozniej (w zaleznosci jak chcesz to zrobic) usuwasz ostatni dodajesz nowy i rysujesz vector (caly, raczej nie powinno byc problemow z rysowaniem kilku pikseli ;))

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