Итак, я делаю игру со змеями с телепортами и обычными мышами.У меня был такой цикл:
while(snake.alive() && miceEaten < micePerLevel)
{
displayInfo(lives, score, level, micePerLevel - miceEaten);
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
}
Проблема с приведенным выше кодом состояла в том, что displayInfo
вызывается до обновления счета, и поэтому после употребления мыши пользователь должен ждать, покацикл запускается снова, чтобы увидеть его счет обновляется.Поэтому я переместил одну строку кода в конец функции:
while(snake.alive() && miceEaten < micePerLevel)
{
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
displayInfo(lives, score, level, micePerLevel - miceEaten);
}
, и телепорты перестали работать!Программа вылетает всякий раз, когда змея достигает телепорта.И displayInfo
использует следующий код:
stringstream s;
s << "LEVEL " << left << setw(12) << level << "LIVES: " << setw(12) << lives << "MICE LEFT: " << setw(12) << miceLeft
<< "SCORE: " << setw(13) << score;
printLine(0, s.str(), WHITEONBLUE);
, где printLine
имеет только color_set
, mvprintw
и refresh()
.Ничего общего с телепортами.Странно.
Итак, я пошел к функции змеи, где змея получает свое следующее местоположение из телепорта:
body.push_back(teleports[overlap(next)]->teleportFrom(dir)); //next is a Location object
Где teleports[overlap(next)]->teleportFrom(dir)
возвращает местоположение, в которое змея должна быть телепортирована.В попытке понять, почему происходит сбой (возможно, Teleport
возвращал какое-то местоположение за кадром?), Я добавил следующие 3 строки перед строкой выше:
Location l = teleports[overlap(next)]->teleportFrom(dir);
mvprintw(1, 0, "(%i, %i)", l.x, l.y);
refresh();
И проблема исчезла!
Не только это, но я должен иметь эти три строки.Если я закомментирую mvprintw(1, 0, "(%i, %i)", l.x, l.y);
, или refresh();
, или и то и другое, программа, как и прежде, аварийно завершает работу при достижении телепорта.
Любые идеи о том, что может вызывать такое поведение?* ОБНОВЛЕНИЕ: Я попытался удалить все предупреждения (которые были в основном предупреждениями о сравнении чисел со знаком / без знака), но пока остается только 1:
warning: reference to local variable 'other' returned
И код:
Location& Location::operator = (Location other)
{
if(this == &other)
return other;
x = other.x;
y = other.y;
return *this;
}
Что мне сделать, чтобы исправить это предупреждение?