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