| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3254 人关注过本帖
标题:贪吃蛇代码语句不懂,求解释。
只看楼主 加入收藏
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
结帖率:50%
收藏
已结贴  问题点数:15 回复次数:9 
贪吃蛇代码语句不懂,求解释。
程序代码:
typedef struct SNAKE //蛇身的一个节点
{
    int x;
    int y;
    struct SNAKE *next;
}snake;


snake *head, *food;//蛇头指针,食物指针
snake *q;//遍历蛇的时候用到的指针


void Pos(int x,int y)//设置光标位置
{
    COORD pos;
    HANDLE hOutput;
    pos.X=x;
    pos.Y=y;
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput,pos);
}

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 createfood()//随机出现食物
{
    snake *food_1;
    srand((unsigned)time(NULL));
    food_1=(snake*)malloc(sizeof(snake));
    while((food_1->x%2)!=0)    //保证其为偶数,使得食物能与蛇头对其
    {
        food_1->x=rand()%52+2;
    }
    food_1->y=rand()%24+1;
    q=head;
    while(q->next==NULL)
    {
        if(q->x==food_1->x && q->y==food_1->y) //判断蛇身是否与食物重合
        {
            free(food_1);
            createfood();
        }
        q=q->next;
    }
    Pos(food_1->x,food_1->y);
    food=food_1;
    printf("");
}

谁可以给我解释一下void createfood()中   while((food_1->x%2)!=0)    和     while(q->next==NULL)   这两句的意思。
搜索更多相关主题的帖子: 贪吃蛇 
2015-10-24 21:06
蓝色风暴cl
Rank: 8Rank: 8
来 自:新疆
等 级:蝙蝠侠
威 望:3
帖 子:163
专家分:704
注 册:2015-9-6
收藏
得分:5 
太高端。

欢迎大家加好友哦,多找我聊聊吧!
2015-10-24 21:39
qq1625127317
Rank: 6Rank: 6
等 级:等待验证会员
威 望:1
帖 子:185
专家分:450
注 册:2015-9-3
收藏
得分:5 
那个“■”是中文字符,它占两个空格,所以while((food_1->x%2)!=0)是保证其为偶数,使得食物能与蛇头对齐;
while(q->next==NULL)   它的意思是:要判断食物是不是出现在蛇身上,q = head,从头开始判断,第一个结点看看与食物坐标是不是重合,如果不是就比较第二个结点,做法是令
    q = q -> next;  即是把q的下一个结点赋值给q,直到比较到链表的结尾!即q的下面是NULL的时候!

从前风闻有你,现在我亲眼看见你
2015-10-24 22:55
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:0 
food_1->x  不是地址吗? 地址还可以求余的吗?
while(q->next==NULL)  这里的条件为什么是指针指向空,头节点q中next指向的不是下一个节点吗?
                       要历遍链表条件不应该是while(q->next!=NULL)吗?    因为最后一个节点中的next是指向null。


我是小白。。。。
2015-10-24 23:43
qq1625127317
Rank: 6Rank: 6
等 级:等待验证会员
威 望:1
帖 子:185
专家分:450
注 册:2015-9-3
收藏
得分:0 
以下是引用a1017075043在2015-10-24 23:43:42的发言:

food_1->x  不是地址吗? 地址还可以求余的吗?
while(q->next==NULL)  这里的条件为什么是指针指向空,头节点q中next指向的不是下一个节点吗?
                       要历遍链表条件不应该是while(q->next!=NULL)吗?    因为最后一个节点中的next是指向null。

food_1->x  是食物的横坐标,“->”的作用应该知道吧  第二个你是对的,源代码应该不对的

从前风闻有你,现在我亲眼看见你
2015-10-25 10:54
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:0 
while((food_1->x%2)!=0)
food_1->x不是没有被初始化的吗?那他的值不是为空的吗?怎么就可以做运算了?


我是小白。。。。
2015-10-25 11:42
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:0 
还有 while(q->next==NULL) 是没有错的,我刚刚改了一下,程序运行时就出错了。
    while(q->next==NULL)  还是不懂,求解释

我是小白。。。。
2015-10-25 11:51
qq1625127317
Rank: 6Rank: 6
等 级:等待验证会员
威 望:1
帖 子:185
专家分:450
注 册:2015-9-3
收藏
得分:0 
回复 7楼 a1017075043
程序代码:
#include<stdio.h>      //你看一下这个的食物产生函数,food_1->x = rand()%38, 已经随机产生了事物的坐标了,这就算是初始化了吧
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
struct Snake 
{
    int x;
    int y;
    struct Snake * pnext;
};
struct Food
{   
    int x;
    int y;
};
struct Direction
{
    char direction;
};
char ch = 1;
char tn = 3;
int stop = 0;
int TIME = 200;
int SPEED = 400; 
char direction;
struct Food * food;
struct Direction * headir;
struct Snake * head,* tail;      //建立头指针
struct Snake * p;         //遍历指针
void ZHUYE();             //绘制主界面函数
void HideCursor();        //隐藏光标函数
void gotoxy(int x,int y); //移动光标函数
void creat_snake();       //初始化蛇身函数
void draw_snake();        //绘制蛇身
void creat_food();        //产生食物函数
void creat_node();        //添加头结点函数
void shanchu_tail();      //删除尾结点函数
void gameover();          //游戏结束判断函数
int selfpan();            //判断是否咬到自身
void snake_move();        //蛇身移动函数
void keyjiance();         //按键检测函数
void main()
{
    ZHUYE();   //主界面
    while(!stop)
    {
        keyjiance();     //检测按键
        snake_move();    //蛇身移动
        draw_snake();    //重绘蛇身
        Sleep(TIME);      
        gameover();      //判断结束
    }
}
void ZHUYE()              //绘制主页面函数
{  
    HideCursor();
    int i,j;
    for(i = 0; i < 40; i++)
    {
        gotoxy(i,0);
        printf("-");
        gotoxy(i,14);
        printf("-");
    }
    for(j = 0; j < 15; j++)
    {
        gotoxy(0,j);
        printf("|");
        gotoxy(39,j);
        printf("|");
    }
    gotoxy(42,2);
    printf("按任意键开始!w,s,a,d控制方向");
    gotoxy(42,4);
    printf("o键加速 p键减速\n");
    gotoxy(42,6);
    printf("按空格键暂停");
    gotoxy(42,8);
    printf("SPEED : %d",SPEED);
    _getch();
    creat_snake();
    creat_food();
}
void HideCursor()         //隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x,int y)  //移动光标
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
}
void creat_snake()        //蛇身初始化
{
    int i;
    struct Snake * tail;
    tail = (struct Snake *)malloc(sizeof(struct Snake));
    headir = (struct Direction *)malloc(sizeof(struct Direction));
    food = (struct Food *)malloc(sizeof(struct Food));
    if(tail == NULL)
    {
        exit (-1);
    }
    tail -> x = 10;
    tail -> y = 6;
    tail -> pnext = NULL;
    headir -> direction = 'd';
    for(i = 1; i <= 4; i++)
    {
        head = (struct Snake *)malloc(sizeof(struct Snake));
        head -> pnext = tail;
        head -> x = 10 + i;
        head -> y = 6;
        tail = head;
    }
    head = tail;
    draw_snake();
}
void draw_snake()       //绘制蛇身结点函数
{
    struct Snake * temp;
    temp = head;
    while(temp != NULL)
    {
        gotoxy(temp -> x,temp -> y);
        printf("%c",ch);
        temp = temp -> pnext;
    }
}
void creat_food()
{
    struct Snake * temp;
    temp = head;
    srand(time(NULL));
    food -> x = rand()%38+1;
    food -> y = rand()%13+1;
    while(temp != NULL)
    {
        if(food -> x == temp -> x&&food -> y == temp -> y)
        {
            free(food);
            creat_food();
        }
        temp = temp -> pnext;
    }
    gotoxy(food -> x,food -> y);
    printf("%c",tn);
}
void creat_node(int x,int y)         //增添头结点
{
    struct Snake * p2;
    p2 = (struct Snake *)malloc(sizeof(struct Snake));
    p2 -> pnext = head;
    p2 -> x = x;
    p2 -> y = y;
    head = p2;
    gameover();
}
void shanchu_tail()                   //删除尾结点函数定义
{
    struct Snake * temp;
    p = head;
    while(p -> pnext != NULL)
    {
        temp = p;
        p = p -> pnext;
    }
    gotoxy(p -> x,p -> y);
    printf(" ");
    temp -> pnext = NULL;
    free(p);
}
int selfpan()                        //是否咬到自身
{
    struct Snake * temp;
    temp = head -> pnext;
    while(temp != NULL)
    {
        if(temp -> x == head -> x&& temp -> y == head -> y)
            return 1;
        temp = temp -> pnext;
    }
}
void gameover()                      //判断游戏结束
{
    struct Snake * temp;
    temp = head -> pnext;
    if(selfpan() == 1)
    {
        stop = 1;
        system("cls");
        gotoxy(18,7);
        printf("游戏结束!");
        gotoxy(8,18);
        printf(" ");
    }
    if(head -> x <1 || head -> x > 38 || head -> y <1 || head -> y >13)
    {
        stop = 1;
        system("cls");
        gotoxy(18,7);
        printf("游戏结束!");
        gotoxy(8,18);
        printf(" ");
    }
}
void snake_move()                    //蛇身移动函数定义
{
    if(headir -> direction == 'w')
    {
        if(food -> x == head -> x && food -> y == head -> y)
        {
            gotoxy(food -> x,food -> y);
            printf(" ");
            creat_node(head -> x,head -> y -1);
            creat_food();
        }
        else
        {
            creat_node(head -> x,head -> y -1);
            shanchu_tail();
        }
    }
    if(headir -> direction == 's')
    {
         if(food -> x == head -> x && food -> y == head -> y)
        {
            gotoxy(food -> x,food -> y);
            printf(" ");
            creat_node(head -> x,head -> y + 1);
            creat_food();
        }
        else
        {
            creat_node(head -> x,head -> y + 1);
            shanchu_tail();
        }
    }
     if(headir -> direction == 'd')
    {
         if(food -> x == head -> x && food -> y == head -> y)
         {
            gotoxy(food -> x,food -> y);
            printf(" ");
            creat_node(head -> x + 1,head -> y);
            creat_food();
        }
        else
        {
            creat_node(head -> x + 1,head -> y);
            shanchu_tail();
        }
    }
     if(headir -> direction == 'a')
    {
         if(food -> x == head -> x && food -> y == head -> y)
        {
            gotoxy(food -> x,food -> y);
            printf(" ");
            creat_node(head -> x -1,head -> y);
            creat_food();
        }
        else
        {
            creat_node(head -> x - 1,head -> y);
            shanchu_tail();
        }
    }
    gotoxy(42,8);
    printf("SPEED : %d",SPEED);
}
void keyjiance()          //按键检测函数定义
{
    char key;
    if(_kbhit())
    {
        key = getch();
        switch(key)
        {
            case 'w' : if(headir -> direction == 's')
                            break;
                       else
                           headir -> direction = 'w';break;
            case 's' : if(headir -> direction == 'w')
                           break;
                        else
                            headir -> direction = 's';break;
            case 'd' : if(headir -> direction == 'a')
                           break;
                        else 
                            headir -> direction = 'd';break;
            case 'a' : if(headir -> direction == 'd')
                            break;
                        else
                            headir -> direction = 'a';break;
            case 'o' : if(TIME > 50)
                       {
                           TIME -= 50;SPEED += 50; break;
                       }
            case 'p' : if(TIME < 400)
                       {
                           TIME += 50;SPEED -= 50; break;
                       }
            case ' ' : gotoxy(6,15);
                       printf("游戏已暂停,按任意键恢复游戏");
                       system("pause>nul");
                       gotoxy(6,15);
                       printf("                           ");
                       break;
            default :  break;
        }
    }
}

从前风闻有你,现在我亲眼看见你
2015-10-25 12:37
qq1625127317
Rank: 6Rank: 6
等 级:等待验证会员
威 望:1
帖 子:185
专家分:450
注 册:2015-9-3
收藏
得分:0 
回复 6楼 a1017075043
就是可以用英文字符代替那个黑方块,比如笑脸它的ASCII码是1,你定义一个变量  char th = 1,在结点处输出就行了,就不用考虑(food_1->x%2)!=0了

从前风闻有你,现在我亲眼看见你
2015-10-25 12:45
风ji哲
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2015-10-25
收藏
得分:5 
2015-10-25 20:45
快速回复:贪吃蛇代码语句不懂,求解释。
数据加载中...
 
   



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

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