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

question-closed gra snake w konsoli ,nie działa

Object Storage Arubacloud
0 głosów
657 wizyt
pytanie zadane 6 maja 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 7 maja 2017 przez Jakub 0

hej, "napisałem" grę snake  i nic nie jest tak jak miało być indecision (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ę, zabezpieczenia przed cofaniem itp... . Ostatnio dodaje dość sporo postów ne temat tej gry ale uparłem się że muszę ją napisać a z racji że jestem kiepskim programistą (mimo tego że lubię to robić) to ciągle napotykam jakieś problemy ,na dole podałem fragment kodu w którym najprawdopodobniej popełniłem błąd , oraz cały kod gry . Dam też linki do wcześniejszych moich zapytań ,dziękuje za pomoc i cierpliwość , pozdrawiam

https://forum.pasja-informatyki.pl/250781/prototyp-gry-snake-w-c#c250813 oraz https://forum.pasja-informatyki.pl/250831/skrecanie-weza-w-grze-snake#a250851

kod poruszania się wężyka  :

void snake_vector()
    {
        if(snake_direction==left) 
        {
            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) 
        {
            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;
}

Jak czegoś nie rozumiecie to piszcie ...

komentarz zamknięcia: pytanie nie wiem czemu było źle oceniane ...
komentarz 6 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
gdy odpalimy program to na chwilę pojawiają się segmenty węża w nieodpowiednich miejscach i znikają ,tło mapy generuje się ok
1
komentarz 6 maja 2017 przez Munvik Dyskutant (9,350 p.)
No bo zobacz, czyścisz mapę i jest pusto na mapie przez 0,1s.

Pojawiają sie na dosłownie milisekunde aż pętla znowu trafi na null_map(0,0).

To jak już to czyszczenie powinno być po zbieraniu klawisza i renderze, albo nawet ostatnią funkcją w tej pętli. Chociaż sleep to i tak słaba opcja, powinien być jakiś timer.

I nawet gdy klikniesz klawisz, może dojśc do momentu, że twój program tego nie wychwyci, bo "sleep". Sam kiedyś tak pisałem i wiem co mówie.
komentarz 6 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
edycja 6 maja 2017 przez Jakub 0

zmieniłem ale to nic nie daje , chyba problem jest w czymś innym ): ,ale dzięki za komentarz . No chyba że ja coś źle robię  :

 

void loop()
    {
        GameProgress gp;
        GameMap gm;

        gp.game_begin();

        while(true)
        {
            gp.snake_vector();
            gm.render_map();

            if(kbhit()==true)
            {
                gp.snake_control();
            }

            Sleep(50);
            null_map(0,0);
        }
    }

 

tak wygląda program w pierwszych milisekundach

1
komentarz 6 maja 2017 przez Munvik Dyskutant (9,350 p.)
Czy pozycje segmentów węża są losowe, czy za każdym razem w tym samym miejscu są na początek ?
komentarz 6 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
edycja 6 maja 2017 przez Jakub 0

Właśnie że nie są losowe ,za każdym razem jest to samo szaleństwo frown , jak widać zresztą na screenie źle generuje się też sama mapa bo ma być prostokątna . za generowanie początkowego wyglądu węża odpowiada funkcja game_begin(); a za generator mapy render_map(); wydaje mi się że błąd jest tu oraz w schemacie poruszania się węża

klasa mapy :

class GameMap
{
public:
 
    GameProgress obj;
 
    void render_map()
    {
        for(int s=0; s<obj.snake_body.size(); s++) //sprawdzanie ktore kordynaty mapy sa rowne kordynatom weza 
        {
            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 
        {
            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++)//reset mapy 
        {
            for(int j=0; j<mapY; j++)
            {
                obj.map[i][j]=0;
            }
        }
    }
};

początek gry i pozycje węża :

 void game_begin()
    {
        snake_body.push_back(sPos); //na start waz jest troche dloszy (prowizorka)
        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++) //nadawanie poczatkowych wartoscy mapie (0 oznacza tlo a 1 weza )
        {
            for(int j=0; j<mapY; j++)
            {
                map[i][j]=0;
            }
        }
    }

ruch gada :) :

void snake_vector()
    {
        if(snake_direction==left) 
        {
            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();
        }
 
    }

Mam nadzieję że nie okaże się że cały kod jest do niczego ):

 

 

1
komentarz 6 maja 2017 przez Munvik Dyskutant (9,350 p.)

Widzę jeden błąd, konkretnie:

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;

ustawiasz 3 razy pozycje tego samego elementu vectora, chyba miałeś inny zamiar :]

komentarz 7 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
faktycznie... ,ale to nic nie daje . Dalej jest tak samo
komentarz 7 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
ok ,rozwiązałem już sam problem

Podobne pytania

0 głosów
1 odpowiedź 186 wizyt
pytanie zadane 24 stycznia 2018 w C i C++ przez Dziobi Początkujący (490 p.)
–1 głos
0 odpowiedzi 211 wizyt
pytanie zadane 1 czerwca 2018 w C i C++ przez MrRed Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 177 wizyt

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...