TC下的贪吃蛇

    技术2024-10-16  3

    我大一新生,上学期学的c。。。还记得国庆时编了个字符版贪吃蛇!好久没变程序了,,,这次又编了个图形版,,,高手见笑,大家不吝赐教。

     

    /*time:2011/1/28-2011/1/30by:cloudabout:  上下左右:wsad控制,p退出游戏*/

    #include <stdio.h>#include <conio.h>#include <bios.h>#include <stdlib.h>#include <graphics.h>#define LEN sizeof(struct Node)

    /*定义方向键*/#define UP        'w'#define DOWN   's'#define LEFT     'a'#define RIGHT   'd'#define PAUSE   'l'#define EXIT     'p'

    /*定义图框*/#define MaxX 44#define MaxY 44#define XOFFSET 170#define YOFFSET 1#define NODELENGTH 10#define NODEWIDTH 10#define PATH "d://tc201e//bgi"

    struct Node{ int x,y; struct Node *Next; }; struct Snack{ struct Node *Head; struct Node *Tail; char Direction; int Length; }; struct Food{ int x,y; }; /*global various*/struct Snack Snack;struct Food Food;int Score;int MoveTimes;int X,Y;                           /*用于储存蛇尾,方便吃食物*/long Difficulty;   /*控制难度*/int PrintRectangle;   /*控制绘制边框,防止每次绘制闪动*/int PrintFood;    /*控制绘制食物,防止每次绘制闪动*/ /*suborutines*/

    int main(){ /*蛇的行为*/ int EatFood();    /*吃食物,变长*/ int Move();    /*移动蛇身*/ int DeadOrNot();   /*判断生死,  return 1 means true*/  /*食物的行为*/ int MakeNewFood();  /*出现新食物*/ int ThereIsFood();  /*return 1 means true*/ int FoodInBody();   /*return 1 means true*/  /*运行需要的函数*/ int Init();                      /*初始化程序*/ int DrawScreen();   /*绘制屏幕*/ int PlayGame(); int EndOfGame();    Init(); PlayGame(); EndOfGame(); return 0; } Init(){ int gdriver=DETECT,gmode;  Score=0;MoveTimes=0; Difficulty=40000; PrintRectangle=1;  Snack.Direction=RIGHT; Snack.Length=3; Snack.Head=(struct Node *)malloc(LEN); Snack.Head->x=2;Snack.Head->y=4; Snack.Head->Next=(struct Node *)malloc(LEN); Snack.Head->Next->x=1;Snack.Head->Next->y=4; Snack.Head->Next->Next=(struct Node *)malloc(LEN); Snack.Tail=Snack.Head->Next->Next; Snack.Tail->Next=NULL; Snack.Tail->x=0;Snack.Tail->y=4;  MakeNewFood();  registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,PATH); DrawScreen(); }  int PlayGame(){ char key;                      /*输入键值*/

     while(1) {  if(bioskey(1))  {   key=bioskey(0);   switch(key)   {    case UP:     if(Snack.Direction!=DOWN) Snack.Direction=key; break;    case DOWN:     if(Snack.Direction!=UP) Snack.Direction=key; break;    case RIGHT:     if(Snack.Direction!=LEFT) Snack.Direction=key; break;    case LEFT:     if(Snack.Direction!=RIGHT) Snack.Direction=key; break;    case PAUSE:     cleardevice();outtextxy(230,240,"Pause,press any key to continue!");PrintRectangle=1;PrintFood=1;getch();cleardevice();DrawScreen();break;    case EXIT:     return 0;    }   }   Move();   if(DeadOrNot())    return 0;   MoveTimes++;                                            /*未死时增加的移动次数*/   X=Snack.Tail->x;   Y=Snack.Tail->y;   if(ThereIsFood())   {    EatFood();    MakeNewFood();    }   DrawScreen();   delay(Difficulty);   if(Score>100)    Difficulty=25000;   if(Score>200)    Difficulty=15000;  } } int MakeNewFood(){ do { srand((unsigned int)time(NULL)); Food.x=rand()%MaxX; Food.y=rand()%MaxY;  }while(FoodInBody()); PrintFood=1; return 0; }

    int FoodInBody(){ struct Node *p; p=Snack.Head; while(p!=NULL) {  if(p->x==Food.x&&p->y==Food.y)   return 1;  p=p->Next;  } return 0; } int ThereIsFood(){ if(Snack.Head->x==Food.x&&Snack.Head->y==Food.y)  return 1; return 0; } int EatFood(){ /*去除食物图形*/ setfillstyle(EMPTY_FILL, BLACK);                                                                /*设置作图颜色*/ bar(XOFFSET+(Food.x)*NODEWIDTH+1,YOFFSET+(Food.y)*NODELENGTH+1,XOFFSET+(Food.x+1)*NODEWIDTH-1,YOFFSET+(Food.y+1)*NODELENGTH-1);  Snack.Tail->Next=(struct Node *)malloc(LEN); Snack.Tail=Snack.Tail->Next; Snack.Tail->x=X; Snack.Tail->y=Y; Snack.Tail->Next=NULL; Snack.Length++; Score=Score+10; return 0; } int DeadOrNot(){ struct Node *p; if(Snack.Head->x>=MaxX || Snack.Head->x<0 ||Snack.Head->y>=MaxY || Snack.Head->y<0)  return 1; p=Snack.Head; while(p!=Snack.Tail) {  p=p->Next;  if(p->x==Snack.Head->x && p->y==Snack.Head->y)   return 1;  } return 0; } int Move(){ struct Node *p; int NewX,NewY,Temp; p=Snack.Head->Next; NewX=Snack.Head->x; NewY=Snack.Head->y;   while(p!=NULL) {  Temp=p->x;  p->x=NewX;  NewX=Temp;    Temp=p->y;  p->y=NewY;  NewY=Temp;    p=p->Next;   }   /*去除已绘尾部*/ setcolor(BLACK);                                                                /*设置作图颜色*/ rectangle(XOFFSET+NewX*NODEWIDTH,YOFFSET+NewY*NODELENGTH,XOFFSET+(NewX+1)*NODEWIDTH,YOFFSET+(NewY+1)*NODELENGTH);   switch(Snack.Direction) {  case UP:   Snack.Head->y--;break;  case DOWN:   Snack.Head->y++;break;  case RIGHT:   Snack.Head->x++;break;  case LEFT:   Snack.Head->x--;break;  default:   printf("Error");getch();return -1;  } return 0; } int DrawScreen(){ struct Node *p; p=Snack.Head;  /*设计框架*/ /*============================================================================================*/ if(PrintRectangle) {  setcolor(BLUE);                                                                /*设置作图颜色*/  rectangle(XOFFSET-1,YOFFSET-1,XOFFSET+MaxX*NODEWIDTH+1,YOFFSET+MaxY*NODELENGTH+1);    setcolor(MAGENTA);                                                                /*设置作图颜色*/  rectangle(XOFFSET,YOFFSET+MaxY*NODELENGTH+10,XOFFSET+MaxX*NODEWIDTH,479);    setcolor(YELLOW);                                                                /*设置作图颜色*/  line(XOFFSET-10,0,XOFFSET-10,479);  line(XOFFSET+MaxX*NODEWIDTH+10,0,XOFFSET+MaxX*NODEWIDTH+10,479);  PrintRectangle=0;  outtextxy(0,30,"Time:"); outtextxy(0,40,"2010/1/30"); outtextxy(0,80,"By:"); outtextxy(0,90,"Cloud"); outtextxy(0,130,"About:"); outtextxy(0,140,"Press W:UP"); outtextxy(0,160,"Press S:DOWN"); outtextxy(0,180,"Press A:LEFT"); outtextxy(0,200,"Press D:RIGHT"); outtextxy(0,220,"Press L:PAUSE"); outtextxy(0,240,"Press P:EXIT"); outtextxy(0,280,"CopyRight By Cloud"); outtextxy(0,310,"My E-mail:"); outtextxy(0,320,"hu_jun@yeah.net"); outtextxy(0,340,"Introduction:"); outtextxy(0,350,"Green:snack head~"); outtextxy(0,370,"Brown:other bodies~"); outtextxy(0,390,"Yellow:Food!"); outtextxy(0,430,"Last:"); outtextxy(0,440,"Happy Play~ :)");  }  /*=============================================================================================*/    if(PrintFood) {  setfillstyle(SOLID_FILL, YELLOW);                                                                /*设置作图颜色*/  bar(XOFFSET+(Food.x)*NODEWIDTH+1,YOFFSET+(Food.y)*NODELENGTH+1,XOFFSET+(Food.x+1)*NODEWIDTH-1,YOFFSET+(Food.y+1)*NODELENGTH-1);  PrintFood=0;  } setcolor(GREEN);                                                                /*设置作图颜色*/ rectangle(XOFFSET+(p->x)*NODEWIDTH,YOFFSET+(p->y)*NODELENGTH,XOFFSET+(p->x+1)*NODEWIDTH,YOFFSET+(p->y+1)*NODELENGTH); setcolor(BROWN);                                                                /*设置作图颜色*/ while(p!=Snack.Tail) {  p=p->Next;  rectangle(XOFFSET+(p->x)*NODEWIDTH,YOFFSET+(p->y)*NODELENGTH,XOFFSET+(p->x+1)*NODEWIDTH,YOFFSET+(p->y+1)*NODELENGTH);  }  return 0; } int EndOfGame(){ struct Node *p1,*p2; char *str;  cleardevice(); PrintRectangle=1; PrintFood=1; DrawScreen();

     setcolor(YELLOW); if(Score<=150) {  sprintf(str, "What a pity,ur score is only %d,and u move %d.", Score,MoveTimes);  outtextxy(XOFFSET,YOFFSET+MaxY*NODELENGTH+20,str);  } else if(Score>150&&Score<=250) {  sprintf(str, "Good Job,ur score is %d,and u move %d.", Score,MoveTimes);  outtextxy(XOFFSET,YOFFSET+MaxY*NODELENGTH+20,str);  } else {  sprintf(str, "Congratulations,ur score reached %d,move %d,hold on!:)", Score,MoveTimes);  outtextxy(XOFFSET,YOFFSET+MaxY*NODELENGTH+20,str);  } getch();

     p1=Snack.Head; while(p1!=NULL) {  p2=p1->Next;  free(p1);  p1=p2;  } closegraph();  return 0; } 

    最新回复(0)