(基于C++CLR的项目)
下图显示了调试过程。基本上,该程序的设计目的是为游戏绘制一个简单的ASCII级别。(30 x 30,在循环的每次迭代中绘制一个字符("空格"或"+")
http://imageshack.us/photo/my-images/52/prgramcrash.jpg/
x是宽度,y是高度。因此,它将在宽度上循环30次,每次绘制一个"+",然后y应该将行更改为下一行,并开始绘制更多的"+"。然而,在绘制了第一行的30"+"之后,我在调试过程中采取的下一步会使应用程序崩溃(右下角有一条奇怪的消息)。
崩溃发生在第77行,没有读取另一行代码,程序按计划打印出30’+,在for(x)循环(返回到for y,height循环)退出时,它就死了。
这是基于我正在学习的一个教程,我看了一整天的视频,检查代码是否有错误,但我肯定错过了一些东西。
我已经在底部的一个链接中列出了整个代码(代码::blocks项目),但我怀疑这里是否有人愿意帮助我:p,真的,我只是希望有更多经验的人知道是什么导致了这次崩溃,并朝着解决问题的正确方向推动我。
我真的希望你们能帮忙!:D
代码块项目链接:http://www.mediafire.com/?15nw8saa6x86b80
这里的问题是,您将drawEngine定义为宽度和高度为80:
class DrawEngine
{
public:
DrawEngine (int xSize = 80, int ySize = 50);
...
};
然而,当你创建一个级别时,你说级别应该是30x30:
bool Game::run(void)
{
level = new Level(&drawArea, 30, 30);
....
}
然后你把你的等级设置为一个30x30大小的数组,然后把这个30x30数组传给drawArea:
Level::Level(DrawEngine *de, int w, int h)
{
drawArea = de;
width = w;
height = h;
player = 0;
// char** create memory for every position in the level.
level = new char *[width];
for (int x = 0; x < width; x++)
level[x] = new char[height];
//create the level
createLevel();
drawArea->setMap(level);
}
这个循环实际上是越界的,因为它认为它有一个80x80大小的数组可以循环,而实际上它只有30x30:
void DrawEngine::drawBackground(void)
{
if (map)
{
for (int y = 0; y < screenHeight; y++)
{
gotoxy(0, y);
for (int x = 0; x < screenWidth; x++)
cout << tileImage[map[x][y]];
}
}
}
那么你该如何解决这个问题呢?好吧,你必须改变大小,使它们以某种方式匹配,或者你添加代码来正确解释屏幕可能比实际水平大的事实。
例如,你可能想做一些类似以下的事情:
for (int x = 0; x < levelWidth; x++)
{
for (int y = 0; y < levelHeight; y++)
{
// do stuff with level[x][y]
}
}
与相反
for (int x = 0; x < screenWidth; x++)
{
for (int y = 0; y < screenHeight; y++)
{
// do stuff with level[x][y]
}
}
因为在第二种情况下
if (screenWidth > levelWidth || screenHeight > levelHeight)
BadThingsWillHappen();