所以我正在製作一個帶有傳送和通常老鼠的蛇類遊戲。我有一個循環中運行這樣的:神祕的海森堡?
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()
。與Teleport無關。奇怪的。
所以我去了蛇函數,其中蛇從一個瞬移獲得其下一個位置:
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;
}
我該如何解決此警告?
您在某處遇到未定義的行爲。 (很可能,您訪問的是某些界限不合適的東西,並且無法使用堆棧,周圍的數據或其他任何東西。)您需要逐步檢查代碼並檢查所有訪問。 – GManNickG 2010-09-12 23:43:38
您的代碼中某處存在一些未定義的行爲。編譯您的代碼,並打開所有警告。並確保沒有警告報告(警告通常是錯誤)。如何打開警告將取決於編譯器。如果這不起作用,你需要使用一個工具來告訴你內存損壞(依賴於平臺)。 – 2010-09-12 23:44:19
@Martin York - 我試過刪除所有警告,請參閱我的更新。我認爲這個警告可能是原因,但我需要一些幫助。謝謝! – wrongusername 2010-09-12 23:59:31