刚学链表写的贪吃蛇=v=适合新手看
本帖最后由 Whisper1166 于 2012-12-21 12:59 编辑#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,name,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=' ';//先让二维数组全为空格
}
for(i=0,j=0;i<24;j++)
{
Amatrix='-';
if(70==j)
{
j=0;i+=23;
}
}
for(i=0;i<24;i++)
Amatrix='\0';
for(i=1;i<23;i++){
Amatrix='|';Amatrix='|';}//画框框
Amatrix='o';
Amatrix=front->body;//把对应位置的蛇身体的部分赋值给数组
Amatrix=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!='-')&&(Amatrix!='X'))//如果蛇没撞墙或者吃到自己
{
if(Amatrix=='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=' ';//把原来尾部的位置变成空格
free(p); //销毁尾部
rear=q; //尾部前移
q->next=NULL; //清空指针
p=q=NULL; //下面其他方向的就雷同了,其实能把重复的部分写成一个函数,看起来也简单点,不过撸主懒..
}
}
else if(('s'==dir)&&(Amatrix!='-')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(('a'==dir)&&(Amatrix!='|')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(('d'==dir)&&(Amatrix!='|')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(((dir=='d')&&(Amatrix=='|')||(Amatrix=='X'))||((dir=='a')&&(Amatrix=='|')||(Amatrix=='X'))||((dir=='s')&&(Amatrix=='-')||(Amatrix=='X'))||((dir=='w')&&(Amatrix=='-')||(Amatrix=='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->body;//把蛇对应位置的部分赋值给数组
if(flag==1)//如果已经吃了禁果就得重新生成一个
{
a.x=rand()%20+1;//保证禁果不越界 随机生成禁果的坐标
a.y=rand()%65+1;
if((a.x==0)||(Amatrix=='X')||(Amatrix=='H'))
a.x=10;
if((a.y==0)||(Amatrix=='X')||(Amatrix=='H'))
a.y=30;
Amatrix='o';
flag=0;
}
while(!kbhit())//如果没有输入,就按之前移动的方向继续前进
{
Sleep(50);
if(('w'==dir)&&(Amatrix!='-')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(('s'==dir)&&(Amatrix!='-')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(('a'==dir)&&(Amatrix!='|')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(('d'==dir)&&(Amatrix!='|')&&(Amatrix!='X'))
{
if(Amatrix=='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=' ';
free(p);
rear=q;
q->next=NULL;
p=q=NULL;
}
}
else if(((dir=='d')&&(Amatrix=='|')||(Amatrix=='X'))||((dir=='a')&&(Amatrix=='|')||(Amatrix=='X'))||((dir=='s')&&(Amatrix=='-')||(Amatrix=='X'))||((dir=='w')&&(Amatrix=='-')||(Amatrix=='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=='X')||(Amatrix=='H'))
a.x=10;
if((a.y==0)||(Amatrix=='X')||(Amatrix=='H'))
a.y=30;
Amatrix='o';
flag=0;
}
for(p=front;p!=NULL;p=p->next)
Amatrix=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;
}
求糖.....#im
怎么跑起来这么卡orz 洋洋洒洒400多行代码了啊。。厉害
c我只会hello world 在怎么解啊 Whisper1166 发表于 2012-12-21 12:56 static/image/common/back.gif
怎么跑起来这么卡orz
故意放慢了速度....其实可以把Sleep()里面的数字调小,会快一点,而且因为是不断输出的,所以会有点闪,但是比用printf好多了....第一次用printf输出我的钛合金狗眼直接瞎掉OTZ moxiagy 发表于 2012-12-21 13:20 static/image/common/back.gif
洋洋洒洒400多行代码了啊。。厉害
c我只会hello world 在怎么解啊
那你不是新手....你是刚入门.... lauyukit 发表于 2012-12-21 13:26 static/image/common/back.gif
故意放慢了速度....其实可以把Sleep()里面的数字调小,会快一点,而且因为是不断输出的,所以会有点闪, ...
不错
其实我第一次写这种需要刷新的东西的时候就是用的printf…… Whisper1166 发表于 2012-12-21 13:45 static/image/common/back.gif
不错
其实我第一次写这种需要刷新的东西的时候就是用的printf……
因为考虑到printf是个超复杂的函数 (那天我跪求printf宏定义等解释你懂的...)所以输出必然会比单纯的puts慢...所以果断用Puts了 话说没想到把代码粘贴上去以后会这么乱.....我的错...OTZ Whisper1166 发表于 2012-12-21 13:45 static/image/common/back.gif
不错
其实我第一次写这种需要刷新的东西的时候就是用的printf……
谢版主... lauyukit 发表于 2012-12-21 14:04 static/image/common/back.gif
谢版主...
那个printf("我喜欢你\n");亮了@@16!! Whisper1166 发表于 2012-12-21 15:40 static/image/common/back.gif
那个printf("我喜欢你\n");亮了
注释写了是怎么一回事= =# printf输出的内容很是无语啊。。。 baimuhao 发表于 2012-12-21 20:06 static/image/common/back.gif
printf输出的内容很是无语啊。。。
那个无视好了= =# 好多亮点啊 哈哈 kwsing 发表于 2012-12-22 11:08 static/image/common/back.gif
好多亮点啊 哈哈
还好吧....
页:
[1]
2