Zmiana wartości bool po pętli while.

0

Cześć, potrzebuję zmienić wartość bool Przegrana na false po wykonaniu pętli while(). Jest jakaś możliwość bez ingerowania w klasę ?

class GraSnake 
{
private:
	enum Kierunek
	{
		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();
	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::UstawWeza()
{
	Przegrana = false;
	Polozenie = STOP;
	WazX = Dlugosc / 2;
	WazY = Wysokosc / 2;
	OwocX = rand() % Dlugosc;
	OwocY = rand() % Wysokosc;
}

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

Pozdrawiam

1
xsolankix napisał(a):

Cześć, potrzebuję zmienić wartość bool Przegrana na false po wykonaniu pętli while(). Jest jakaś możliwość bez ingerowania w klasę ?

Nie rozumiem jaki masz problem?

		while (!Przegrana)
		{
        		// ...
		}
        Przegrana=false;
}
0
_13th_Dragon napisał(a):

Nie rozumiem jaki masz problem?

Nic to nie zmieniło, jakby bool Przegrana stale była true po uruchomieniu kodu.

1

Powiedziałeś że chcesz po pętli, postaw breakpoint na tą Przegrana=false; po pętli i sprawdź czy tam trafia.

0

Trafia, wartość końcowa jest true.

this	0x00fff810 {Polozenie=GORA (3) DlugWeza=2 Przegrana=true ...}	GraSnake *
Przegrana	true	bool

2
xsolankix napisał(a):

Trafia, wartość końcowa jest true.

this	0x00fff810 {Polozenie=GORA (3) DlugWeza=2 Przegrana=true ...}	GraSnake *
Przegrana	true	bool

No więc skoro dalej się wykonuje Przegrana=false; to będzie false cudów nie ma.
Problem prawdopodobnie w kodzie co nie pokazałeś.

0
_13th_Dragon napisał(a):

Problem prawdopodobnie w kodzie co nie pokazałeś.

#include <iostream>
#include <conio.h>
#include <string>
#include <windows.h>
using namespace std;

class GraSnake 
{
private:
	enum Kierunek
	{
		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();
	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() 
{
}

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);
		}
		Przegrana = false;
}

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

Cały kod wygląda tak.

1

To na czym polega ten problem z Przegrana bo wg mnie wszystko jest ok (może oprócz tego że wąż zazwyczaj kończy grę jak się włazi na krawędź)?

0

Jeżeli rozpocznę grę, zbiorę np. 2 lub więcej "owoców" i cofnę się do tyłu, to wyrzuca mi przegraną. Jak chcę wejść znowu z menu na start gry to za każdym razem wyświetla "Przegrałeś." bez ponownego rozpoczęcia gry.
Jaki może być w takim razie warunek kończący grę, skoro, gdy się cofnie wężem do tyłu i wejdzie w "ogon" to się kończy gra.

Już wszystko wyjaśniłem. Po pętli while() wystarczyło przypisać wartość, która 'resetowała' długość węża:

		Przegrana = false;
		Polozenie == 0;
		DlugWeza = 0;

1 użytkowników online, w tym zalogowanych: 0, gości: 1