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

[C++] Problem przy tworzeniu mapy w grze Snake

Ostatnio zmodyfikowano 2013-05-24 15:42
Autor Wiadomość
XardassLord
Temat założony przez niniejszego użytkownika
» 2013-05-23 23:23:17
Dzięki bardzo za podpowiedź :) Przerobiłem funkcję ruch, niby trochę na około ale nie ogarniam jeszcze optymalizacji ;d No ale najważniejsze, że działa :) Teraz chciałbym, aby wąż po każdym zjedzeniu jabłka rósł o jedno pole. Myślałem, żeby robić to na liście bądź na wektorach, ale nigdy jeszcze nie przerabiałem tych elementów, więc nie wiem czy się połapię. Wiem tylko że można tam łatwo dodawać element na początek i usuwać element z ostatniego miejsca, ale co i jak to już nie wiem.

Macie jakieś porady dla mnie czy to byłoby dobre rozwiązanie? Czy może jest jeszcze jakieś inne, łatwiejsze?

Poniżej przesyłam ponownie cały kod (zmianie uległa przede wszystkim funkcja ruch() )

C/C++
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>
#include <Windows.h>


using namespace std;


void zeruj_mape( char mapa[ 20 ][ 60 ] );
void rysuj_mape( char mapa[ 20 ][ 60 ] );
void wstaw_weza( char mapa[ 20 ][ 60 ], int & x, int & y );
void ruch( char mapa[ 20 ][ 60 ], int & x, int & y, char & ruch );
bool koniec( char mapa[ 20 ][ 60 ], int & x, int & y );
void losuj_jablko( char mapa[ 20 ][ 60 ], int & x, int & y, int & jx, int & jy, int & pkt );



int main()
{
    srand( time( NULL ) );
   
    char mapa[ 20 ][ 60 ];
    int x = 30; // współrzędna na osi X, czyli [j]. Przypisane są tylko początkowe wartości
    int y = 10; // współrzędna na osi Y, czyli [i]
    int jx = rand() % 59; // współrzędne pierwszego jabłka
    int jy = rand() % 19; // ------------||---------------
    int punkty = 0;
    char kierunek = 'w';
   
   
   
   
    do
    {
        system( "cls" );
        zeruj_mape( mapa );
        wstaw_weza( mapa, x, y );
        losuj_jablko( mapa, x, y, jx, jy, punkty );
        rysuj_mape( mapa );
        ruch( mapa, x, y, kierunek );
        koniec( mapa, x, y );
       
    } while( !koniec( mapa, x, y ) );
   
    cout << "\n\n KONIEC GRY!";
    cout << "\n\n Twoj wynik to: " << punkty;
   
   
   
   
    getch();
    return 0;
}






//////////////////// FUNKCJA ZERUJĄCA MAPĘ DO GRY ////////////////////
void zeruj_mape( char mapa[ 20 ][ 60 ] )
{
    for( int i = 0; i < 20; i++ )
    for( int j = 0; j < 60; j++ )
         mapa[ i ][ j ] = 0;
   
}







//////////////////// FUNKCJA RYSUJĄCA MAPĘ DO GRY ////////////////////
void rysuj_mape( char mapa[ 20 ][ 60 ] )
{
    cout << " ------------------------------------------------------------" << endl;
   
    for( int i = 0; i < 20; i++ )
    {
        cout << "|"; // ramka od lewej strony
       
        for( int j = 0; j < 60; j++ )
        {
            if( mapa[ i ][ j ] == 0 )
                 mapa[ i ][ j ] = 32;
           
            cout << mapa[ i ][ j ];
        }
        cout << "|"; // ramka od prawej strony
        cout << endl;
    }
   
    cout << " ------------------------------------------------------------" << endl;
}







//////////////////// FUNKCJA USTAWIAJĄCA WĘŻA NA MAPIE ////////////////////
void wstaw_weza( char mapa[ 20 ][ 60 ], int & x, int & y )
{
    mapa[ y ][ x ] = 'O'; // wstawienie węża do gry
}








//////////////////// FUNKCJA PORUSZAJĄCA WĘŻA PO MAPIE ////////////////////
void ruch( char mapa[ 20 ][ 60 ], int & x, int & y, char & ruch )
{
   
   
    if( kbhit() )
    {
        Sleep( 100 );
        ruch = getch();
       
        if( ruch == 'w' )
             y--;
       
       
        if( ruch == 's' )
             y++;
       
       
        if( ruch == 'a' )
             x--;
       
       
        if( ruch == 'd' )
             x++;
       
    }
   
    else
    {
        Sleep( 100 );
        if( ruch == 'w' )
             y--;
       
       
        if( ruch == 's' )
             y++;
       
       
        if( ruch == 'a' )
             x--;
       
       
        if( ruch == 'd' )
             x++;
       
    }
   
   
   
}





//////////////////// FUNKCJA SPRAWDZAJĄCA CZY WĄŻ UDERZYŁ W ŚCIANĘ ////////////////////
bool koniec( char mapa[ 20 ][ 60 ], int & x, int & y )
{
    bool test = false;
   
    if( x < 0 || x > 59 )
    {
        test = true;
        system( "cls" );
        return test;
    }
   
    if( y < 0 || y > 19 )
    {
        test = true;
        system( "cls" );
        return test;
    }
   
    return test;
   
}







//////////////////// FUNKCJA LOSUJĄCA JABŁKO NA MAPIE ////////////////////
void losuj_jablko( char mapa[ 20 ][ 60 ], int & x, int & y, int & jx, int & jy, int & pkt )
{
    if( x == jx && y == jy )
    {
        jx = rand() % 59;
        jy = rand() % 19;
        pkt++;
    }
   
    mapa[ jy ][ jx ] = '*';
}


EDIT:

Dodałem też pętlę w funkcji losuj_jabłko, która nie pozwala na wylosowanie jabłka w miejscu, w którym znajduje się aktualnie wąż :)

C/C++
//////////////////// FUNKCJA LOSUJĄCA JABŁKO NA MAPIE ////////////////////
void losuj_jablko( char mapa[ 20 ][ 60 ], int & x, int & y, int & jx, int & jy, int & pkt )
{
    if( x == jx && y == jy )
    {
        do
        {
            jx = rand() % 59;
            jy = rand() % 19;
           
        } while( jx == x && jy == y );
       
        pkt++;
    }
   
    mapa[ jy ][ jx ] = '*';
}
P-83754
pekfos
» 2013-05-24 15:42:50
Mapa ma ograniczone rozmiary, więc wąż też. Do zrobienia tego wystarczy tablica (i jedna zmienna):
Pierwszy element będzie głową, a kolejne n elementów to ogon. Przy poruszaniu, kopiuj elementy o jeden indeks dalej (element m skopiuj w miejsce elementu m+1), a głowie nadaj nowe współrzędne. Jeśli w nowym miejscu głowy będzie jedzenie, zwiększ wartość zmiennej z rozmiarem węża.
Jako elementu tablicy użyj struktury ze współrzędnymi kawałka węża. Jeżeli jeszcze nie znasz struktur, równie dobrze możesz użyć dwóch tablic intów: jednej dla współrzędnej X, a drugiej dla Y.
P-83778
1 « 2 »
Poprzednia strona Strona 2 z 2