这是我今年学数据结构的时候,老师要求我们做的小课程设计,由于时间不够充分,因而小组想了一个简单的题目就做经典游戏“贪食蛇”,呵呵,只要用到数据结构就行,考虑到他们只能在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();
}