Kod po naprawieniu błędów i ostrzeżeń wygląda tak:
#include <vector>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
enum side
{
LEFT,
RIGHT,
DOWN,
UP
};
class Windows
{
private:
public:
static void ChangeColor(int x)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, x);
}
static void Gotoxy(int x, int y) {
if (x > 0 && y > 0) {
COORD kursor;
kursor.X = x-1;
kursor.Y = y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), kursor);
}
}
};
class Point
{
private:
int x, y;
public:
Point(int x, int y)
{
this->x = x;
this->y = y;
}
bool IsEqual(Point p)
{
if (this->x == p.x && this->y == p.y)
return true;
else
return false;
}
int GetX()
{
return x;
}
int GetY()
{
return y;
}
void SetX(int x)
{
this->x = x;
}
void SetY(int y)
{
this->y = y;
}
};
class Board
{
public:
static int x, y;
Board(int x, int y)
{
this->x = x;
this->y = y;
}
Board()
{
x = 30;
y = 30;
}
void Draw()
{
Windows::ChangeColor(60);
Windows::Gotoxy(1,1);
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
std::cout << (char)219;
}
std::cout << std::endl;
}
Windows::ChangeColor(11);
}
};
int Board::x;
int Board::y;
class Snake
{
private:
std::vector<Point> Position;
public:
Snake(Point p)
{
Position.push_back(p);
}
void Move(side p)
{
std::vector<Point>::iterator it = Position.begin();
Point P = *it;
if (p == LEFT)
P.SetX(P.GetX() - 1);
if (p == RIGHT)
P.SetX(P.GetX() + 1);
if (p == DOWN)
P.SetY(P.GetY() + 1);
if (p == UP)
P.SetY(P.GetY() - 1);
Position.insert(Position.begin(), P);
Position.pop_back();
}
void Grow(side p)
{
std::vector<Point>::iterator it = Position.begin();
Point P = *it;
if (p == LEFT)
P.SetX(P.GetX() - 1);
if (p == RIGHT)
P.SetX(P.GetX() + 1);
if (p == DOWN)
P.SetY(P.GetY() + 1);
if (p == UP)
P.SetY(P.GetY() - 1);
Position.insert(Position.begin(), P);
}
Point GivePositionHead()
{
std::vector<Point>::iterator it = Position.begin();
return *it;
}
void Draw()
{
Windows::ChangeColor(35);
for (size_t i = 0; i <= Position.size() - 1; i++)
{
Windows::Gotoxy(Position[i].GetX(), Position[i].GetY());
std::cout << (char)219;
}
}
bool IsTouch()
{
if (Position[0].GetX() > Board::x || Position[0].GetX() <= 0 || Position[0].GetY() > Board::y || Position[0].GetY() <= 0)
{
return true;
}
for (size_t i = 1; i < Position.size(); i++)
{
if (Position[0].GetX() == Position[i].GetX() || Position[0].GetY() == Position[i].GetY())
return true;
}
return false;
}
};
bool IsRunning = true;
int main()
{
while (IsRunning)
{
Board b(15, 15);
Snake s(Point(7, 6));
s.Grow(LEFT);
s.Grow(UP);
s.Grow(RIGHT);
b.Draw();
s.Draw();
Sleep(1000);
}
return 0;
}
Chodziło w błędach o to że m.in:
1.Klasa Board była pod klasą Snake.
2. Trzeba było zadeklarować zmienną x,y klasy Board na zewnątrz tej klasy jeśli chcesz wykorzystać static.
Za to przy ostrzeżeniach zapoznaj się z typami unsigned i powinno Ci się wyjaśnić.
Sam kod jest napisany z wykorzystaniem bardzo złych praktyk, które powinny zostać zniwelowane jednak nie chce mi się bawić w pisanie tego kodu, aby Ci wszystko wyjaśnić. Dlatego podam Ci pięć przykładów:
1.Po co for(int i = 0; i <= Position.size() - 1; i++) skoro for(int i = 0; i <Position.size() ; i++) działa tak samo
for (int i = 0; i <= Position.size() - 1; i++)
{
Windows::Gotoxy(Position[i].GetX(), Position[i].GetY());
std::cout << (char)219;
}
2.Pętle powinno dać się przerwać a tu pętla będzie wykonywana cały czas
bool IsRunning = true;
while (IsRunning)
{
Board b(15, 15);
Snake s(Point(7, 6));
s.Grow(LEFT);
s.Grow(UP);
s.Grow(RIGHT);
b.Draw();
s.Draw();
Sleep(1000);
}
3.Nie powinno się deklarować zmiennych globalnych.
bool IsRunning = true;
4.Tak nie powinno się "usypiać" programu poczytaj o wątkach
Sleep(1000);
PS. exit(0); to również bardzo zła praktyka( wiem, że go nie użyłeś, ale wolę wspomnieć )
5.Dla czystości kodu powinieneś rozpisać go w osobnych plikach .h lub .hpp i .cpp bo tu jest istny misz-masz. Uwierz mi, że gdybyś chciał wrócić do tego kodu po jakimś czasie to byś się złapał za głowę i mówił, że nie jest czytelny, więc lepiej na przyszłość wyrobić sobie nawyk czystości kodu, bo przy większym projekcie niż ten może być naprawdę słabo.
Mam nadzieje, że to pomoże, ale musisz jeszcze popracować nad niektórymi sprawami. Uwierz mi to ułatwi Ci życie. Powodzenia w dalszej pracy i trzymaj się