Cześć,
wpadłem na pomysł ostatnio żeby sobie napisać konsolowego Snake. Niby prosty program, sama jakby logika to szybko można napisać, ale niestety po drodze wychodzą błędy. No i mi one wyszły niestety przy wypisywaniu.
Jak to piszę to zdaje mi się, że powinna cała plansza z wężem się wypisać poprawnie, a niestety przy wypisywaniu jest nie wiem skąd zbyt wiele spacji, które się pojawiają już przy rysowaniu ogona.
(Plansza to spacje jako tło, "O" jako ogon, "S" jako głowa, "X" jako punkt do zdobycia,
Co jest zrobione?
Plansza (po prostu dwuwymiarowa tablica, wypisywana za każdym obrotem głównej pętli programu),
łażenie snake'iem po niej (sterowanie strzałkami z numpada),
pojawiający się w losowym miejscu punkt do zdobycia,
mechanizm ogona (czyli po prostu tablica obiektów działająca jak jednokierunkowa kolejka, każdy punkt to obiekt klasy OGON i zawierają się w nim współrzędne dla niego w danej chwili)
liczenie punktów,
Pauza gry,
Przyspieszanie węża wraz z większą ilością punktów
Co do zrobienia?
Poprawienie wypisywania planszy, przede wszystkim błąd występuje przy wypisywaniu punktów ogona (jest tam if... else dla przypadku kiedy w planszy dla danej współrzędnej będzie "O" lub(!) " " a mimo to wypisuje oba znaki i plansza się rozszerza i psuje grę :/ )
i o ten właśnie problem daję tu zapytanie, a co do innych rzeczy to niżej wypisałem :D
Koniec gry gdy najedzie się na własny ogon (to akurat jest łatwe tylko nie ma jak sprawdzić poprawności bo ogon nie wypisuje się dobrze :/ )
Muszę poprawić żeby nie dało się cofać głową, ale to też nie jest trudne.
Kilka innych małych poprawek, mogę też zrobić zapisanie stanu gry i potem go wczytywać z poziomu menu
Mechanizm czyszczenia trzeba zmienić z system( "cls" ) na jakiś inny bo miga strasznie.. próbowałem kilka innych sposobów z różnych for, ale większość miała ten plus że zaznaczała określony obszar tylko ten który się zmienia przez co nie migało w konsoli, ale tu zmienia się w zasadzie cały, także jak je zastosowałem to nic się zbytnio nie zmieniło i nadal mrugała plansza, czasem nawet gorzej.
I tak, kod starałem się czytelnie opisać w komentarzach, która zmienna i który fragment do czego służy, dałem też je w nawiasy { } dzięki czemu można sobie schować resztę programu kompilatorze i czytać tylko to co potrzebne.
Link do kodu:
tutaj jest kodI link do "exe" jak wygląda teraz:
programDla chcących kod tutaj, to proszę bardzo ;)
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <ctime>
class OGON
{
public:
int x = 60;
int y = 60;
};
int losuj( OGON tabl[], int * x, int * y )
{
* x = rand() % 49;
* y = rand() % 14;
for( int i = 0; i < 100; i++ )
{
if( tabl[ i ].x != 60 && tabl[ i ].y != 60 )
{
if( tabl[ i ].x == * x && tabl[ i ].y == * y )
* x = rand() % 49;
* y = rand() % 14;
}
else
{
break;
}
}
}
int main()
{
using namespace std;
int klawisz;
char plansza[ 15 ][ 50 ];
int xx = 25, yy = 7;
int sx, sy;
int px, py;
int punkty = 0;
int tryb = 56;
int ost = 56;
OGON tabl[ 100 ];
srand( time( NULL ) );
losuj( tabl, & px, & py );
for( int y = 0; y < 15; y++ )
{
for( int x = 0; x < 50; x++ )
{
plansza[ y ][ x ] = ' ';
}
}
cout << "Witaj w Snake!\n"
"Sterowanie odbywa sie za pomoca strzlek na numpadzie.\n"
"Kliknij Spacje aby rozpoczac!\n"
"ESC to pauza ;)\n"
<< endl;
klawisz = getch();
while( 1 )
{
if( klawisz == 32 )
break;
else
continue;
}
while( 1 )
{
if( tryb == 27 )
{
goto jump;
}
{
if( punkty > 0 )
{
for( int i = punkty; i > 0; i-- )
{
if(( i - 1 ) == 0 )
{
tabl[ i - 1 ].x = sx;
tabl[ i - 1 ].y = sy;
break;
}
else
{
tabl[ i - 1 ].x = tabl[ i - 2 ].x;
tabl[ i - 1 ].y = tabl[ i - 2 ].y;
}
}
}
}
jump:
{
cout << "GLOWA: \n x = " << xx << " y = " << yy << endl;
}
{
if( tryb == 27 )
cout << "Punkty: " << punkty << " PAUZA" << endl;
else
cout << "Punkty: " << punkty << endl;
cout << "|--------------------------------------------------|" << endl << "|";
for( int y = 0; y < 15; y++ )
{
for( int x = 0; x < 50; x++ )
{
if( y == py && x == px )
{
if( y == yy && x == xx )
{
plansza[ y ][ x ] = 'S';
cout << plansza[ y ][ x ];
continue;
}
else
{
plansza[ y ][ x ] = 'X';
cout << plansza[ y ][ x ];
continue;
}
}
for( int i = 0; i < 100; i++ )
{
if( tabl[ i ].x != 60 && tabl[ i ].y != 60 )
{
if( tabl[ i ].x == x && tabl[ i ].y == y )
{
plansza[ y ][ x ] = 'O';
cout << plansza[ y ][ x ];
continue;
}
}
}
if( y == yy && x == xx )
{
plansza[ y ][ x ] = 'S';
cout << plansza[ y ][ x ];
}
else
{
plansza[ y ][ x ] = ' ';
cout << plansza[ y ][ x ];
}
if( x == 49 )
{
cout << "|" << endl << "|";
}
}
}
cout << "--------------------------------------------------|" << endl;
}
{
if( punkty <= 10 )
Sleep( 200 );
else
Sleep( 100 );
if( punkty >= 25 )
Sleep( 50 );
}
{
if( kbhit() == 1 )
{
tryb = getch();
}
}
sx = xx;
sy = yy;
switch( tryb )
{
case 56:
{
if( yy >= 0 )
{
yy -= 1;
ost = 56;
}
else
{
yy = 14;
ost = 56;
}
break;
}
case 50:
{
if( yy <= 14 )
{
yy += 1;
ost = 50;
}
else
{
yy = 0;
ost = 50;
}
break;
}
case 52:
{
if( xx >= 0 )
{
xx -= 1;
ost = 52;
}
else
{
xx = 49;
ost = 49;
}
break;
}
case 54:
{
if( xx <= 49 )
{
xx += 1;
ost = 54;
}
else
{
xx = 0;
ost = 54;
}
break;
}
case 27:
{
break;
}
default:
{
tryb = ost;
}
}
if( xx == px && yy == py )
{
punkty += 1;
losuj( tabl, & px, & py );
}
system( "cls" );
}
}
Błąd musi być gdzieś w linijkach od 139 do 172, tam dzieje się wypisywanie.
Bardzo proszę o pomoc, próbowałem już nawet pisać ten mechanizm do wypisywania od nowa i poprawiać tan ale zawsze było tylko gorzej :/
A sam mechanizm chodzenia węża wypisywałem sobie nawet na kartce krok po kroku (spisywałem współrzędne, pauza, znów spisywałem itd. i wychodziło idealnie, także właśnie w pętach wypisujących ten układ wsp. musi być błąd :/