回复 7楼 邓士林
应该在winTC下编译!也只能在winTC,其他不认识far,网上说是这是个淘汰的东西了。呵呵
看了半天 你的代码 在下面这个函数中发现了问题
程序代码:
void ttail() /*it is just used at the czi() */ { char far* k; int x_c,y_c; snake *s=(snake *)malloc(sizeof(snake)); s->qian=tail; s->hou=NULL; tail->hou=s; x_c=tail->x-tail->qian->x; y_c=tail->y-tail->qian->y; if(x_c==0) { if(game[tail->x][tail->y+y_c]!=1) { game[tail->x][tail->y+y_c]=1; s->x=tail->x; s->y=tail->y+y_c; } else if(game[++(tail->x)][tail->y]!=1) { game[++(tail->x)][tail->y]=1; s->x=++(tail->x); s->y=tail->y; } else { game[--(tail->x)][tail->y]=1; s->x=--(tail->x); s->y=tail->y; } } if(y_c==0) { if(game[tail->x+x_c][tail->y]!=1) { game[tail->x+x_c][tail->y]=1; s->x=tail->x+x_c; s->y=tail->y; } else if(game[tail->x][++(tail->y)]!=1) { game[tail->x][++(tail->y)]=1; s->x=tail->x; s->y=++(tail->y); } else { game[tail->x][--(tail->y)]=1; s->x=tail->x; s->y=--(tail->y); } } tail=s; /*...................130328am......................start*/ k=pyljsuan(jdzhi,tail->x,tail->y); *k='#'; /*...................130328am......................stop*/ }
else if(game[++(tail->x)][tail->y]!=1)
这里不能用++的 这样的话 tail->x也被修改了 需要改成tail->x + 1 这个函数里 类似的地方都需要改
只要用到++ -- 的地方 包括 s->y=++(tail->y); 按照你在原来尾巴后面添尾巴的方法 原来尾巴的坐标是不能变动的
这个bug还是比较隐蔽的 只有在吃子的时候 沿着尾巴方向向后没有剩余空间时 这块代码才会被执行到
当然 还有一个遗漏的情况没有处理 就是在蛇尾巴的三个方向上都没有可用空间放新添的尾巴的时候 该怎么处理
也就是 最后一个else子句也要加判断的 因为存在这样的情况 蛇尾巴被全部包起来了的情况
但是 对这样的情况的处理就由楼主自己来决定了 是结束游戏 还是在头前面加个点等等
特别要说一下的是 那个蛇移动的方法相当好 把尾巴切下来 放到头的位置上 然后只要头按着指定方向移动一下就好了
这个简单的方法巧妙的处理了蛇在各种弯曲形状下的移动问题 非常好 如果是楼主自己想到的话 那恭喜楼主 前途无量啊
最后就是 标识符的命名千万不要拼音跟英语混搭
C语言是一门简洁的语言 楼主的代码格式上还算工整 就是逻辑上有那么小小的冗余 可以努力努力 使得程序在逻辑上更简练一些