搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 1521|回复: 20
收起左侧

刚学链表写的贪吃蛇=v=适合新手看

[复制链接]

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
发表于 2012-12-21 12:23:01 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 Whisper1166 于 2012-12-21 12:59 编辑

[mw_shl_code=cpp,true]
#include "stdio.h"
#include "windows.h"
#include "conio.h"
#include "stdlib.h"
#include "time.h"
#include "string.h"
               //因为我也是新手,真的,才学C语言一学期不到..所以没有高手写的那么难懂...目前在写printf写得跟狗一样...
              //想必在大神面前这些结构体就像蓝天白云一样清晰明了
struct Snake  //谁知道这些都是什么意思?  (知道的去死!!!)
{             //蛇的结构体,xy是蛇身体的某一部分的坐标,*next是链表里的指针..
        int x;
        int y;
        char body;
        struct Snake *next;
}*front,*rear,*p,*q;

struct food//这是禁果(喂)的坐标
{
        int x;
        int y;
}a;

int main()
{
        int i,j,score=0,time=10000,flag;//i j是对二维数组赋值和输出用的,time是画面停滞时间,flag是判断是否需要生成禁果(你够了)
        char c,dir,Amatrix[30][80],name[15],love[]={"XXX"};//c是获取键盘输入,dir表示蛇移动方向,name只是game over以后记录名字用的  XXX我屏蔽掉了
loop:front=(struct Snake*)malloc(sizeof(struct Snake));//就是动态分配内存,通过指针front和rear指向蛇头和蛇尾
        rear=(struct Snake*)malloc(sizeof(struct Snake));
        front->body='H';//蛇头是H,蛇尾是X   ←这是老师要求的
        rear->body='X';
        front->x=1,front->y=2;//设定初始蛇头蛇尾的坐标
        rear->x=1,rear->y=1;
        front->next=rear;
        rear->next=NULL;//当然链表的末端的指针要清空
        flag=0;
        for(i=0;i<24;i++)
        {
                for(j=0;j<70;j++)
                        Amatrix[j]=' ';//先让二维数组全为空格
        }
        for(i=0,j=0;i<24;j++)
        {
                Amatrix[j]='-';
                if(70==j)
                {
                        j=0;i+=23;
                }
        }
        for(i=0;i<24;i++)
                Amatrix[70]='\0';
        for(i=1;i<23;i++){
                Amatrix[0]='|';Amatrix[69]='|';}//画框框
        Amatrix[10][30]='o';
        Amatrix[front->x][front->y]=front->body;//把对应位置的蛇身体的部分赋值给数组
        Amatrix[rear->x][rear->y]=rear->body;//   这样后面输出二维数组就能表现出蛇的移动了
        for(i=0;i<24;i++)
                puts(Amatrix);//因为printf比较复杂,输出数组的时候快闪瞎我狗眼了,所以用puts
    printf("↑=w,↓=s,←=a,→=d不能穿墙,吃自己或者走反方向必死,界面渣勿喷");
        while(1)
        {
            c=getch();//dir跟c其实是一个意思,都是从键盘上读取输入,获取蛇的移动方向
            dir=c;
                if(('w'==dir)&&(Amatrix[front->x-1][front->y]!='-')&&(Amatrix[front->x-1][front->y]!='X'))//如果蛇没撞墙或者吃到自己
                {
                        if(Amatrix[front->x-1][front->y]=='o')//吃到禁果,就创造新结点,让它的所有值等于蛇头,并把蛇头移位,蛇头的指针指向新结点
                        {                                    //蛇尾不变,这样蛇就变长了
                            p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->x--;
                                Sleep(30);           //保持竖直方向的速度与水平方向的速度平衡
                                score++;
                                flag=1;
                        }
                        else
                        {                                   //没吃禁果,同样创造新结点重复上面步骤,但是要把蛇尾去掉,这样蛇就不会变长
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->x--;
                                Sleep(30);
                                for(p=front;p!=rear;q=p,p=p->next);//让p指向rear,q指向rear前的一个结点
                                Amatrix[p->x][p->y]=' ';//把原来尾部的位置变成空格
                                free(p);                //销毁尾部
                                rear=q;                  //尾部前移
                                q->next=NULL;            //清空指针
                            p=q=NULL;                //下面其他方向的就雷同了,其实能把重复的部分写成一个函数,看起来也简单点,不过撸主懒..
                                
                        }
                        
                }
                else if(('s'==dir)&&(Amatrix[front->x+1][front->y]!='-')&&(Amatrix[front->x+1][front->y]!='X'))
                {
                        if(Amatrix[front->x+1][front->y]=='o')
                        {
                            p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->x++;
                                Sleep(30);
                                score++;
                                flag=1;
                        }
                        else
                        {
                p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->x++;
                                Sleep(30);
                                for(p=front;p!=rear;q=p,p=p->next);
                                Amatrix[p->x][p->y]=' ';
                                free(p);
                                rear=q;
                                q->next=NULL;
                                p=q=NULL;
                        }
                        
                }
                else if(('a'==dir)&&(Amatrix[front->x][front->y-1]!='|')&&(Amatrix[front->x][front->y-1]!='X'))
                {
                        if(Amatrix[front->x][front->y-1]=='o')
                        {
                            p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->y--;
                                score++;
                                flag=1;
                        }
                        else
                        {
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->y--;
                                for(p=front;p!=rear;q=p,p=p->next);
                                Amatrix[p->x][p->y]=' ';
                                free(p);
                                rear=q;
                                q->next=NULL;
                                p=q=NULL;
                        }
                        
                }
                else if(('d'==dir)&&(Amatrix[front->x][front->y+1]!='|')&&(Amatrix[front->x][front->y+1]!='X'))
                {
                        if(Amatrix[front->x][front->y+1]=='o')
                        {
                            p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->y++;
                                score++;
                                flag=1;
                        }
                        else
                        {
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                            p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                            front->next=p;front->y++;
                                for(p=front;p!=rear;q=p,p=p->next);
                                Amatrix[p->x][p->y]=' ';
                                free(p);
                                rear=q;
                                q->next=NULL;
                                p=q=NULL;
                        }
                        
                }
                else if(((dir=='d')&&(Amatrix[front->x][front->y+1]=='|')||(Amatrix[front->x][front->y+1]=='X'))||((dir=='a')&&(Amatrix[front->x][front->y-1]=='|')||(Amatrix[front->x][front->y-1]=='X'))||((dir=='s')&&(Amatrix[front->x+1][front->y]=='-')||(Amatrix[front->x+1][front->y]=='X'))||((dir=='w')&&(Amatrix[front->x-1][front->y]=='-')||(Amatrix[front->x-1][front->y]=='X')))
                {//撞墙或者吃到自己就死
                        system("cls");//清屏
                        printf("******************************************************************************\n");
                        printf("*                                                                            *\n");
                        printf("*                                                                            *\n");
                        printf("*                                                                            *\n");
                        printf("*                               GAME OVER                                    *\n");
                        printf("*                                                                            *\n");
                        printf("*                                                                            *\n");
                        printf("******************************************************************************\n");
                        printf("                           Your score is %d                                   \n",score);
                        printf("                            屌丝梦工厂出品 (ˉ﹃ˉ)      copyright by Frost.\n");
                        printf("请输入你的名字:");
                        scanf("%s",name);
                        if(strcmp(name,love)==0)
                                printf("                            我喜欢你。                   \n");//这是我给女神的末日表白,虽然她没玩这游戏就是了
                        else
                            printf("%s ,战斗力只有5的孩子呀你威武雄壮!!(`_ ′)ゝ 5s后重开\n",name);
                        if(score>=20)
                                printf("话说你是开挂的吧?\n");
                        Sleep(5000);//game over 五秒后重开
                        goto loop;//跳到开头重新游戏
                }


                for(p=front;p!=NULL;p=p->next)
                    Amatrix[p->x][p->y]=p->body;//把蛇对应位置的部分赋值给数组
                if(flag==1)//如果已经吃了禁果就得重新生成一个
                        {
                            a.x=rand()%20+1;//保证禁果不越界   随机生成禁果的坐标
                            a.y=rand()%65+1;
                            if((a.x==0)||(Amatrix[a.x][a.y]=='X')||(Amatrix[a.x][a.y]=='H'))
                                    a.x=10;
                            if((a.y==0)||(Amatrix[a.x][a.y]=='X')||(Amatrix[a.x][a.y]=='H'))
                                    a.y=30;
                            Amatrix[a.x][a.y]='o';
                            flag=0;
                        }
            while(!kbhit())//如果没有输入,就按之前移动的方向继续前进
                {
                        Sleep(50);
                        if(('w'==dir)&&(Amatrix[front->x-1][front->y]!='-')&&(Amatrix[front->x-1][front->y]!='X'))
                        {
                            if(Amatrix[front->x-1][front->y]=='o')
                                {
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->x--;
                                        Sleep(30);
                                    score++;
                                    flag=1;
                                }
                            else
                                {
                                    p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->x--;
                                        Sleep(30);
                                    for(p=front;p!=rear;q=p,p=p->next);
                                    Amatrix[p->x][p->y]=' ';
                                    free(p);
                                    rear=q;
                                    q->next=NULL;
                                p=q=NULL;
                                
                                }
                        }
                    else if(('s'==dir)&&(Amatrix[front->x+1][front->y]!='-')&&(Amatrix[front->x+1][front->y]!='X'))
                        {
                            if(Amatrix[front->x+1][front->y]=='o')
                                {
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->x++;
                                        Sleep(30);
                                    score++;
                                    flag=1;
                                }
                            else
                                {
                    p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->x++;
                                        Sleep(30);
                                    for(p=front;p!=rear;q=p,p=p->next);
                                    Amatrix[p->x][p->y]=' ';
                                    free(p);
                                    rear=q;
                                    q->next=NULL;
                                    p=q=NULL;
                                }
                        }
                    else if(('a'==dir)&&(Amatrix[front->x][front->y-1]!='|')&&(Amatrix[front->x][front->y-1]!='X'))
                        {
                            if(Amatrix[front->x][front->y-1]=='o')
                                {
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->y--;
                                    score++;
                                    flag=1;
                                }
                            else
                                {
                                    p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->y--;
                                    for(p=front;p!=rear;q=p,p=p->next);
                                    Amatrix[p->x][p->y]=' ';
                                     free(p);
                                    rear=q;
                                    q->next=NULL;
                                    p=q=NULL;
                                }
                        }
                    else if(('d'==dir)&&(Amatrix[front->x][front->y+1]!='|')&&(Amatrix[front->x][front->y+1]!='X'))
                        {
                            if(Amatrix[front->x][front->y+1]=='o')
                                {
                                p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->y++;
                                    score++;
                                    flag=1;
                                }
                            else
                                {
                                    p=(struct Snake*)malloc(sizeof(struct Snake));
                                p->x=front->x;p->y=front->y;p->body='X';p->next=front->next;
                                front->next=p;front->y++;
                                    for(p=front;p!=rear;q=p,p=p->next);
                                    Amatrix[p->x][p->y]=' ';
                                    free(p);
                                    rear=q;
                                    q->next=NULL;
                                    p=q=NULL;
                                }
                        }
                    else if(((dir=='d')&&(Amatrix[front->x][front->y+1]=='|')||(Amatrix[front->x][front->y+1]=='X'))||((dir=='a')&&(Amatrix[front->x][front->y-1]=='|')||(Amatrix[front->x][front->y-1]=='X'))||((dir=='s')&&(Amatrix[front->x+1][front->y]=='-')||(Amatrix[front->x+1][front->y]=='X'))||((dir=='w')&&(Amatrix[front->x-1][front->y]=='-')||(Amatrix[front->x-1][front->y]=='X')))
                        {
                            system("cls");
                            printf("******************************************************************************\n");
                            printf("*                                                                            *\n");
                            printf("*                                                                            *\n");
                            printf("*                                                                            *\n");
                            printf("*                               GAME OVER                                    *\n");
                            printf("*                                                                            *\n");
                            printf("*                                                                            *\n");
                            printf("******************************************************************************\n");
                            printf("                           Your score is %d                                   \n",score);
                                printf("                            屌丝梦工厂出品 (ˉ﹃ˉ)      copyright by Frost.\n");
                                printf("请输入你的名字:");
                            scanf("%s",name);
                                if(strcmp(name,love)==0)
                                    printf("                              我喜欢你。                   \n");
                            else
                                    printf("%s ,不再来一发吗,少年(■ ▽■)y-~~  5s后重开\n",name);
                                if(score>=20)
                                    printf("话说你是开挂的吧?\n");
                                Sleep(5000);
                                goto loop;
                        }
                    if(flag==1)
                        {
                        a.x=rand()%20+1;
                            a.y=rand()%60+1;
                            if((a.x==0)||(Amatrix[a.x][a.y]=='X')||(Amatrix[a.x][a.y]=='H'))
                                     a.x=10;
                            if((a.y==0)||(Amatrix[a.x][a.y]=='X')||(Amatrix[a.x][a.y]=='H'))
                                    a.y=30;
                            Amatrix[a.x][a.y]='o';
                            flag=0;
                        }
                    for(p=front;p!=NULL;p=p->next)
                        Amatrix[p->x][p->y]=p->body;
                    system("cls");//把刚才的屏幕上的东西抹掉,再重新输出数组,就能产生蛇移动的效果
                    for(i=0;i<24;i++)
                        {
                                puts(Amatrix);
                        }
                        printf("↑=w,↓=s,←=a,→=d撞墙、自食或者逆行必死,按d开始,渣画面勿喷");
                }
            system("cls");
            for(i=0;i<24;i++)
                {
            puts(Amatrix);
                }
                printf("↑=w,↓=s,←=a,→=d撞墙、自食或者逆行必死,按d开始,渣画面勿喷");
    }
        return 0;
}[/mw_shl_code]

求糖.....

点评

相当年学C的时候。。。学的好浅  发表于 2013-1-22 14:54

评分

参与人数 4宅魂 +2 宅币 +34 贡献 +6 收起 理由
没糖给你了 + 1 + 3 发代码的都是好人。
维可vic + 1 + 3 o(* ̄▽ ̄*)ブ 学习了
_Nozomi + 26 + 6 Σ( ° △ °|||)︴ 碉堡了
低头摸节操君 + 2 →_→手滑 看不懂

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

签到天数: 17 天

连续签到: 1 天

[LV.4]偶尔看看III

298

主题

139

好友

6万

积分

荣誉会员

积分
66622
发表于 2012-12-21 12:56:48 | 显示全部楼层
怎么跑起来这么卡orz
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

21

主题

63

好友

1万

积分

第一章

积分
18553
发表于 2012-12-21 13:20:08 | 显示全部楼层
洋洋洒洒400多行代码了啊。。厉害
c我只会hello world 在怎么解啊
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 13:26:11 | 显示全部楼层

故意放慢了速度....其实可以把Sleep()里面的数字调小,会快一点,而且因为是不断输出的,所以会有点闪,但是比用printf好多了....第一次用printf输出我的钛合金狗眼直接瞎掉OTZ
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 13:26:31 | 显示全部楼层
moxiagy 发表于 2012-12-21 13:20
洋洋洒洒400多行代码了啊。。厉害
c我只会hello world 在怎么解啊

那你不是新手....你是刚入门....
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 17 天

连续签到: 1 天

[LV.4]偶尔看看III

298

主题

139

好友

6万

积分

荣誉会员

积分
66622
发表于 2012-12-21 13:45:02 | 显示全部楼层
lauyukit 发表于 2012-12-21 13:26
故意放慢了速度....其实可以把Sleep()里面的数字调小,会快一点,而且因为是不断输出的,所以会有点闪, ...

不错
其实我第一次写这种需要刷新的东西的时候就是用的printf……
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 13:46:51 | 显示全部楼层
Whisper1166 发表于 2012-12-21 13:45
不错
其实我第一次写这种需要刷新的东西的时候就是用的printf……

因为考虑到printf是个超复杂的函数 (那天我跪求printf宏定义等解释你懂的...)所以输出必然会比单纯的puts慢...所以果断用Puts了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 13:48:34 | 显示全部楼层
话说没想到把代码粘贴上去以后会这么乱.....我的错...OTZ

点评

我给你改了 现在看还可以 你刷新试试  发表于 2012-12-21 13:53
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 14:04:21 | 显示全部楼层
Whisper1166 发表于 2012-12-21 13:45
不错
其实我第一次写这种需要刷新的东西的时候就是用的printf……

谢版主...
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 17 天

连续签到: 1 天

[LV.4]偶尔看看III

298

主题

139

好友

6万

积分

荣誉会员

积分
66622
发表于 2012-12-21 15:40:58 | 显示全部楼层

那个printf("我喜欢你\n");亮了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 20:04:56 | 显示全部楼层
Whisper1166 发表于 2012-12-21 15:40
那个printf("我喜欢你\n");亮了

注释写了是怎么一回事= =#
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

31

好友

1万

积分

第一章

积分
12990
发表于 2012-12-21 20:06:27 | 显示全部楼层
printf输出的内容很是无语啊。。。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-21 20:56:06 | 显示全部楼层
baimuhao 发表于 2012-12-21 20:06
printf输出的内容很是无语啊。。。

那个无视好了= =#
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

0

好友

589

积分

New Game

积分
589
发表于 2012-12-22 11:08:42 | 显示全部楼层
好多亮点啊 哈哈
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

24

好友

1万

积分

第一章

积分
15224
 楼主| 发表于 2012-12-22 11:24:06 | 显示全部楼层
kwsing 发表于 2012-12-22 11:08
好多亮点啊 哈哈

还好吧....
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-7-2 02:37 , Processed in 0.112478 second(s), 26 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表