| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1925 人关注过本帖
标题:c语言小贪吃蛇无故的小概率bug烦死我了,谁能给看看!谢谢!
只看楼主 加入收藏
h781458175
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-2-7
收藏
得分:0 
回复 7楼 邓士林
应该在winTC下编译!也只能在winTC,其他不认识far,网上说是这是个淘汰的东西了。呵呵
2013-04-06 09:25
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:20 
楼主 你的食物多出来 是不是在蛇尾巴靠墙的时候吃食物时多出来的
看了半天 你的代码 在下面这个函数中发现了问题
程序代码:
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语言是一门简洁的语言 楼主的代码格式上还算工整 就是逻辑上有那么小小的冗余 可以努力努力 使得程序在逻辑上更简练一些

人生是一场错过 愿你别蹉跎
2013-04-06 18:03
h781458175
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-2-7
收藏
得分:0 
回复 12楼 fanpengpeng
    呵呵,首先感谢大哥啊,我都是抱着试一试的心态发上来的,因为我想着一般人怎么会有耐心去看别人的代码,而且去找一个比较隐蔽的bug;就是我也有点不想从头再仔细梳理一下的感觉;
    大哥一语中的啊,就是这个问题啊,困扰我好久了,昨晚我也找出它来了,不过您不要笑话我,我其实不是从代码上找出来的,因为可能我下意识的认为这样++或--是没有问题的,潜意识就不会认为它是错的(虽然我也在这个函数上徘徊过呵呵);我昨晚是用屏幕录像专家录制了出现此bug的画面而发现出错的特定条件的,我想我一说您一定知道这是多么笨的一个办法啊,因为光等它出现我就玩了有半个小时多(虽然我已经觉得很幸运了呵,时间不长其实!上天怜悯啊!);
    至于蛇尾三个空间都被包住的情况,我写的时候也想来着,当时想的脑子打结,感觉怎么也不能想出一种全部包住的情况吧,现在还是想不出来啊,下来我再想想!!
    再有那个切掉蛇尾加到蛇头,再移动蛇头的方法确实是我自己想的哈,多谢夸奖;当时想的其实主要是尽可能多的少移步,这样执行步数会少很多,效率会高,还有一个最重要的原因是因为我刚作的时候用的是printf(),在一个统一的打印函数里每次刷一次屏,闪的厉害,所以想着越少移动越不闪;
    至于标识符的问题,我这可是没有办法啊,英语太菜啊,能用英语的地方我也就努力用英语了,只是有的实在是想不起来用英语怎么写,要是强用有道查出来写上,我怕到时候我自己也不认识了呵;不过这个程序刚开始是在vc++ 6下写的,在那下面我对每个标识符都做了详细的中文注释的,只不过后来要用直接写屏,vc下用不了,我就转到wintc下,中文注释一概不能用,我就全删了,当时也是比较心痛的。
    小冗余可能是因为这个从刚开始的printf()的显示方法,转到直接写屏后有些东西已经没有必要了,但我也没删它。我会努力的!
    大哥的话真正增加了我的自信啊,我现在还在培训机构学编程了,这是我的第二个程序,第一个是学校的c语言毕业设计--ATM机,所以我才这么拧巴一定要找出这个小bug来,要不以后我会有阴影的,呵
    再次谢谢大哥的大师级大无私的解答!!
2013-04-07 10:19
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
您太客气了 我也是编程菜鸟啊
尾巴被全包住的情况还是有的啊
下面举几种例子 你看看
图片附件: 游客没有浏览图片的权限,请 登录注册

人生是一场错过 愿你别蹉跎
2013-04-07 12:41
h781458175
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-2-7
收藏
得分:0 
回复 14楼 fanpengpeng
    怎么还是不对劲啊感觉,比如左上角的那个图,您一定是以下为头,上为尾巴吧,那样的话,如果我要求把这个状态回退一步的话,会成为什么呢?因为能走到这一步就一定会上一步是吧,这好像就退不回去了,既然没有上一步哪来的这一步啊;
    中间的那个例子也是同样的问题,不知我说的对不对啊,对这个问题我就一直是这样考虑的!所以似乎觉得好像没有这种全包住的情况。。。。。。
2013-04-07 20:19
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
好像是的啊
有没有一种很极端的情况 就是一路吃东西吃过来
从很短开始 然后食物按照这个形状出现 他就一路向前吃
因为每吃一次 虽然往前移一格 但是尾巴还会长出来 所以尾巴位置不边 最后就给包起来了
当然这样的概率小之又小了

人生是一场错过 愿你别蹉跎
2013-04-07 20:39
h781458175
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-2-7
收藏
得分:0 
回复 16楼 fanpengpeng
这都被你想到了,厉害;有时候编程不就是要想一些极端的问题嘛,这个想法很值得借鉴!多思考,虽然程序bug无处不在,路漫漫。。。
2013-04-07 23:05
wlguyu1985
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-22
收藏
得分:0 
把头文件加进行(加入windows.h  windef.h,把delay()改为Sleep(),clrscr()改为system("cls")),在VC中运行,为什么还是不行呢,有谁能解释下。
2013-04-08 11:51
h781458175
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-2-7
收藏
得分:0 
回复 18楼 wlguyu1985
主要是far指针vc已经不支持了!
2013-04-08 21:04
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
我觉得不一定要那么纠结这个多余的食物怎么出现,可以判断 当出现两个食物时,去掉一个。

有问题一起探讨,一起进步。
2013-04-09 17:08
快速回复:c语言小贪吃蛇无故的小概率bug烦死我了,谁能给看看!谢谢!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017510 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved