4
回答
C语言的代码不懂
科大讯飞通用文字识别100000次/天免费使用。立即申请   

我是大一新生,有一串贪吃蛇的代码看不懂,是关于蛇身的创建和蛇身的移动。请求各位大佬帮我仔细解释一下吧!

void initsnake()//初始化蛇身 

    snake *tail; int i; tail=(snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置// 
    tail->x=24;
    tail->y=5;
    tail->next=NULL;
    for(i=1;i<=4;i++) { head=(snake*)malloc(sizeof(snake)); head->next=tail;
        head->x=24+2*i;
        head->y=5;
        tail=head;
    }
    while(tail!=NULL)//从头到为,输出蛇身
    {
        Pos(tail->x,tail->y);
        printf("■");
        tail=tail->next;
    }
}

void gamecircle()//控制游戏
{
    Pos(64,15);
    printf("不能穿墙,不能咬到自己\n");
    Pos(64,16);
    printf("用↑.↓.←.→分别控制蛇的移动.");
    Pos(64,17);
    printf("F1 为加速,F2 为减速\n");
    Pos(64,18);
    printf("ESC :退出游戏.space:暂停游戏.");
    Pos(64,20);
printf("C语言研究中心 www.dotcpp.com");
status=R;
    while(1)
    {
        Pos(64,10);
        printf("得分:%d  ",score);
        Pos(64,11);
        printf("每个食物得分:%d分",add);
        if(GetAsyncKeyState(VK_UP) && status!=D)
        {
            status=U;
        }
        else if(GetAsyncKeyState(VK_DOWN) && status!=U)
        {
            status=D;
        }
        else if(GetAsyncKeyState(VK_LEFT)&& status!=R)
        {
            status=L;
        }
        else if(GetAsyncKeyState(VK_RIGHT)&& status!=L)
        {
            status=R;
        }
        else if(GetAsyncKeyState(VK_SPACE))
        {
            pause();
        }
        else if(GetAsyncKeyState(VK_ESCAPE))
        {
            endgamestatus=3;
            break;
        }
        else if(GetAsyncKeyState(VK_F1))
        {
            if(sleeptime>=50)
            {
                sleeptime=sleeptime-30;
                add=add+2;
                if(sleeptime==320)
                {
                    add=2;//防止减到1之后再加回来有错
                }
            }
        }
        else if(GetAsyncKeyState(VK_F2))
        {
            if(sleeptime<350)
            {
                sleeptime=sleeptime+30;
                add=add-2;
                if(sleeptime==350)
                {
                    add=1;  //保证最低分为1
                }
            }
        }
        Sleep(sleeptime);
        snakemove();
    }
}

举报
Meet-sw
发帖于5个月前 4回/301阅

具体那句不懂?

--- 共有 3 条评论 ---
tcxu 回复 @Meet-sw : 建议注明你的代码的出处 http://www.dotcpp.com/wp/114.html 5个月前 回复
tcxu 回复 @Meet-sw : 谢谢你的回复。你所引荐的是4个表达式Expression。每个表达式,都以分号 ‘ ;’ 结束。它们都有一个双目 (二元) 赋值操作符 binary assignment operator = 。其左右两边都要求要有一个操作数 operand, 分别叫做左值left value 和 右值 right value。下面的一贴答案,我们可以继续详谈。 5个月前 回复
Meet-sw回复@tcxu : tail=(snake*)malloc(sizeof(snake)); tail->x=24; tail->y=5; tail->next=NULL 5个月前 回复

在你所给出的代码之中,函数 void initsnake(){...} 的功能是创建(初始化) 一段蛇 snake 结构的实体。

从第一行的头一个声明  snake *tail;  可以看出,这个 snake 结构实体的地址,将储存在它的指针  tail 之中。

接着,就是你不懂的   tail=(snake*)malloc(sizeof(snake));

  1. 它 (即函数 malloc(...))的功能 是 给这个 snake 构造实体安排好足够的内存空间,并返回这个给定空间的地址。赋值操作符 = 的作用,就是将安排好的空间的地址,保存到 snake 结构体类型的指针 tail 里。
  2. 如上所述,函数 malloc() 的功能是找好空间。空间要多大呢? malloc()的参数 sizeof( snake )将回答这个问题。
  3. 这里的 函数sizeof() 的参数 用的是 snake 类型的结构体。以这个参数 来调用这个函数 sizeof( snake) 的结果,将返回储存结构体 snake 所需要的空间大小,单位是字节。
  4. 一旦调用了 sizeof(snake),函数 malloc(...)就有了所需空间的大小(单位:字节)的信息,便可依此安排内存空间了。调用 函数 malloc() 完成后,还要核实一下这个地址将要赋值给谁的? 所以前面加上个(snake*), 以便确认将要把这个定好的“房间”(空间)的地址,赋值给 snake 结构体类型的指针。
  5. 执行这个赋值操作符(=)的运算之后,便 完成了 将 这个“房间”(空间)的地址,存到指针tail 之中的任务。
  6. 此刻,指针 tail 有了地址,那就可以按照地址“往这个房子(定好的内存空间)里放东西(存储数值)了”。
  7. 于是, tail->x=24; tail->y=5; tail->next=NULL 的操作是:给这个 snake 结构实体的 成员 x 赋予 整型数 24, 成员 y赋予 整型数 5 , 这样,就将 这段蛇的坐标位置搞定了。
  8. tail->next=NULL 表示,它下一段的内存地址,被置空, 即尚未存储同类实体的任何地址。 

https://www.oschina.net/code/snippet_261347_26002

这个也可以看看

--- 共有 3 条评论 ---
tcxu 回复 @省委书记沙瑞金 : 沙书记,5年前的C语言作品,经验可贵。C 是 (自1972年,D.M.Ritchie DM里奇, 发明了C语言)以后编程语言的根本,不能忘记他们的初心。尽管细节一时回想不起来,但 “开源中国” 已经详细记录了您的足迹。 5个月前 回复
省委书记沙瑞金我都不知道我当年是怎么写出来的。 5个月前 回复
tcxu谢谢指引我们看到了贪吃蛇的网页。让我们来详谈吧。 5个月前 回复

下面提一下数据结构中单链表的内容, 这门课往往在大二才开设。可以称这个构造体 snake为 自引用 (self reference) 构造体, 因为它有一个属性(attribute, member variable成员变量) next, 其类型是指向相同构造体实体(自己)的指针 。详情见代码的注释,和插图。

for(i=1;i<=4;i++) {  
head=(snake*)malloc(sizeof(snake)); head->next=tail;
        head->x=24+2*i;
        head->y=5;
        tail=head;
    }
    while(tail!=NULL)     {  //从头到尾,输出(画出)蛇身
        Pos(tail->x,tail->y); //调用函数 Pos(x,y)将光标移到坐标[x,y]的位置 
        printf("■");//画一段蛇
        tail=tail->next; //将指针 tail 指向下一个结点。
    }

不要着急。其余的代码看不懂是正常的,因为有些知识你还没有学到。任重道远,慢慢来吧。

顶部