崩溃控制台应用程序,在循环结束时.寻求建议.(图片在里面)



(基于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();

最新更新