Wąż nie rośnie po zjedzeniu drugiego pokarmu

0

Wąż nie rośnie po zjedzeniu drugiego pokarmu oraz nie generuje się kolejny.
Wrzucam kod:

#include <iostream>
#include <chrono>
#include <thread>
#include "console.h"
#include "Snake.h"
#include "Food.h"

void check(Board gameBoard,Food *_food, Snake &_snake)
{
	if (_food->getCoorX() == _snake.getCoorX() && _food->getCoorY() == _snake.getCoorY())
	{
		delete _food;
		_snake.growBody();
		_food = new Food(gameBoard);
	}
}

int main()
{
	int width, height;
	std::cout << "Podaj szerokosc planszy: ";
	std::cin >> width;
	std::cout << "Podaj wysokosc planszy: ";
	std::cin >> height;

	Board gameBoard(width, height);
	Snake snake(gameBoard);
	Food *food = new Food(gameBoard);

	for (;;)
	{
		clear();
		gameBoard.drawBoard();
		std::chrono::milliseconds timespan(1000);
		std::this_thread::sleep_for(timespan);
		snake.changeDirection();
		snake.move(gameBoard);
		check(gameBoard, food, snake);
	}

}
1

Wrzuć resztę kodu

1

Na ile widzę najpierw usuwasz jedzenie, a następnie waż rośnie.
O ile rośnie? Już bez istniejącego jedzenia?
W sumie błąd w stylu:

void foo(int x) { x=42; }
int main() { x=0; foo(x); return cout<<x; } // czemu x wciąż 0?
void check(Board gameBoard,Food **_food, Snake &_snake)
{
	if (_food->getCoorX() == _snake.getCoorX() && _food->getCoorY() == _snake.getCoorY())
	{
		_snake.growBody();
		delete _food;
		*_food = new Food(gameBoard);
	}
}

...

check(gameBoard, &food, snake);

a jeszcze lepiej:

bool check(Board gameBoard,Food *_food,Snake &_snake)
{
	bool eat=(_food->getCoorX() == _snake.getCoorX() && _food->getCoorY() == _snake.getCoorY());
	if(eat) _snake.growBody();
	return eat;
}

...

if(check(gameBoard, food, snake))
{
	delete food;
	food = new Food(gameBoard);
}
2

std::cout i std::cin w czymś co jest tak interaktywne jak gra Snake?
std::cout jest abstrakcją na standardowe wyjście, które może reprezentować dowolne urządzanie wyjściowe: plik, port szeregowy, drukarkę, konsolę ... .
Efekt jest taki, że std::cout i std::cin nie nadają się do gier (poza wyjątkami gier terminalowych np Zork).

0
Litlith994 napisał(a):

Wąż nie rośnie po zjedzeniu drugiego pokarmu oraz nie generuje się kolejny.
Wrzucam kod:

void check(Board gameBoard,Food *_food, Snake &_snake)
{

  _food = new Food(gameBoard);

Skutek tego jest pusty, wyciek pamięci

0

@_13th_Dragon: zrobiłam jak podałeś i kod się nie kompiluje.

#include <iostream>
#include <chrono>
#include <thread>
#include "console.h"
#include "Snake.h"
#include "Food.h"

bool check(Board gameBoard, Snake& _snake)
{
	bool eat = (_food->getCoorX() == _snake.getCoorX() && _food->getCoorY() == _snake.getCoorY());
	if (eat) _snake.growBody();
	return eat;
}

int main()
{
	int width, height;
	std::cout << "Podaj szerokosc planszy: ";
	std::cin >> width;
	std::cout << "Podaj wysokosc planszy: ";
	std::cin >> height;

	Board gameBoard(width, height);
	Snake snake(gameBoard);
	Food *food = new Food(gameBoard);

	for (;;)
	{
		clear();
		gameBoard.drawBoard();
		std::chrono::milliseconds timespan(1000);
		std::this_thread::sleep_for(timespan);
		snake.changeDirection();
		snake.move(gameBoard);
		

		if (check(gameBoard, snake))
		{
			delete food;
			food = new Food(gameBoard);
		}
	}

}

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