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

prototyp gry snake w c++ ...

Object Storage Arubacloud
0 głosów
4,467 wizyt
pytanie zadane 5 maja 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Hej ,ostatnio zabrałem się za tworzenie gry snake w konsoli w języku C++ . Na razie jeszcze nie dodałem algorytmu skręcania węża ani jedzenia jabłek ,teraz raczej stworzyłem "prymitywną prowizorkę gry" . Oczywiście nie proszę o ocenę kodu (bo na razie zależy mi tylko żeby działał frown ) ani o pochwalenie się bo niema czym ... ): . Chcę was tylko zapytać czy  w miarę dobrze myślę i czy w ogóle ten kod ma jakiś sens . Wiem że sposób poruszania węża powinienem zmienić ale ruszanie każdą jego częścią z osobna wydaje mi się puki co łatwiejszy ,zresztą zobaczycie wszystko w kodzie . Dziękuje za pomoc i rady ,pozdrawiam .

#include <iostream>
#include <vector>
#include <windows.h>
#include <cstdlib>
#include <conio.h>
#include <time.h>
#define _x 20 //stale mapy
#define _y 60

using namespace std;

class position //pozycja , moglem zrobic strukture ale jakos wolalem klasy :)
{
public:
    int x, y;
};

class game //klasa glowana gry
{
public:

    position sPos;//pozycje
    vector<position>snake_body; //waz
    short map[_x][_y]; //mapa
    char snake_vector='r'; //kierunek ruchu

    void map_render() //tworzenie mapy
    {
        for(int s=0; s<snake_body.size(); s++) //przygotowania to pokazania weza
        {
            for(int i=0; i<_x; i++)
            {
                for(int j=0; j<_y; j++)
                {
                    if((i==snake_body[s].x)&&(j==snake_body[s].y))
                    {
                        map[i][j]=1;
                    }
                }
            }
        }

        for(int i=0; i<_x; i++)
        {
            for(int j=0; j<_y; j++)
            {
                switch(map[i][j])
                {
                case 0:
                {
                    cout.put('.'); //jak 0 to pokaz tlo
                }
                break;
                case 1:
                {
                    cout.put('#'); //jak jeden to pokaz weza
                }
                break;
                }
            }
            cout<<endl;
        }

        for(int i=0; i<_x; i++) //resetowannie mapy na koncu
        {
            for(int j=0; j<_y; j++)
            {
                map[i][j]=0;
            }
        }
    }

    void snake_logic() //poruszanie sie weza ,mysle ze czytelne xD
    {
        if(snake_vector=='u')//w
        {
            for(int i=snake_body.size()-1; i>=0; i--){ //petla by to dotyczylo wszystkich czlonow weza
                if(snake_body[i].x==0){break;}
                else snake_body[i].x--;}
        }
        if(snake_vector=='d')//s
        {
            for(int i=snake_body.size()-1; i>=0; i--){
                if(snake_body[i].x==_x-1){break;}
                else snake_body[i].x++;}
        }
        if(snake_vector=='r')//d
        {
            for(int i=0; i<snake_body.size(); i++){
                if(snake_body[i].y==_y-1){break;}
                else snake_body[i].y++;}
        }
        if(snake_vector=='l')//a
        {
            for(int i=snake_body.size()-1; i>=0; i--){
                if(snake_body[i].y==0){break;}
                else snake_body[i].y--;}
        }

    }

    void snake_control() //tu gracz nadaje kierunki ruchu weza
    {
        char z = getch();

        switch(z)
        {
        case'w':
            snake_vector='u';
            break;//up
        case's':
            snake_vector='d';
            break;//down
        case'd':
            snake_vector='r';
            break;//right
        case'a':
            snake_vector='l';
            break;//left
        }
    }

    void game_begin() //tworzenie weza , prototym zanim dodam jedzenie owocow
    {
        snake_body.push_back(sPos); // (w przyszloscy zapisze to w bardziej czytelny sposob)
        snake_body.push_back(sPos);
        snake_body.push_back(sPos);
        snake_body.push_back(sPos);
        snake_body.push_back(sPos);
        snake_body[0].x=9;
        snake_body[0].y=9;
        snake_body[1].x=9;
        snake_body[1].y=8;
        snake_body[2].x=9;
        snake_body[2].y=7;
        snake_body[3].x=9;
        snake_body[3].y=6;
        snake_body[4].x=9;
        snake_body[4].y=5;

        for(int i=0; i<_x; i++) //poczodkowe wartoscy dla tla
        {
            for(int j=0; j<_y; j++)
            {
                map[i][j]=0;
            }
        }

    }
};

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);
}

class loop
{
public:

    void game_loop() //petla gry
    {
        game g;
        g.game_begin();

        while(true)
        {
            Sleep(10);
            null_map(0,0);
            g.map_render();
            g.snake_logic();

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

    }
};

int main()
{
    loop l; // "odpalamy gre" ...
    l.game_loop();

    return 0;
}

 

1
komentarz 5 maja 2017 przez JAKUBW Nałogowiec (33,470 p.)

Nazwy klas pisz wielką literą - taka zasada. A to:

char snake_vector='r'

Można zastąpić enum'em:

//deklaracja enum'a
enum Direction
{
   left;
   right;
   up;
   down
}

//gdzieś w kodzie
//przypisanie
Direction kierunek = left;

//porównanie
if(kierunek == left)

//obsługuje też switch'a
switch(kierunek){
  case left:
   //w lewo!
   break;
   //itd
}

 

1 odpowiedź

+1 głos
odpowiedź 5 maja 2017 przez Evelek Nałogowiec (28,960 p.)
wybrane 5 maja 2017 przez Jakub 0
 
Najlepsza
char z = getch();

Zamień na:

char z;
cin.get(z);

Tylko wtedy pewnie nie osiągniesz tego efektu, który chcesz... A kbhit() nie jest już standardem C++, więc nie powinieneś tego używać. Nie jest to jakiś komercyjny projekt, więc w sumie nic nie szkodzi, ale na przyszłość warto pamiętać.

komentarz 5 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
dzięki ,to co mogę używać zamiast kbhit ?
1
komentarz 5 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Może i są jakieś sposoby, ale nie bawiłem się tak nigdy konsolowo. Zapewne najlepiej jakbyś się zainteresował bibliotekami typu SFML lub SDL i ich użył do swojego projektu. Tutaj masz link z dokumentacji SFML: https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Keyboard.php
komentarz 5 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
wiem ,oczywiście słyszałem o tych silnikach ale nie wiem czy jestem na nie gotowy jak puki co mam problemy z napisaniem głupiego konsolowego snake :) , jeszcze kiepsko znam programowanie obiektowe co widać , a tych rzeczy łatwiej się uczyć na poziomie konsoli ...
komentarz 5 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
no chyba że w bibliotekach graficznych robi się gry łatwiej :)
1
komentarz 5 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Gra w konsoli jak Twoja jest świetna na początek. Możesz napisać do pewnego stopnia logikę gry teraz, a później dodać grafikę. "Do pewnego stopnia" ponieważ jak sam widzisz, niektóre rzeczy wygodniej i przyjemniej zrobisz np. w SFML.
komentarz 5 maja 2017 przez Jakub 0 Pasjonat (23,120 p.)
miałem właśnie postawiony cel że zanim zacznę tworzyć gry z grafiką to napiszę kilka gierek w konsoli takich jak snake , saper , tic-tac-toe itp... oraz nauczę się programowania obiektowego . Teraz chyba będę pisał kolejny post bo wymyślenie algorytmu skręcania węża to jakaś masakra ):

Podobne pytania

+3 głosów
2 odpowiedzi 280 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez Mikusbombro Użytkownik (990 p.)
+4 głosów
5 odpowiedzi 4,294 wizyt
pytanie zadane 8 marca 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)
+1 głos
2 odpowiedzi 444 wizyt
pytanie zadane 7 czerwca 2017 w Nasze projekty przez MkbewePP Początkujący (330 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 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!

...