C++ I';我在更改阵列的各个部分时遇到问题

C++ I';我在更改阵列的各个部分时遇到问题,c++,arrays,C++,Arrays,我目前正在开发一个可以在控制台中玩的小游戏。我试图让玩家移动,但当我试图替换级别数组中的某个元素时,它会删除该数组的其余部分 现在代码中唯一的移动是向右移动(在控制台中键入2向右移动) #包括 使用名称空间std; #定义con std::cout #定义结束返回0 #定义重复时(true) int宽度、高度; int-rprog; int x,y,z; int playerpos; int输入; 双层[]= {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0,

我目前正在开发一个可以在控制台中玩的小游戏。我试图让玩家移动,但当我试图替换
级别
数组中的某个元素时,它会删除该数组的其余部分

现在代码中唯一的移动是向右移动(在控制台中键入
2
向右移动)

#包括
使用名称空间std;
#定义con std::cout
#定义结束返回0
#定义重复时(true)
int宽度、高度;
int-rprog;
int x,y,z;
int playerpos;
int输入;
双层[]=
{1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 2, 0, 0, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1};
常量字符*显示[]={“,”[]”,“[X]”等;
int render(){
x=1;
y=1;
而(x<37){
z=水平[x-1];
con显示[z];
x=x+1;
y=y+1;
如果(y==7){
y=1;
新线;
}
}
结束;
}
整数播放器(){
“请你下一步行动:w:1,a:2,s:3,d:4”;
新线;
con“当前位置:”阵列

数组索引在C++中以0开始。 将新位置处的项目设置为3:

level[playerpos] = 3;
但是,显示类型的数组只有3个元素(0、1、2):

因此,您会遇到未定义的行为,因为您具有越界访问权限

另外请注意,您的初始数组正确地使用了
2
作为玩家位置,因此可以正常工作

但是,它也有一个off-by-1错误:初始化
playerpos=15
,但将
2
放在索引14处。因此,初始渲染是错误的。因此第一个移动将不正确,并且似乎停留在相同的位置

类型 正如@RemyLebeau提到的,为什么要在游戏状态中使用
double
数组?不仅其他类型更合适,尤其是
double
可能会导致严重的、难以调试的问题。并非所有整数都可以完美地用double表示,类型转换可能会导致不同的结果

举个例子:如果你加上状态4和5,想象一个double不能精确地表示5,而是将它存储为4.9999999999999。当访问数组时,整数转换可以表示状态4。 查看并回答详细信息

定义 <> >在评论中提到,< <代码> >定义s是一个坏主意。它使代码更难为他人阅读,并且是一种坏习惯,更好地得到正确的C++语法并使用它。

数组索引在C++中以0开始。 将新位置处的项目设置为3:

level[playerpos] = 3;
但是,显示类型的数组只有3个元素(0、1、2):

因此,您会遇到未定义的行为,因为您具有越界访问权限

另外请注意,您的初始数组正确地使用了
2
作为玩家位置,因此可以正常工作

但是,它也有一个off-by-1错误:初始化
playerpos=15
,但将
2
放在索引14处。因此,初始渲染是错误的。因此第一个移动将不正确,并且似乎停留在相同的位置

类型 正如@RemyLebeau提到的,为什么要在游戏状态中使用
double
数组?不仅其他类型更合适,尤其是
double
可能会导致严重的、难以调试的问题。并非所有整数都可以完美地用double表示,类型转换可能会导致不同的结果

举个例子:如果你加上状态4和5,想象一个double不能精确地表示5,而是将它存储为4.9999999999999。当访问数组时,整数转换可以表示状态4。 查看并回答详细信息

定义
<> >在注释中提到的< KalnMelikyAn,< <代码> >定义s是一个坏主意。它使你的代码更难阅读别人,而且是一个坏习惯,更好地得到正确的C++语法并使用它。请不要做这个<代码>定义< /Cord>东西,这是可怕的,根本不可能读代码。最好使用。对于C++的语法,不要过早用一组代码< >代码> >来混淆你的代码,我说:“为什么你要使用一个数组< <代码>双< /代码>,而不是一个数组<代码> int <代码>,或者甚至是一个数组< <代码> EnUM <代码>?请不要这样做,代码< >代码< < /代码>东西,这是可怕的,根本不可能读代码。对于C++的语法,最好不要用一组<代码> >定义< <代码> s来混淆代码,我说:“为什么使用一个数组< <代码>双<代码>,而不是一个数组<代码> int <代码>,或者甚至是一个数组< <代码> EnUM <代码>?谢谢,我把它做成了2,它被正确地渲染了。谢谢,我把它做成了2,它被正确地渲染了。