Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的Snake-整数在未更改的情况下更改-什么';问题出在哪里?_C_Arrays - Fatal编程技术网

C中的Snake-整数在未更改的情况下更改-什么';问题出在哪里?

C中的Snake-整数在未更改的情况下更改-什么';问题出在哪里?,c,arrays,C,Arrays,(程序语言是c语言-当修改时,请只使用noobs能做的东西,我从一周开始就在学习) 问题是:请参阅main开头的“int snakelen=1;” 我从不改变那个整数。但当我结束游戏时,它是0。为什么? 如果我试图在游戏中途改变snakelen,游戏就会完全崩溃,我会听到windows错误的声音。 怎么了 (虽然我使用了随机发生器,但食物不会随机产卵。它要么只产卵底部,要么只产卵顶部——大约每5分钟变化一次。另一个wierd故障。) #包括 #包括 #包括 #包括 #包括 #包括 #定义大小20

(程序语言是c语言-当修改时,请只使用noobs能做的东西,我从一周开始就在学习)

问题是:请参阅main开头的“int snakelen=1;”

我从不改变那个整数。但当我结束游戏时,它是0。为什么?

如果我试图在游戏中途改变snakelen,游戏就会完全崩溃,我会听到windows错误的声音。 怎么了

(虽然我使用了随机发生器,但食物不会随机产卵。它要么只产卵底部,要么只产卵顶部——大约每5分钟变化一次。另一个wierd故障。)

#包括
#包括
#包括
#包括
#包括
#包括
#定义大小2048//32(*2,因为每2个都是一个空格)*32
#定义HSIZE 1024//32*32
#定义UP_u1
#定义下\u3
#定义左_u4
#定义右u2
#定义YSIZE 64//行的长度(包括空格)
//要玩:启动游戏一次,右键单击顶部的命令promt,单击设置->布局。然后将窗口大小更改为64(水平)*33(垂直)
int计数器=0;
智力游戏速度=400//渲染游戏帧的间隔
int产卵食物(int*freetable,int蛇)
{
srand(time(NULL));//随机化
int randomIndex=rand()%(HSIZE-1);//从数组中随机获取非x填充位置
int randomValue=freetable[randomIndex];//输出随机位置
返回随机值;
}
int main()
{
int nofood=1;//游戏中有食物吗?1=没有
//int tmp=0;//稍后使用的临时内存
int tmp2=0;//临时内存2
int snakelen=1;//蛇的长度
int snakedir=RIGHT;//蛇正在查看的位置
int snakeheadxpos=0;//蛇的x位置
int snakeheadypos=0;//蛇的y位置
char q;//上次按下的按钮
char gametable[SIZE];//游戏屏幕//用空格填充
对于(int i=0;igametable[size]
位于数组之外,分配给它会调用未定义的行为。

警告:这不是“给人一条鱼”的答案。这是“教人钓鱼”的答案

对于读取或写入数组的每一条语句,都应该检查数组索引的有效性

例如,代替

gametable[snakeheadypos*YSIZE + 2*snakeheadxpos] = 'x';

gametable[tmp2] =' ';
……写

int index;

index=snakeheadypos*YSIZE + 2*snakeheadxpos;
if(index<0 || index >=SIZE){printf("Index error A: value is %d", index);exit(1);}
gametable[index] = 'x';

index=tmp2;
if(index<0 || index >=SIZE){printf("Index error B: value is %d", index);exit(1);}
gametable[index] =' ';
int索引;
指数=蛇头鱼*YSIZE+2*蛇头鱼XPO;
如果(index=SIZE){printf(“索引错误A:值为%d”,索引);退出(1);}
游戏表[索引]='x';
指数=tmp2;
如果(index=SIZE){printf(“索引错误B:值为%d”,索引);退出(1);}
游戏表[索引]='';

这类技术可以帮助您检测数组索引问题,这可能是一个非常常见的错误源,并且会产生各种奇怪的症状。

我会避免使用
goto
,因为它会使代码更难理解。不要养成使用它的习惯。
goto
是编程的害群之马。不要使用它!@gsamaC goto中的ras有时是最合适的解决方案。@SergeyA如果
goto
是最合适的解决方案,我会说你需要重构/重新构建/模块化你的代码。
gametable[SIZE]='\0';
这里有一些未定义的行为。有效的数组索引从
0
运行到
SIZE-1
Oh:/在大学里,我们被告知数组以空指针结束。据我所知\0是空指针。我只是用它来确保数组正确结束。如果我删除了那一行,代码就不起作用了。@FireFuro99为了公平起见,如果保留该行,则代码不起作用。我将其更改为“=NULL”。不会更改任何内容
gametable[snakeheadypos*YSIZE + 2*snakeheadxpos] = 'x';

gametable[tmp2] =' ';
int index;

index=snakeheadypos*YSIZE + 2*snakeheadxpos;
if(index<0 || index >=SIZE){printf("Index error A: value is %d", index);exit(1);}
gametable[index] = 'x';

index=tmp2;
if(index<0 || index >=SIZE){printf("Index error B: value is %d", index);exit(1);}
gametable[index] =' ';