Witam,
Po uruchomieniu kodu i wejściu w grę, a następnie przegranie (tzn. cofnięcie się wężem do tyłu) wraca do menu gry. Po odpaleniu kodu drugi raz wyskakuje znowu napis "przegrałeś" jakby pętla była cały czas aktywna i wraca do menu. Prosiłbym o pomoc :)
#include <iostream>
#include <conio.h>
#include <string>
#include <windows.h>
using namespace std;
class GraSnake
{
private:
enum Kierunek //wyliczenia (stale calkowite) 4 kolejnych kierunkow poruszania sie weza
{
STOP = 0,
LEWO,
PRAWO,
GORA,
DOL
};
Kierunek Polozenie;
int DlugWeza;
bool Przegrana;
bool WydrWeza;
const int Dlugosc;
const int Wysokosc;
int WazX, WazY, OwocX, OwocY;
int PolWezX[100], PolWezY[100];
static void MENU(); //funkcja powiazana z klasa, ale nie konkretny obiekt tej klasy
static void PRZEGRANA();
void kla();
void UstawWeza();
void Plansza();
void ZasaPlanszy();
void StartGry();
public:
GraSnake();
void MenuGry();
};
GraSnake::GraSnake() :Wysokosc(22), Dlugosc(52)
{
DlugWeza = 0;
Przegrana = false;
WydrWeza = false;
WazX = 0;
WazY = 0;
OwocX = 0;
OwocY = 0;
for (int i = 0; i < 100; i++) {
PolWezX[i] = 0;
PolWezY[i] = 0;
}
}
void GraSnake::MENU()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
printf(" O O \n"); Sleep(50);
printf(" dO Ob \n"); Sleep(50);
printf(" dOO OOO \n"); Sleep(50);
printf(" dOOO OOOb \n"); Sleep(50);
printf(" dOOOO OOOOb \n"); Sleep(50);
printf(" OOOOO OOOOO \n"); Sleep(50);
printf(" OOOOO OOOOO \n"); Sleep(50);
printf(" OOOOO OOOOO \n"); Sleep(50);
printf(" YOOOO OOOOO \n"); Sleep(50);
printf(" YOOO OOOP ****** GRA SNAKE ****** \n"); Sleep(50);
printf(" oOOOOOOOOOOOOb 1. GRA \n"); Sleep(50);
printf(" oOOOOOOOOOOOOOOOb 2. WYJSCIE \n"); Sleep(50);
printf(" oOOOb dOOOOOOOOOOO \n"); Sleep(50);
printf("OOOOOOOOOOOOOOOOOOO \n"); Sleep(50);
printf("OOOOOOOOOOOOOOOOOOP \n"); Sleep(50);
printf("OOOOOOOOOOOOOOOOOP \n"); Sleep(50);
printf(" YOOOOOOOOOOOOOOP \n"); Sleep(50);
printf(" YOOOOOOOOOOOP \n"); Sleep(50);
printf(" %%%%%%%%%%%%%% \n"); Sleep(50);
printf(" %%%%%%OOOjgsOOO \n"); Sleep(50);
printf("!___/_______\___! \n"); Sleep(50);
}
void GraSnake::PRZEGRANA()
{
printf("Przegrales. \n"); Sleep(1000);
}
void GraSnake::kla()
{
if (_kbhit())
{
switch (_getch())
{
case 'a':
case 'A':
Polozenie = LEWO;
break;
case 'd':
case 'D':
Polozenie = PRAWO;
break;
case 'w':
case 'W':
Polozenie = GORA;
break;
case 's':
case 'S':
Polozenie = DOL;
break;
default:
break;
}
}
}
void GraSnake::UstawWeza()
{
Przegrana = false;
Polozenie = STOP;
WazX = Dlugosc / 2;
WazY = Wysokosc / 2;
OwocX = rand() % Dlugosc;
OwocY = rand() % Wysokosc;
}
void GraSnake::Plansza()
{
cout << flush;
system("cls");
for (int i = 0; i < Dlugosc + 2; i++)
{
printf("-");
}
cout << "\n";
for (int i = 0; i < Wysokosc; i++)
{
for (int j = 0; j < Dlugosc; j++)
{
if (j == 0)
{
printf("|");
}
if (i == WazY && j == WazX)
{
cout << "O";
}
else if (i == OwocY && j == OwocX)
{
cout << "@";
}
else
{
WydrWeza = false;
for (int k = 0; k < DlugWeza; k++)
{
if (PolWezX[k] == j && PolWezY[k] == i)
{
cout << "o";
WydrWeza = true;
}
}
if (!WydrWeza)
{
printf(" ");
}
}
if (j == Dlugosc - 1)
{
printf("|");
}
}
cout << "\n";
}
for (int i = 0; i < Dlugosc + 2; i++)
{
printf("-");
}
}
void GraSnake::ZasaPlanszy()
{
int poprzX = PolWezX[0];
int poprzY = PolWezY[0];
int poprzXX, poprzYY;
PolWezX[0] = WazX;
PolWezY[0] = WazY;
for (int i = 1; i < DlugWeza; i++)
{
poprzXX = PolWezX[i];
poprzYY = PolWezY[i];
PolWezX[i] = poprzX;
PolWezY[i] = poprzY;
poprzX = poprzXX;
poprzY = poprzYY;
}
switch (Polozenie)
{
case 1:
WazX--;
break;
case 2:
WazX++;
break;
case 3:
WazY--;
break;
case 4:
WazY++;
break;
default:
break;
}
if (WazX >= Dlugosc)
{
WazX = 0;
}
else if (WazX < 0)
{
WazX = Dlugosc - 1;
}
if (WazY >= Wysokosc)
{
WazY = 0;
}
else if (WazY < 0)
{
WazY = Wysokosc - 1;
}
for (int i = 0; i < DlugWeza; i++)
{
if (PolWezX[i] == WazX && PolWezY[i] == WazY)
{
Przegrana = true;
}
}
if (WazX == OwocX && WazY == OwocY)
{
OwocX = rand() % Dlugosc;
OwocY = rand() % Wysokosc;
DlugWeza += 1;
}
}
void GraSnake::StartGry()
{
UstawWeza();
while (!Przegrana)
{
Plansza();
kla();
ZasaPlanszy();
Sleep(100);
}
}
void GraSnake::MenuGry()
{
char opcja = '\0';
while (opcja != '2')
{
system("cls");
MENU();
opcja = _getch();
system("cls");
switch (opcja)
{
case '1':
StartGry();
system("cls");
PRZEGRANA();
break;
case '2':
cout << "WYCHODZENIE Z GRY";
Sleep(500);
break;
default:
break;
}
}
}
int main()
{
GraSnake Snake;
Snake.MenuGry();
return 0;
}