我的程序在执行时立即崩溃

时间:2015-04-17 20:57:00

标签: c++

我的程序在下面,每次我运行它,它立即崩溃,我不明白为什么,任何人都可以帮忙吗?它的意思是一个地图,有人可以用箭头键在@字符周围移动,但我把它弄到某个地方。

#include <iostream>
#include <windows.h>

using namespace std;

char Map[20][40] = {"***************************************",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*                                     *",
                    "*@                                    *",
                    "***************************************"};

int Gamespeed = 100;
int Level = 0;
bool stopgame = false;

int main()
{
    while(stopgame == false)
    {
        system("cls");

        for(int y = 0; y < 40; y++)
            cout << Map[y] << endl;

        for(int y = 0; y < 40; y++)
        {

            for(int x = 0; x < 20; y++)
            {

                switch(Map[y][x])
                {
                case'@':
                {
                    if(GetAsyncKeyState(VK_UP) != 0)
                    {
                        int y2 = (y - 1);

                        switch(Map[y2][x]){

                        case' ':
                        {
                            Map[y][x] = ' ';
                            y -= 1;
                            Map[y2][x] = '@';
                        }
                            break;

                        }
                    }

                    if(GetAsyncKeyState(VK_DOWN) != 0)
                    {
                        int y2 = (y + 1);

                        switch(Map[y2][x]){

                        case' ':
                        {
                            Map[y][x] = ' ';
                            y += 1;
                            Map[y2][x] = '@';
                        }
                            break;

                        }
                    }

                    if(GetAsyncKeyState(VK_RIGHT) != 0)
                    {
                        int x2 = (x + 1);

                        switch(Map[y][x2]){

                        case' ':
                        {
                            Map[y][x] = ' ';
                            x += 1;
                            Map[y][x2] = '@';
                        }
                            break;

                        }
                    }

                    if(GetAsyncKeyState(VK_LEFT) != 0)
                    {
                        int x2 = (x - 1);

                        switch(Map[y][x2]){

                        case' ':
                        {
                            Map[y][x] = ' ';
                            x -= 1;
                            Map[y][x2] = '@';
                        }
                            break;
                        }
                    }
                }
                    break;
                }
            }
        }

        Sleep(Gamespeed);
    }
}

2 个答案:

答案 0 :(得分:0)

好的,有些可惜。


if(GetAsyncKeyState(VK_UP) != 0)
                    {
                        int y2 = (y - 1);

                        switch(Map[y2][x]){
...

请注意,你从y中减去1,但是如果y已经是0怎么办?繁荣 - 你只是在你的阵列之外阅读。

更糟:


Map[y2][x] = '@';

在这些情况下写入la-la land并且可能是产生异常的原因。

每个边缘都有同样的错误。在窥视数组之前,您必须检查您的值。可能会有更多问题,但这个问题确实很明显。

答案 1 :(得分:0)

打印40元素数组的20元素是未定义的行为。

 char Map[20][40];
 for(int y = 0; y < 40; y++)
    cout << Map[y] << endl;

Map是一个包含20元素的数组,每个元素都是40 char的数组。

这只是您的代码中使用错误顺序的数组索引和维度的一个示例。