我的程序在下面,每次我运行它,它立即崩溃,我不明白为什么,任何人都可以帮忙吗?它的意思是一个地图,有人可以用箭头键在@字符周围移动,但我把它弄到某个地方。
#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);
}
}
答案 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的数组。
这只是您的代码中使用错误顺序的数组索引和维度的一个示例。