c语言贪食蛇

来源:互联网 发布:女生必知防身方法 编辑:程序博客网 时间:2024/05/16 06:41

这个代码是我学完c语言不久后写的,所以代码质量会比较差

#include<stdio.h>#include<windows.h>#include<time.h>#include<stdlib.h>#include<conio.h>#include<张特色彩.h>struct Body//定义蛇身结构体{short x,y;//蛇身的坐标struct Body *next;//指向下一个蛇身的指针};struct Body *head;//蛇头指针int length=sizeof(struct Body);//Body结构体所占字节数int Delay=250;//每次移动之后的停顿时间short X=0,Y=0;//判断蛇每次移动short food_x,food_y,food=0;//食物坐标与是否有食物short life=1;short score=0;char movdir='R';//蛇头方向'U'-up,'D'-down,'L'-left,'R'-rightvoid Loc(int, int);//光标定位函数void Beginning();//开始界面void CreatMap();//创建地图void GameInit();//游戏初始化void GameStart();//游戏开始void DeadOrNo();//蛇的生命void MakeFood();//制造食物void ThroWall();//蛇可穿墙void SnakeMove();//蛇的移动和下面两个函数一起运用void MoveNo(struct Body *p_body,struct Body *nofood);//没有食物时蛇的移动void MoveYes(struct Body *yesfood);//有食物时蛇的移动void DrawSnake();//画蛇void Ending();//结束界面int main(void)//主函数{system("color 5f");HANDLE color;color=GetStdHandle(STD_OUTPUT_HANDLE);RED_WHITE;//输出全变为绿色,绿油油的小蛇Beginning();//开始欢迎界面GameInit();//界面初始化GameStart();//游戏开始Ending();//结束界面while(getch()!=27)//按ESC键退出游戏(蛇死亡之后);Loc(25,24);return 0;}void Beginning()//开始界面{system("title 张特的贪吃蛇");int initx=14,inity=11,init=2;//下面printf字开始右移的初始位置,init代表左右方向char ch1='\0';time_t start,end;start=time(NULL);end=time(NULL);Loc(23,24);puts("Designed by Ruin,2013.11.5 21:28");while(end-start<start&&ch1!=13)//时间差小于start一直循环{end=time(NULL);Loc(initx,inity);printf("大家按ENTER键开始贪吃蛇之旅吧!");Sleep(Delay);Loc(initx,inity);printf("                                    ");if(init>0&&initx>=40||initx==0&&init<0)init*=-1;initx+=init;if(kbhit())//有键盘输入时接受若是13(ENTER)键结束循环ch1=getch();}system("cls");}void CreatMap()//创造地图{for(int i=0;i<=56;i+=2)//上下边框{Loc(i,0);RED_WHITE;printf("□");Loc(i,24);RED_WHITE;printf("□");}for(i=0;i<=24;i++)//左右边框{Loc(0,i);printf("□");Loc(56,i);printf("□");}}void GameInit()//游戏初始化,创建链表与初始化蛇身,初始化地图{ CreatMap();struct Body *body2,*body3,*body4;//定义四个蛇身指针head=(struct Body *)malloc(length);body2=(struct Body *)malloc(length);body3=(struct Body *)malloc(length);body4=(struct Body *)malloc(length);//为其分配空间head->next=body2;body2->next=body3;body3->next=body4;body4->next=NULL;//首尾相连,形成链表,body4为蛇尾Loc(65,3);puts("吃一个白点");Loc(64,4);puts(" 蛇就会加速\n");Loc(61,13);puts("控制请按: ↑←↓→");//不会变的游戏提示Loc(head->x=16,head->y=6);   printf("□");Loc(body2->x=14,body2->y=6);printf("□");Loc(body3->x=12,body3->y=6);printf("□");Loc(body4->x=12,body4->y=6);printf("□");//初始化蛇身位置}void GameStart()//游戏开始{ int d2,e2,f2; while(1){tm mytime; _getsystime(&mytime); d2=mytime.tm_hour;e2=mytime.tm_min;f2=mytime.tm_sec;system("color 4F");//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DeadOrNo();if(life==0)//当生命为0时蛇死亡,退出游戏break;ThroWall();MakeFood();//制造食物if(GetAsyncKeyState(VK_UP)&&movdir!='D')//四个if判断是否有方向键输入movdir='U';else if(GetAsyncKeyState(VK_DOWN)&&movdir!='U')movdir='D';else if(GetAsyncKeyState(VK_LEFT)&&movdir!='R')movdir='L';else if(GetAsyncKeyState(VK_RIGHT)&&movdir!='L')movdir='R';SnakeMove();//蛇的移动,每次移动一格Loc(62,7); printf("你的  得分: %2d",score);//定位,打出所得分数Loc(62,10); printf("你的  速度: %2d\n",Delay);//定位,打出即时速度,越小越快         Loc(62,16); BLUE_WHITE;printf("               "); Loc(62,17); printf("    张特制作   ");Loc(62,18); printf("               "); Loc(62,19); printf("    ");if(d2<10)               printf("0%d:",d2);               else printf("%d:",d2);               if(e2<10)               printf("0%d:",e2);               else printf("%d:",e2);                if(f2<10)                printf("0%d",f2);              else printf("%d",f2);printf("   ");Loc(62,20); printf("               ");Sleep(Delay);//刷新一次的速度}}void DeadOrNo()//判断蛇死没死{struct Body *p_body=head;while(p_body->next!=NULL)//定位到最后一个蛇身{p_body=p_body->next;if(p_body->x==head->x&&p_body->y==head->y)//如果有任何一个蛇身坐标与蛇头重合,蛇即死亡life=0;}}void MakeFood()//制造食物{if(food==0){srand((unsigned int)time(NULL));//随即种子food_x=rand()%53+2;food_y=rand()%23+1;if(food_x%2==1)food_x++;//如果坐标为奇数,变为偶数坐标food=1;Loc(food_x,food_y);RED_WHITE;  printf("●");}}void ThroWall()//穿墙{if(head->x==56)//右进左出head->x=2;if(head->x==0)//左进右出head->x=54;if(head->y==0)//上进下出head->y=23;if(head->y==24)//下进上出head->y=1;}void SnakeMove()//蛇的移动与吃食物,其实就这段最难写{struct Body *p_body;//临时结构指针struct Body *nofood;//没食物struct Body *yesfood;//有食物nofood=(struct Body *)malloc(length);//为没食物分配空间if(movdir=='U')//上移{if(head->x==food_x&&head->y-1==food_y)//下一格有食物MoveYes(yesfood);else{X=0;Y=-1;//没食物时的移动方向与格数MoveNo(p_body,nofood);}}if(movdir=='D')//下移{if(head->x==food_x&&head->y+1==food_y)//上一格有食物MoveYes(yesfood);else{X=0;Y=1;//没食物时的移动方向与格数MoveNo(p_body,nofood);}}if(movdir=='L')//左移{if(head->x-2==food_x&&head->y==food_y)//左一格有食物MoveYes(yesfood);else{X=-2;Y=0;//没食物时的移动方向与格数MoveNo(p_body,nofood);}}if(movdir=='R')//右移{if(head->x+2==food_x&&head->y==food_y)//右一格有食物MoveYes(yesfood);else{X=2;Y=0;//没食物时的移动方向与格数MoveNo(p_body,nofood);}}HANDLE color;  RED_WHITE;//画出绿色蛇DrawSnake();//画蛇}void MoveYes(struct Body *yesfood)//有食物的移动{yesfood=(struct Body *)malloc(length);//每次调用都要为其分配空间,因为每次吃到了食物蛇身会长一节,必须为蛇身在分配一个空间yesfood->x=food_x;yesfood->y=food_y;yesfood->next=head;//新结构拥有了蛇吃完食物的空间head=yesfood;//在赋给头指针food=0; score+=1; //加分MakeFood();//制造食物if(Delay>200)Delay-=5;if(Delay<=200&&Delay>150)Delay-=7;if(Delay>=100&&Delay<=150) Delay-=10;//加速}void MoveNo(struct Body *p_body,struct Body *nofood)//没食物的移动{nofood->x=head->x+X;nofood->y=head->y+Y;nofood->next=head;head=nofood;//同上p_body=head;while((p_body->next)->next!=NULL)//使p_body指向倒数第二个蛇身p_body=p_body->next;Loc((p_body->next)->x,(p_body->next)->y);//定位到最后一节蛇身printf("  ");//消除蛇身free(p_body->next);//释放空间p_body->next=NULL;//使倒数第二节成为新的蛇尾}void DrawSnake()//画出蛇头到蛇尾{struct Body *p_body=head;//指向蛇头while(p_body!=NULL)//当p_body指向最后一节跳出{Loc(p_body->x,p_body->y);printf("□");p_body=p_body->next;}}void Ending()//结束界面{int num=0;char str[]={"        thank you very much"};system("cls");Loc(32,9);printf("Game Over!!");while(str[num]!='\0'){Loc(20+num,11);putchar(str[num]);num++;Sleep(100);}Loc(30,13);puts("按两次ESC键退出!");Loc(22,22);puts("张特设计于2013.11.30 21:28");}void Loc(int x, int y)//x为列坐标,y为行坐标,这个不用说了吧~{COORD pos = {x,y};HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut, pos);}//Designed by Ruin,2013.11.5 21:28


0 0
原创粉丝点击