所以我正在用传送和通常的老鼠制作一个蛇游戏。我有一个这样的循环运行:
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
Whereteleports[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;
}
我该怎么做才能解决此警告?