[i=s] 本帖最后由 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
Whisper1166 发表于 2012-12-21 13:45 不错 其实我第一次写这种需要刷新的东西的时候就是用的printf……因为考虑到printf是个超复杂的函数 (那天我跪求printf宏定义等解释你懂的...)所以输出必然会比单纯的puts慢...所以果断用Puts了
lauyukit 发表于 2012-12-21 13:26 故意放慢了速度....其实可以把Sleep()里面的数字调小,会快一点,而且因为是不断输出的,所以会有点闪, ...不错 其实我第一次写这种需要刷新的东西的时候就是用的printf……