Febird's Sky

Search & Research & Find
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

今年数据结构小课题,C语言贪食蛇游戏设计

Posted on 2007-12-04 21:33  febird  阅读(1050)  评论(0)    收藏  举报
 

这是我今年学数据结构的时候,老师要求我们做的小课程设计,由于时间不够充分,因而小组想了一个简单的题目就做经典游戏“贪食蛇”,呵呵,只要用到数据结构就行,考虑到他们只能在BorlandC下面开发而且我们学的也是C语言版数据结构,所以还是在BC下面用经典C语言开发的,在两三天的时间内,我完成了绝大多数代码,现在将他们发在这里,供新手参考。

主要功能:实现基本的贪食蛇功能,能吃东西生体增长,能撞墙(包括撞自己)而死,实现积分,计时功能,实现界面大小调节,游戏区域行列增减,关数调节,还有随机生成障碍物等等

为了不让页面过长,只写出了部分源代码,需要看到全部的,可以在也面底部下载

 

//////////////////////////////////////////////////////

///Author:Febird 2007

/// S.H (头文件定义,包括结构定义等等)

//////////////////////////////////////////////////////

   

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <time.h>

#include <string.h>

#include <graphics.h>

#include <bios.h>

#include <dos.h>

#include <math.h>

#include<fcntl.h>

#include<io.h>

   

   

#define SCR_WIDTH 640

#define SCR_HEIGHT 480

#define BG 15

#define BG_LINE BLUE

#define SNAKE_COLOR RED

#define FOOD_COLOR BLUE

#define WALL_COLOR GREEN

   

#define D_UP 0

#define D_DOWN 1

#define D_LEFT 2

#define D_RIGHT 3

   

#define KEY_UP 0x4800

#define KEY_DOWN 0x5000

#define KEY_LEFT 0x4b00

#define KEY_RIGHT 0x4d00

#define KEY_ESC 0x11b

#define KEY_ENTER 0x1c0d

#define KEY_SPACE 0x3920

#define KEY_P 0x1970

#define KEY_F1 0x3b00

#define KEY_F2 0x3c00

#define KEY_F3 0x3d00

#define KEY_F4 0x3e00

#define KEY_F5 0x3f00

#define KEY_F6 0x4000

#define KEY_F7 0x4100

#define KEY_F8 0x4200

   

typedef struct _point

{

  int x;

  int y;

  int color;

} Point;

   

typedef struct _snakenode

{

  Point point;

  struct _snakenode * next;

} SnakeNode;

typedef struct _wall

{

 Point point;

 int dirct;//horizon 0 and stand-up 1

 int length;

} Wall;

   

typedef struct _grid

{

  int col;

  int row;

  int pix;

  int color;

  int b_width;

  int b_color;

} Grid;

   

   

void GridInit(void);

void GridColor(int ,int ,int );

SnakeNode *InitSnake(int,int,int);

SnakeNode *CreateSnakeList();

SnakeNode *NewNode(SnakeNode*,Point);

int IndexOf(SnakeNode *,Point);

SnakeNode *GetNode(SnakeNode *,int);

int GetListLength(SnakeNode *);

int DelLastNode(SnakeNode *);

Point CreateFood(SnakeNode *,SnakeNode*);

int MoveSnake(SnakeNode *,Point,SnakeNode *,int,Point *);

int IsEatFood(Point ,Point);

int IsHitWall(SnakeNode * ,Point );

int IsHitEdge(Point );

int IsHitSelf(SnakeNode *,Point);

void Message(char *);

void SnakeInfo(int ,int);

void InitGraph(void);

void ShowTime(struct time,struct time);

SnakeNode *CreateWall(int);

int HowFar(Point ,Point);

void ZoomGraph(int );

void display_bmp16(char *,unsigned ,unsigned );

   

//////////////////////////////////////////////////////

///Author:Febird 2007

/// S_LIST.CPP (基本数据结构【链表】的实现)

//////////////////////////////////////////////////////

#include "s.h"

   

SnakeNode *CreateSnakeList()

{

SnakeNode * end;

end=(SnakeNode *)malloc(sizeof(SnakeNode));

(*end).next='\0';

return end;

   

}

   

   

SnakeNode *NewNode(SnakeNode *sn,Point p)

{

  SnakeNode *new_node;

  new_node=(SnakeNode *)malloc(sizeof(SnakeNode));

  new_node->point.x=p.x;

  new_node->point.y=p.y;

  new_node->next=sn;

  return new_node;

   

}

   

   

int DelLastNode(SnakeNode *sn)

{

  SnakeNode *s;

  for(s=sn;s->next!='\0';s=s->next)

  {

   if(s->next->next=='\0') break;

  }

   

  SnakeNode *trah=s->next;

  s->next='\0';

  free(trah);

  return 0;

   

}

   

int GetListLength(SnakeNode *sn)

{

  SnakeNode *s;

   

  int i=0;

  for(s=sn;s->next!='\0';s=s->next)

  {

   i++;

  }

  return i;

   

}

   

int IndexOf(SnakeNode *sn,Point p)

{

   SnakeNode *s;

   int i=0;

   for(s=sn;s->next!='\0';s=s->next)

   {

     if(p.x==s->point.x&&p.y==s->point.y) return i;

     else i++;

   }

   if(i>=GetListLength(sn))  return -1;

   return i;

}

   

SnakeNode * GetNode(SnakeNode *sn,int index)

{

  SnakeNode *s=sn;

  if(index>GetListLength(sn)-1) return NULL;

  else

  {

    int i;

    for(i=0;i<index;i++)

    {

      s=s->next;

    }

    return s;

  }

}

   

   

//////////////////////////////////////////////////////

///Author:Febird 2007

/// S_Main.CPP (程序主函数函数)

//////////////////////////////////////////////////////

#include "s.h"

   

extern Grid GD;

   

void main()

{

   SnakeNode* snake;

   Point food,*next;

   SnakeNode* wall;

   struct time _t,start_t;

   int direct;

   int key;

   int level=1;

   int deadflag=0;

   int stopflag=0;

   int levelbase=20;

   int startlength=5;

   int tempdirect;

   InitGraph();

   

   while(1)

   {

   deadflag=0;

   stopflag=0;

   GridInit();

   snake=InitSnake(0,1,startlength);

   wall=CreateWall(level);

   

   Message("Enter-Strat,Esc-Exit,F1,F2-Level,F3~F8-Zoom");

   SnakeInfo(GetListLength(snake)-startlength,level);

   

   

   while(1)

   {

    int skey=bioskey(0);

    if(skey==KEY_ESC)

    {exit(0);break;}

    else if(skey==KEY_ENTER||skey==KEY_SPACE)

    {

     gettime(&start_t);

     ShowTime(start_t,start_t);

     break;

    }else if(skey==KEY_F1)

    {

   

      if(level>=20)

      level=1;

      else level++;

   

    }

    else if(skey==KEY_F2)

    { if(level<=1)

      level=20;

      else level--;

    }

    else

    {

      ZoomGraph(skey);

      GridInit();

      snake=InitSnake(0,1,startlength);

      wall=CreateWall(level);

      Message("Press Enter to Strat,Esc to Exit");

    }

    SnakeInfo(GetListLength(snake)-startlength,level);

   

   }

   

   

   food=CreateFood(snake,wall);

   Message("Press ESC to Exit,Space to Pause");

   SnakeInfo(GetListLength(snake)-startlength,level);

   

   direct=D_RIGHT;

   while(1)

   {

     while(!bioskey(1)&&stopflag==0&&deadflag==0)

     {

   

      int status=MoveSnake(snake,food,wall,direct,next);

      if(status==1)/*eat food and return*/

      {

       snake=NewNode(snake,*next);

       food=CreateFood(snake,wall);

       int foodcount=GetListLength(snake)-startlength;

       SnakeInfo(foodcount,level);

       if(foodcount>=levelbase)

       {

        deadflag=1;

        level++;

        Message("Congratunations ! Press Enter To Next Level!");

        break;

       }

   

      }

      else if(status==2)/*do not eat food and return*/

      {

      snake=NewNode(snake,*next);

      DelLastNode(snake);

      }

      else if(status==0)

       {deadflag=1;

       Message("Game Over! Press Enter to Restart Esc To Exit");

        break;}

      delay(200-level*9);

      gettime(&_t);

      ShowTime(_t,start_t);

   

     }//end while 3

   

      key=bioskey(0);

     if(deadflag==0)

     {

      switch(key)

      {

       case KEY_UP:{if(direct!=D_DOWN)direct=D_UP;break;}

       case KEY_DOWN:{if(direct!=D_UP)direct=D_DOWN;break;}

       case KEY_LEFT:{if(direct!=D_RIGHT)direct=D_LEFT;break;}

       case KEY_RIGHT:{if(direct!=D_LEFT)direct=D_RIGHT;break;}

       default:tempdirect=direct;direct=-1;break;

      }

     }else direct=-1;

   

     if(direct==-1)

     {

       if(key==KEY_ESC)

       { break; }

       else if(key==KEY_SPACE)

       {

       if(stopflag==0)

          stopflag=1;

       else stopflag=0;

       }

       else if(deadflag==1&&key==KEY_ENTER)

       {

       deadflag=0;

       break;

       }

       direct=tempdirect;

     }

   

   }//end while 2

   

  }//end while 1

   

  closegraph();

   

   

}

   

   

   

   

   

   

   

   

   

点击此处下载源代码