• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed skręcanie węża w grze snake

VPS Starter Arubacloud
0 głosów
578 wizyt
pytanie zadane 5 maja 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 7 maja 2017 przez Jakub 0

witam , wcześniej zadałem też pytanie dotyczące tej "gry" i tu jest link : https://forum.pasja-informatyki.pl/250781/prototyp-gry-snake-w-c#c250794 -Tam znajduje się kod gry

Teraz mam problem z napisaniem jakiś instrukcji odpowiadających za skręcanie węża ,najpierw próbowałem napisać że kiedy każda część węza porusza się osobno . usłyszałem o pomyśle żeby po prostu ostatni element ciała wężyka (tablicy) przenosić przed pierwszy czyli:

- 3x ###

- usuwamy element z końca (przenosimy) ##

- Gotowe ,postawione przed pierwszym ###  ... itd

pomysł wydaje się prosty i logiczny ale mieszają się w ten sposób elementy tablicy :

123 //tablice w których znajdują się współrzędne ciała węża

   231

     312

       123 //mam nadzieje że wiecie o co chodzi  :)

przez to przy skręcani węża w nieodpowiednim momencie mogło by dojść do jego rozejścia

Czy wy znacie jakiś algorytm na poruszania się i skręcanie węża , będę wdzięczny za pomoc ... jak jest żle wytłumaczone co mam na myśli to mówcie ,pozdrawiam wink

 

 

 

komentarz zamknięcia: sam rozwiązałem problem

1 odpowiedź

+1 głos
odpowiedź 5 maja 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 5 maja 2017 przez Jakub 0
 
Najlepsza

Generalnie robisz to tak, że masz wektor i usuwasz ostatni i dodajesz na początku.
[4][3][2][1][0]     Masz taki wektor z podanymi indeksami.

Dodajesz na początku jeden element
[5][4][3][2][1][0]    Na zielono zaznaczyłem nowy element
Ten nowy element może być tworzony tak.
 

SnakePart newSnakePart;
newSnakePart.setPosition( snake[0].getPosition() + movingDirection );
snake.insert(snake.begin(), newSnakePart);

Potem, jeżeli gracz nie zjadł owocu, to usuwasz ostatni element
[5][4][3][2][1][0]    Na czerwono zaznaczyłem element który musisz usunąć. (Jeżeli zjadł, to nie usuwasz - wąż będzie dłuższy).
Kod usuwający ostatni element:
 

snake.pop_back();



 

komentarz 5 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki , nie wpadł bym że o to chodzi
komentarz 6 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)

wiem że już zakończyłem temat ale zrobiłem tak jak napisałeś i nic nie jest tak jak miało być ): (chociaż program kompiluje się poprawnie)  . przypuszczam że zrobiłem błąd przy poruszaniu się węża lub generowaniu mapy . Na razie nie dodałem jeszcze schematu jedzenia owoców ani zabezpieczenia wyjścia poza mapę , dzięki za twoją pomoc   :) .

kod poruszania się węża :

void snake_vector()
    {
        if(snake_direction==left) //algorytm o ktorym wspomniales ,tu moze byc blad
        {
            position pos;
            pos.y = snake_body[0].y-1;
            pos.x = snake_body[0].x;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }
        if(snake_direction==right)
        {
            position pos;
            pos.y = snake_body[0].y+1;
            pos.x = snake_body[0].x;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }
        if(snake_direction==up)
        {
            position pos;
            pos.y = snake_body[0].y;
            pos.x = snake_body[0].x-1;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }
        if(snake_direction==down)
        {
            position pos;
            pos.y = snake_body[0].y;
            pos.x = snake_body[0].x+1;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }

    }

cały kod :

 

#include <iostream>
#include <vector>
#include <windows.h>
#include <cstdlib>
#include <conio.h>
#include <time.h>

using namespace std;

const short mapX = 20;
const short mapY = 60;

struct position
{
    int x, y;
};

//////////////////////////////////////////////////////////////////

class GameProgress
{
public:

    vector<position>snake_body; //vector weza
    position sPos; //pozycje obiektow
    short map[mapX][mapY]; //mapa

    enum direction //kierunik
    {
        left,
        right,
        up,
        down
    };

    direction snake_direction = left;

    void snake_control() //kontrola nad wezem
    {
        char z = getch();

        switch(z)
        {
            case 'a': snake_direction = left; break;
            case 'd': snake_direction = right; break;
            case 'w': snake_direction = up; break;
            case 's': snake_direction = down; break;
        }
    }

    void snake_vector()
    {
        if(snake_direction==left) //algorytm o ktorym wspomniales ,tu moze byc blad
        {
            position pos;
            pos.y = snake_body[0].y-1;
            pos.x = snake_body[0].x;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }
        if(snake_direction==right)
        {
            position pos;
            pos.y = snake_body[0].y+1;
            pos.x = snake_body[0].x;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }
        if(snake_direction==up)
        {
            position pos;
            pos.y = snake_body[0].y;
            pos.x = snake_body[0].x-1;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }
        if(snake_direction==down)
        {
            position pos;
            pos.y = snake_body[0].y;
            pos.x = snake_body[0].x+1;
            snake_body.insert(snake_body.begin(),pos);
            snake_body.pop_back();
        }

    }

    void game_begin()
    {
        snake_body.push_back(sPos); //na start waz jest troche dloszy
        snake_body.push_back(sPos);
        snake_body.push_back(sPos);
        snake_body[0].x=10;
        snake_body[0].y=30;
        snake_body[0].x=10;
        snake_body[0].y=31;
        snake_body[0].x=10;
        snake_body[0].y=32;

        for(int i=0; i<mapX; i++)
        {
            for(int j=0; j<mapY; j++)
            {
                map[i][j]=0;
            }
        }
    }
};

////////////////////////////////////////////////////////////////

class GameMap
{
public:

    GameProgress obj;

    void render_map()
    {
        for(int s=0; s<obj.snake_body.size(); s++) //render mapy
        {
            for(int i=0; i<mapX; i++)
            {
                for(int j=0; j<mapY; j++)
                {
                    if((i==obj.snake_body[s].x)&&(j==obj.snake_body[s].y))
                    {
                        obj.map[i][j]=1;
                    }
                }
            }
        }

        for(int i=0; i<mapX; i++) //byc moze tu jest blad s
        {
            for(int j=0; j<mapY; j++)
            {
                switch(obj.map[i][j])
                {
                    case 0: cout.put('.'); break;
                    case 1: cout.put('#'); break;
                }
            }
            cout<<endl;
        }

        for(int i=0; i<mapX; i++)
        {
            for(int j=0; j<mapY; j++)
            {
                obj.map[i][j]=0;
            }
        }
    }
};

///////////////////////////////////////////////////////

class GameLoop
{
public:

    void null_map(int x, int y) //czyszczenie ekranu
    {
        HANDLE hCon;
        COORD dwPos;

        dwPos.X = x;
        dwPos.Y = y;

        hCon = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hCon,dwPos);
    }

    void loop()
    {
        GameProgress gp;
        GameMap gm;

        gp.game_begin();

        while(true)
        {
            null_map(0,0); //czyszczenie
            Sleep(100); //uspienie
            gp.snake_vector(); //poruszanie sie weza
            gm.render_map(); //render mapy

            if(kbhit()==true) //jezeli kliknieto klawisz
            {
                gp.snake_control();//to pobierz argument od gracza
            }
        }
    }
};

/////////////////////////////////////////////////////////////

int main()
{
    GameLoop begin_game;
    begin_game.loop();

    return 0;
}

jeszcze raz wielkie dzięki

1
komentarz 6 maja 2017 przez Knayder Nałogowiec (37,640 p.)
No ale co się dzieje w samej grze?
komentarz 7 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
edycja 7 maja 2017 przez Jakub 0
Właśnie że nic , pojawia się pusta migająca mapa , wszystkie informację dałem w nowym pytaniu : https://forum.pasja-informatyki.pl/251069/gra-snake-w-konsoli-nie-dziala#c251201

Nie wiem czy tak można ale bardzo mi zależało żeby poznać odpowiedź
komentarz 7 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
jakimś cudem sam rozwiązałem problem :) dotyczył on generowania mapy ,dzięki za pomoc i podanie algorytmu

pozdrawiam

Podobne pytania

0 głosów
0 odpowiedzi 174 wizyt
0 głosów
3 odpowiedzi 648 wizyt
pytanie zadane 27 kwietnia 2017 w C i C++ przez Antero00 Gaduła (3,670 p.)
0 głosów
0 odpowiedzi 103 wizyt
pytanie zadane 21 listopada 2019 w C i C++ przez Wiktor Michalski Początkujący (430 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...