I'm trying to make a snake game and maybe this error is one of possible. So when I'm debugging and stepping over then I getting link to exception in header file of vector and in exception code wrote that vector has invalid subscript. (Error cause can called by vector bodyPart). The compiler message:
Unhandled exception at 0x00007FFA227EA799 in snake.exe: Microsoft C++ exception: std::out_of_range at memory location 0x00000052FA7CDFD0.
Snake::Snake(RenderWindow& window)
{
bodyPart.setPosition(window.getSize().x / 4, window.getSize().y / 4);
bodyPart.setSize(Vector2f(20.f, 20.f));
bodyPart.setFillColor(Color(0, 0, 0));
body.push_back(bodyPart);
}
//Sets default parameters
void Game::restart(RenderWindow& window)
{
for (int i = 0; i < snake.body.size() - 1; i++)
{
snake.body.pop_back();
}
snake.bodyPart.setPosition(window.getSize().x / 4, window.getSize().y / 4);
snake.body.push_back(snake.bodyPart);
}
//Updates game
void Game::tick(RenderWindow& window)
{
if (snake.body.at(0).getPosition().x == fruit.fruitX && snake.body.at(0).getPosition().y == fruit.fruitY)
{
fruit.fruitX = fieldLCorn + rand() % fieldX * fieldY;
fruit.fruitY = fieldLCorn + rand() % fieldY * fieldX;
ui.score++;
snake.body.reserve(1);
snake.body.push_back(snake.bodyPart);
}
}
void Game::moveSnake()
{
switch(dir)
{
case 1:
snake.body.push_back(snake.tail);
snake.body.at(0).move(0, snake.body.at(0).getPosition().y + 10);
snake.body.pop_back();
case 2:
snake.body.push_back(snake.tail);
snake.body.at(0).move(0, snake.body.at(0).getPosition().y - 10);
snake.body.pop_back();
case 3:
snake.body.push_back(snake.tail);
snake.body.at(0).move(snake.body.at(0).getPosition().x + 10, 0);
snake.body.pop_back();
case 4:
snake.body.push_back(snake.tail);
snake.body.at(0).move(snake.body.at(0).getPosition().x - 10, 0);
snake.body.pop_back();
}
}
void Game::countCollision(RenderWindow& window)
{
//Is snake met border
if (snake.body.at(0).getPosition().x > 300) restart(window);
if (snake.body.at(0).getPosition().y > 300) restart(window);
if (snake.body.at(0).getPosition().x < -300) restart(window);
if (snake.body.at(0).getPosition().y < -300) restart(window);
//If snake eats itself
for (int k = 0; k < snake.body.size() - 1; k++)
{
if (snake.body.at(0).getPosition().x == snake.body.at(k).getPosition().y && snake.body.at(0).getPosition().y == snake.body.at(k).getPosition().y)
{
restart(window);
}
}
}
void Game::render(RenderWindow& window)
{
for (int i = 0; i < snake.body.size() - 1; i++)
{
window.draw(snake.body.at(i));
}
}
For what I can see here, the problem might be the
snake.body.at(0)
That you are using inside your code a lot of times, when maybe the body has no elements, and so there is no 0
's element