Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wypisywanie planszy w konsolowym Snake

Ostatnio zmodyfikowano 2017-05-15 00:35
Autor Wiadomość
FIGUS
Temat założony przez niniejszego użytkownika
Wypisywanie planszy w konsolowym Snake
» 2017-05-14 23:03:35
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 kod
I link do "exe" jak wygląda teraz: program

Dla chcących kod tutaj, to proszę bardzo ;)
C/C++
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <ctime>


class OGON //wsp zebranych punktów
{
public:
    int x = 60;
    int y = 60;
};


int losuj( OGON tabl[], int * x, int * y ) //funkcja losujaca wsp pojawienia sie "X"
{
    * 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; //potrzebny do menu
    char plansza[ 15 ][ 50 ];
    int xx = 25, yy = 7; //wspólrzêdne glowy
    int sx, sy; //OSTATNIE WSP G£OWY
    int px, py; // wsp. wylosowanego punktu
    int punkty = 0; // licznik punktów
    int tryb = 56;
    int ost = 56; // ostatni ustawiony tryb
    OGON tabl[ 100 ];
   
   
    /* TRYBY:
        56 - góra
        50 - dól
        52 - lewo
        54 - prawo
        27 - esc - pauza
        32 - spacja - wyjscie z menu
        */
    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 ) //GLÓWNA PETLA PROGRAMU
    {
       
       
        if( tryb == 27 )
        {
            goto jump;
        }
       
        { //WYLICZANIE WSP PUNKTÓW OGONA
            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:
       
        { //WYPISUJEMY WSP.
            cout << "GLOWA: \n x = " << xx << " y = " << yy << endl;
            /*for( int i = 0; i < 100; i++)
                    {
                        if( tabl[i].x == 60 && tabl[i].y == 60) break;
           
                        cout << "OGON: \n" << i << ". x = " << tabl[i].x << ", y = " << tabl[i].y << endl;
                    }*/
        }
       
        { //RYSUJEMY PLANSZE
            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;
                        }
                       
                    }
                    //OGOON
                   
                    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;
                            }
                        }
                    }
                   
                   
                    //OGOON
                    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;
        } //KONIEC RYSOWANIA
       
       
        { // Szybkosc lazenia snake'a
            if( punkty <= 10 )
                 Sleep( 200 );
            else
                 Sleep( 100 );
           
            if( punkty >= 25 )
                 Sleep( 50 );
           
        }
       
        { //CZYTANIE Z KLAWIATURY
            if( kbhit() == 1 )
            {
                tryb = getch();
            }
        }
       
        //ROBIMY OSTATNIE WSP DLA GLOWY
        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 :/
P-161111
latajacaryba
» 2017-05-14 23:40:53
Mógłbyś podać nr linii w której masz ten mechanizm wypisywania? Troche kodu jest a github nie koloruje mi składni
P-161115
pekfos
» 2017-05-14 23:47:20
Litości, ten kod ma tylko 300 linii. Wstaw go normalnie na forum.
P-161117
FIGUS
Temat założony przez niniejszego użytkownika
» 2017-05-14 23:56:03
Już poprawione :)
P-161118
pekfos
» 2017-05-15 00:13:57
Ta tablica nie ma większego sensu, jeśli nie wyświetlasz jej całej naraz, po ustawieniu wszystkich znaków na takie, jakie mają być.
P-161120
FIGUS
Temat założony przez niniejszego użytkownika
» 2017-05-15 00:35:40
Wow! Dzięki! Teraz poprawiłem, żeby wypisywał oddzielnie tą tablicę i rzeczywiście już wyświetla poprawnie :)
P-161121
« 1 »
  Strona 1 z 1