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

Problem z poruszaniem sie weza.

Ostatnio zmodyfikowano 2013-11-03 16:33
Autor Wiadomość
słowik89
Temat założony przez niniejszego użytkownika
Problem z poruszaniem sie weza.
» 2013-11-03 15:16:16
Witam!

Jestem początkującym programistą i wziąłem się za pisanie popularnej gry Snake.
Niestety z racji mojej małej wiedzy nie jestem w stanie poradzić sobie z jednym problemem.
Otóż jeden z elementów węża nie porusza się tak jak powinien a w zasadzie to stoi w miejscu
i nie wiem jak temu zaradzić.
Z góry dziękuje za pomoc.
Wklejam kod mojego pseudo snake'a któremu jeszcze sporo brakuje do dokończenia:

C/C++
#include <iostream>
#include <cstdlib>
#include <vector>
#include <conio.h>
#include <windows.h>
using namespace std;
int const mapx = 21;
int const mapy = 21;

struct pozycja
{
    int x, y;
};

class Gra
{
    int mapa[ mapx ][ mapy ];
    pozycja gracz;
    pozycja punkt;
    vector < pozycja > ogon;
public:
    Gra()
    {
        for( int i = 0; i < mapx; i++ )
        {
            for( int j = 0; j < mapy; j++ )
            {
                if( i > 0 && j > 0 && i < mapx - 1 && j < mapy - 1 )
                     mapa[ i ][ j ] = 1;
                else
                     mapa[ i ][ j ] = 0;
               
            }
        }
        gracz.x = 10;
        gracz.y = 10;
        punkt.x =( rand() % 19 ) + 1;
        punkt.y =( rand() % 19 ) + 1;
        pozycja start_ogon = { 11, 10 };
        ogon.push_back( start_ogon );
        pozycja start_ogon1 = { 12, 10 };
        ogon.push_back( start_ogon1 );
        pozycja start_ogon2 = { 13, 10 };
        ogon.push_back( start_ogon2 );
        pozycja start_ogon3 = { 14, 10 };
        ogon.push_back( start_ogon3 );
    }
   
    int score( int & a )
    {
        int b;
        if( punkt.x == gracz.x && punkt.y == gracz.y )
        {
            a = a + 1;
            while( punkt.x == gracz.x && punkt.y == gracz.y )
            {
                punkt.x =( rand() % 19 ) + 1;
                punkt.y =( rand() % 19 ) + 1;
            }
        }
        cout << "Zdobyte Punkty: " << endl << a << endl;
        return a;
    }
   
    void reset()
    {
        for( int i = 0; i < mapx; i++ )
        {
            for( int j = 0; j < mapy; j++ )
            {
                if( i > 0 && j > 0 && i < mapx - 1 && j < mapy - 1 )
                     mapa[ i ][ j ] = 1;
                else
                     mapa[ i ][ j ] = 0;
               
            }
        }
    }
   
    void rysuj()
    {
        for( int i = 0; i < mapx; i++ )
        {
            for( int j = 0; j < mapy; j++ )
            {
                switch( mapa[ i ][ j ] )
                {
                case 0:
                    cout << "x";
                    break;
                case 1:
                    cout << " ";
                    break;
                case 2:
                    cout << "G";
                    break;
                case 3:
                    cout << "*";
                    break;
                case 4:
                    cout << "o";
                    break;
                }
            }
            cout << endl;
        }
    }
   
    void move_ogon()
    {
        for( int i = ogon.size(); i > 0; i-- )
        {
            if( i == 1 )
                 ogon[ i ].x = gracz.x;
            else
                 ogon[ i ].x = ogon[ i - 1 ].x;
           
        }
       
        for( int j = ogon.size(); j > 0; j-- )
        {
            if( j == 1 )
                 ogon[ j ].y = gracz.y;
            else
                 ogon[ j ].y = ogon[ j - 1 ].y;
           
        }
    }
   
    void move_player( int a )
    {
        switch( a )
        {
        case 'w':
            if( gracz.x - 1 < 1 )
                 break;
            else
                 gracz.x--;
           
            break;
        case 's':
            if( gracz.x + 1 == mapx - 1 )
                 break;
            else
                 gracz.x++;
           
            break;
        case 'a':
            if( gracz.y - 1 < 1 )
                 break;
            else
                 gracz.y--;
           
            break;
        case 'd':
            if( gracz.y + 1 == mapy - 1 )
                 break;
            else
                 gracz.y++;
           
            break;
        }
    }
   
    void wstaw_gracza( pozycja & gracz )
    {
        mapa[ gracz.x ][ gracz.y ] = 2;
    }
   
    pozycja & zwroc_gracza()
    {
        return gracz;
    }
   
    void put_punkt( pozycja & punkt )
    {
        mapa[ punkt.x ][ punkt.y ] = 3;
    }
   
    pozycja & return_punkt()
    {
        return punkt;
    }
   
    void wstaw_ogon( vector < pozycja >& ogon )
    {
        for( int i = 0; i < ogon.size(); i++ )
             mapa[ ogon[ i ].x ][ ogon[ i ].y ] = 4;
       
    }
   
    vector < pozycja >& zwroc_ogon()
    {
        return ogon;
    }
   
};



int main()
{
    system( "title S N A K E" );
    Gra g;
    int wynik = 0;
    char kierunek = 'w';
    bool repeat = true;
    while( repeat )
    {
        g.score( wynik );
        g.reset();
        g.wstaw_gracza( g.zwroc_gracza() );
        g.wstaw_ogon( g.zwroc_ogon() );
        g.put_punkt( g.return_punkt() );
        g.rysuj();
        if( kbhit() )
        {
            kierunek = getch();
            switch( kierunek )
            {
            case 27:
                repeat = false;
                break;
            }
        }
        g.move_ogon();
        g.move_player( kierunek );
        Sleep( 1000 );
        system( "cls" );
    }
    cout << "Twoj wynik to: " << wynik << endl << "K O N I E C   G R Y";
    return 0;
}
[/i]
P-95160
pekfos
» 2013-11-03 15:37:44
W move_ogon pomijasz element o indeksie 0.
P-95163
słowik89
Temat założony przez niniejszego użytkownika
» 2013-11-03 16:33:24
Hehe takie małe niedopatrzenie.
Dzięki wielkie za pomoc teraz śmiga jak trzeba nic tylko kolizje i powiększanie dodać :)
P-95170
« 1 »
  Strona 1 z 1