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