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

本帖最后由 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]

求糖.....#im

lauyukit
这个声明表示
展开Biu

南南 发表于 2012-12-22 14:28

fun(a, ……)

这个声明表示 第一个参数是a 是必须要有的 是固定的 后续参数可变

调用这个函数时 至少要有 ...

了解!

[查看全文]
南南
[i=s] 本帖最后由 南南 于 2012
展开Biu

本帖最后由 南南 于 2012-12-22 14:29 编辑

lauyukit 发表于 2012-12-22 14:03

哈哈哈哈想太多了我们才学了一学期不到C语言去不了那么深啦= =#

因为只是初学者所以只能弄个纯控制台—— ...

fun(a, ……)

这个声明表示 第一个参数是a 是必须要有的 是固定的 后续参数可变

调用这个函数时 至少要有一个参数

这里假设调用fun时 a变量储存需要读取的表示参数个数

因为就算是可变参数的函数 也要知道待读取的参数的个数 这个一般是隐含在固定参数里传递的

比如 printf中 有几个% 就有需要读取的几个无名参数

所以这个循环只是举个例子 根据提供的参数个数 读可变参数

[查看全文]
lauyukit
看来是纯控制台啊
展开Biu

南南 发表于 2012-12-22 13:50

看来是纯控制台啊

第一眼看见熟悉的windows.h

哈哈哈哈想太多了我们才学了一学期不到C语言去不了那么深啦= =#

因为只是初学者所以只能弄个纯控制台——我觉得我能写出来已经够神奇了

话说上次你给我写的那个myprintf

int *p = &a;

for(int i = 0; i < a; ++i)//这里我看不懂....i<a是什么意思?

{

*++p;

……其它操作

}

[查看全文]
南南
看来是纯控制台啊 第一眼看见熟悉的w
展开Biu

看来是纯控制台啊

第一眼看见熟悉的windows.h

我还以为乃和我一样跳进了WinSDK的苦海

果然是我想多了

[查看全文]
lauyukit
我觉得技宅有必要加个代码一键复制的按钮
展开Biu

南南 发表于 2012-12-22 13:47

……

…………

我觉得技宅有必要加个代码一键复制的按钮

同感....下次上传文件好了....

[查看全文]
南南
…… ………… 我觉得技宅有必要加个代
展开Biu

……

…………

我觉得技宅有必要加个代码一键复制的按钮

[查看全文]
lauyukit
好多亮点啊
展开Biu

kwsing 发表于 2012-12-22 11:08

好多亮点啊 哈哈

还好吧....

[查看全文]
kwsing
好多亮点啊 哈哈
展开Biu

好多亮点啊 哈哈

[查看全文]