TYCY 发表于 2008-2-20 09:09:55

【贪吃小精灵】V1.5版发布!【含源码】【3.10更新】

【游戏名称】: 【贪吃小精灵】
【游戏作者】: TYCY(Too)
【开发平台】: NC2600C
【游戏版本】: V1.5
【运行平台】: Lava All
【游戏说明】:游戏上有说明

这个游戏是我在其他机器上玩过的,不知道是DVD上还是BBV的游戏
一时兴起就做了,本来想做成仿灰度的,但是由于自己美工问题(竹子在做其他),还有就是图素小,图快多,整体刷会导致速度慢很多!
所以我只能把精灵很敌人的图片弄成灰度(我自己认为的,不知道象不象)
敌人AI中等.

修正点,小的BUG
按"R" 刷新屏幕,“B” 播放录像(仅限当局)
S:存储录像
L:载入录像
S和L合用,可以达到存档效果(你先储存,在读取)

//=====================================

下面是源码,游戏包里也有!
//=========================================

//========宏值定义========
//--------GameSub--------
#define Game_Start 0
#define Game_Exit 1
#define Game_Win 2
#define Game_Lose 3
#define Game_Init 4
#define Game_Help 5
#define Game_Pause 6
//--------Map-------
#define MapX 20 // 地图宽
#define MapY 10 // 地图高
//--------Pic-------
#define BlockX 8 // 图素宽
#define BlockY 8 // 图素高
//--------Key--------
#define Up_Key 20
#define Down_Key 21
#define Right_Key 22
#define Left_Key 23
#define Help_Key 25
#define Esc_Key 27
#define Pause_Key 32
#define Update_Key 'r'// 更新屏幕
#define SaveVdo_Key 's' // 储存录象
#define LoadVdo_Key 'l' // 载入录象
#define PlayVdo_Key 'b' // 播放录象
//--------Init--------
#define Mx_Start BlockX*6
#define My_Start BlockY*(MapY-2)
#define Ex_Start_0 BlockX*(MapX-1)
#define Ey_Start_0 BlockY*1
#define Ex_Start_1 BlockX*0
#define Ey_Start_1 BlockY*1
#define Ex_Start_2 BlockX*1
#define Ey_Start_2 BlockY*7
//--------MapDat--------
#define Blank 0
#define Food 1
#define Black 2
#define My_0 3
#define My_1 4
#define Enemy_0 5
#define Enemy_1 6
//--------PicDat--------
#define Blank_Pic 0 // 空白
#define Food_Pic 1 // 食物
#define Black_Pic 2 // 墙壁
#define MyPic_Pic 3 // 精灵
#define Enemy_Pic 5 // 敌人
//--------Max-------
#define PicNumMax 7 // 图素个数
#define FoodNumMax 88 // 食物个数
#define EnemyNumMax 3 // 敌人最大个数
#define MapDatSize MapX*MapY
#define VdoSize 300
//--------OffSet--------
#define PicDat_OffSet 0
#define MapDat_OffSet 56
//--------Time--------
#define Delay_Time 32
//--------Call--------
#define Enemy 0
#define My    1
//--------Ai--------
#define Ai 3 // 敌人AI(值越高越聪明)
//========变量定义========
struct Dat
{
char n;
int x;
int y;
};
struct Dat M;
struct Dat E;
char EnemyNum;
char FoodNum;
char EatFoodNum;
char Dir;
char Str;
char IfChange; // 用于AI中判断是否改变方向
char PicDat;
char MapDat;
char SaveMapDat;
char VdoDat;
int VdoNum;
int Move_X={0,0,1,-1};
int Move_Y={-1,1,0,0};
//========函数定义========
char GetKey()
{
char key;
key=0;
while(!key)
{
key=CheckKey(128);
}
return (key);
}
void ShowPic(char ix,char iy,char id,char in)
{
if(id>PicNumMax)
{
id=Blank_Pic;
}
WriteBlock(ix,iy,BlockX,BlockY,1,PicDat);
}
void ShowMyPic(int ix,int iy)
{
ShowPic(ix,iy,MyPic_Pic,M.n++);
if(M.n==2)
{
M.n=0;
}
}
void ShowEnemy(int ix,int iy,char in)
{
ShowPic(ix,iy,Enemy_Pic,E.n++);
if(E.n==2)
{
E.n=0;
}
}
void ShowMap()
{
char i,j;
for(j=0;j<MapY;j++)
{
for(i=0;i<MapX;i++)
{
   ShowPic(i*BlockX,j*BlockY,MapDat,0);
}
}
}
char ShowTxt(char ix,char iy,int is,char itype,char imode)
{
char Len;
Len=strlen(is)*6;
if(!itype | !Len | ix>160 | iy>80)
{
return (0);
}
if(!ix & !iy)
{
Block(80-(Len>>1)-2,31,(Len>>1)+82,48,itype-1);
Rectangle(80-(Len>>1)-1,32,(Len>>1)+81,47,itype);
TextOut(80-(Len>>1),34,is,itype);
}
else
{
Block(ix-2,iy-3,ix+Len+2,iy+14,itype-1);
Rectangle(ix-1,iy-2,ix+Len+1,iy+13,itype);
TextOut(ix,iy,is,itype);
}
if(itype<64)
{
Refresh();
}
if(imode)
{
return (getchar());
}
}
void ChooseFile(char &str[])
{
char i;
char fname;
char nowd;
if(!ChDir("/ClearVdo"))
{
return;
}
strcpy(nowd,"/ClearVdo");
while(1)
{
if(!FileList(fname)||!strcmp(fname,".."))
{
   if(!strcmp(nowd,"/"))
   {
    break;
   }
   for(i=strlen(nowd);i>0&nowd!='/';i--);
   if(i)nowd=0;
   else strcpy(nowd,"/");
   ChDir(nowd);
   continue;
}
if(!strcmp(nowd,"/"))strcpy(nowd,"");
sprintf(nowd,"%s/%s",nowd,fname);
if(ChDir(fname))continue;
break;
}
memcpy(str,nowd,strlen(nowd));
}
void LoadDat()
{
char datfp;
ClearScreen();
ShowTxt(0,0,"Loading..",1,0);
if((datfp=fopen("/LavaData/Clear.dat","r"))==0)
{
ClearScreen();
ShowTxt(0,0,"资源文件丢失!",1,1);
exit(0);
}
fseek(datfp,PicDat_OffSet,0);
fread(PicDat,1,PicNumMax*BlockX*BlockY>>3,datfp);
fseek(datfp,MapDat_OffSet,0);
fread(SaveMapDat,1,MapDatSize,datfp);
fclose(datfp);
}
long GameSub(char n)
{
if(n==Game_Start)
{
ClearScreen();
ShowTxt(0,0,"Loading..",1,0);
Inkey();
memset(MapDat,0,MapDatSize);
memset(VdoDat,0,VdoSize);
memcpy(MapDat,SaveMapDat,MapDatSize);
ShowMap();
Refresh();
VdoNum=0;
Dir=2;
//Dir=3;
//Dir=3;
FoodNum=FoodNumMax;
EatFoodNum=IfChange=M.n=E.n=0;
EnemyNum=1;
M.x=Mx_Start;
M.y=My_Start;
E.x=Ex_Start_0;
E.y=Ey_Start_0;
IfChange=0;
/*E.x=Ex_Start_1;
E.y=Ey_Start_1;
E.n=0;
E.x=Ex_Start_2;
E.y=Ey_Start_2;
E.n=0;*/
}
else if(n==Game_Exit)
{
ClearScreen();
if((ShowTxt(0,0,"是否退出?(y/n)",1,1))!='y')
{
   ShowMap();
   Refresh();
   return (1);
}
ClearScreen();
ShowTxt(5,5,"程序 : TYCY (Too)",1,0);
ShowTxt(5,23,"美工 : TYCY (Too)",1,0);
ShowTxt(8,41,"CopyRight <逆天>",1,0);
ShowTxt(11,59,"谢谢使用,再见!",1,1);
exit(0);
}
else if(n==Game_Win)
{
if((ShowTxt(0,0,"被我吃完了,吃的好饱!",73,1))==Esc_Key)exit(0);
GameSub(Game_Start);
}
else if(n==Game_Lose)
{
if((ShowTxt(0,0,"贪吃鬼,终于抓到你了!",73,1))==Esc_Key)exit(0);
GameSub(Game_Start);
}
else if(n==Game_Init)
{
LoadDat();
GameSub(Game_Start);
}
else if(n==Game_Help)
{
ClearScreen();
Rectangle(1,0,160,80,1);
ShowTxt(1, 1,"你是一个贪吃的精灵,想要吃",1,0);
ShowTxt(1,14,"完所有的食物。但是要注意哦",1,0);
ShowTxt(1,27,",村长可是注意你好久了,别",1,0);
ShowTxt(1,40,"被抓住哦。不然后果很严重!",1,0);
ShowTxt(1,53,"方向键行走,空格键暂停,求",1,0);
ShowTxt(1,66,"助键帮助,跳出键退出。V8.8",1,1);
ShowMap();
Refresh();
}
else if(n==Game_Pause)
{
ShowTxt(67,13,"暂停",73,0);
sprintf(Str,"偷吃了%d个食物",EatFoodNum);
ShowTxt(80-(strlen(Str)*6>>1),31,Str,65,0);
sprintf(Str,"还剩%d个",FoodNum);
ShowTxt(80-(strlen(Str)*6>>1),49,Str,65,1);
Refresh();
}
}
char CheckMap(int ix,int iy,char is)
{
char id;
if(ix<0)
{
ix=(MapX-1)<<3;
}
if(ix>((MapX-1)<<3))
{
ix=0;
}
if(iy<0)
{
iy=(MapY-1)<<3;
}
if(iy>((MapY-1)<<3))
{
iy=0;
}
id=MapDat;
if(id==Blank)
{
return (1);
}
else if(id==Food)
{
if(is==Enemy)
{
   return (2);
}
FoodNum--;
EatFoodNum++;
if(!FoodNum)
{
   Inkey();
   GameSub(Game_Win);
}
MapDat=Blank;
ShowPic(ix,iy,Blank,0);
Refresh();
return (1);
}
else if(id==Black)
{
return (0);
}
}
int CheckEnemy(char id)
{
int ix,iy;
char ic;
if(!(rand()%Ai))
{
return (0);
}
if(IfChange)
{
IfChange--;
return (0);
}
ix=E.x;
iy=E.y;
ic=0;
if(id>=EnemyNum)
{
id=EnemyNum-1;
}
if(ix==M.x & iy==M.y)
{
return (0);
}
if(ix<M.x)
{
if((ic=CheckMap(ix+8,iy,Enemy)))
{
   Dir=2;
}
else if(iy<M.y)
{
   if((ic=CheckMap(ix,iy+8,Enemy)))
   {
    Dir=1;
    IfChange=(M.y-iy)>>3;
   }
}
else if(iy>M.y)
{
   if((ic=CheckMap(ix,iy-8,Enemy)))
   {
    Dir=0;
    IfChange=(iy-M.y)>>3;
   }
}
}
else if(ix>M.x)
{
if((ic=CheckMap(ix-8,iy,Enemy)))
{
   Dir=3;
}
else if(iy<M.y)
{
   if((ic=CheckMap(ix,iy+8,Enemy)))
   {
    Dir=1;
    IfChange=(M.y-iy)>>3;
   }
}
else if(iy>M.y)
{
   if((ic=CheckMap(ix,iy-8,Enemy)))
   {
    Dir=0;
    IfChange=(iy-M.y)>>3;
   }
}
}
else if(iy<M.y)
{
if((ic=CheckMap(ix,iy+8,Enemy)))
{
   Dir=1;
}
else if(ix<M.x)
{
   if((ic=CheckMap(ix+8,iy,Enemy)))
   {
    Dir=2;
    IfChange=(M.x-ix)>>3;
   }
}
else if(ix>M.x)
{
   if((ic=CheckMap(ix-8,iy,Enemy)))
   {
    Dir=3;
    IfChange=(ix-M.x)>>3;
   }
}
}
else if(iy>M.y)
{
if((ic=CheckMap(ix,iy-8,Enemy)))
{
   Dir=0;
}
else if(ix<M.x)
{
   if((ic=CheckMap(ix+8,iy,Enemy)))
   {
    Dir=2;
    IfChange=(M.x-ix)>>3;
   }
}
else if(ix>M.x)
{
   if((ic=CheckMap(ix-8,iy,Enemy)))
   {
    Dir=3;
    IfChange=(ix-M.x)>>3;
   }
}
}
if(IfChange>10)
{
IfChange=0;
}
return (ic);
}
void RecordVdo(char key)
{
VdoDat=key;
/*if(VdoNum>=VdoSize)
{
memmove(VdoDat,VdoDat+1,VdoSize-1);
VdoNum--;
}*/
}
void Move(char key,char ifvdo)
{
char i;
char m;
char ic;
char ifout;
char ifmyrun;
char ifenemyrun;
char ifkeyout;
char Last_Time;
int mx,my;
int ex,ey;

if(!ifvdo)
{
RecordVdo(key);
}

ifout=m=ifmyrun=ifenemyrun=ifkeyout=0;
Last_Time=Getms();
if(key<Up_Key | key>Left_Key)
{
ShowMyPic(M.x,M.y);
ShowEnemy(E.x,E.y,0);
Refresh();
ifkeyout=1;
}
m=key-Up_Key;
if(CheckMap((mx=M.x+(Move_X<<3)),(my=M.y+(Move_Y<<3)),My)&(!ifkeyout))
{
ifmyrun=1;
if(mx<0)
{
   mx=(MapX-1)<<3;
   ifout=1;
}
if(mx>((MapX-1)<<3))
{
   mx=0;
   ifout=1;
}
if(my<0)
{
   my=(MapY-1)<<3;
   ifout=1;
}
if(my>((MapY-1)<<3))
{
   my=0;
   ifout=1;
}
if(ifout)
{
   ShowPic(M.x,M.y,Blank,0);
   ShowMyPic(mx,my);
   Refresh();
   M.x=mx;
   M.y=my;
   ifmyrun=0;
}
mx=M.x;
my=M.y;
}
if((ic=CheckEnemy(0)))
{
ifenemyrun=1;
}
ex=E.x+(Move_X]<<3);
ey=E.y+(Move_Y]<<3);
if(!ic)
{
ic=CheckMap(ex,ey,Enemy);
if(!ic)
{
   ifenemyrun=0;
}
else
{
   ifenemyrun=1;
}
}
if(ex<0 | ey<0 | ex>((MapX-1)<<3) | ey>((MapY-1)<<3))
{
ifenemyrun=0;
}
ex=E.x;
ey=E.y;
i=0;
while(i<4)
{
if(ifmyrun)
{
   mx=mx+(Move_X<<1);
   my=my+(Move_Y<<1);
   ShowPic(M.x,M.y,Blank,0);
   ShowMyPic(mx,my);
}
if(ifenemyrun)
{
   ex=ex+(Move_X]<<1);
   ey=ey+(Move_Y]<<1);
   ShowPic(E.x,E.y,Blank,0);
   ShowEnemy(ex,ey,0);
}
i++;
Refresh();
while(((Getms()-Last_Time)&0xff)<Delay_Time);
}
if(ifmyrun)
{
M.x=M.x+(Move_X<<3);
M.y=M.y+(Move_Y<<3);
ShowMyPic(M.x,M.y);
}
if(ifenemyrun)
{
if(ic==2)
{
   ShowPic(E.x,E.y,Food_Pic,0);
}
E.x=E.x+(Move_X]<<3);
E.y=E.y+(Move_Y]<<3);
ShowEnemy(E.x,E.y,0);
}
Refresh();
}
void PlayVdo()
{
int i;
char mapdat;
char mx,my,ex,ey;
char eatfoodnum,foodnum;
char ifchange;
i = 0;
mx=M.x;
my=M.y;
ex=E.x;
ey=E.y;
ifchange=IfChange;
eatfoodnum=EatFoodNum;
foodnum=FoodNum;
M.x=Mx_Start;
M.y=My_Start;
E.x=Ex_Start_0;
E.y=Ey_Start_0;
IfChange=0;
EatFoodNum=0;
FoodNum=FoodNumMax;
memcpy(mapdat,MapDat,MapDatSize);
memcpy(MapDat,SaveMapDat,MapDatSize);
ClearScreen();
ShowTxt(0,0,"播放开始~",2,0);
ShowMap();
ShowMyPic(M.x,M.y);
ShowEnemy(E.x,E.y,0);
Refresh();
while(i < VdoNum)
{
Move(VdoDat,1);
}
ClearScreen();
ShowTxt(0,0,"播放结束~",2,0);
M.x=mx;
M.y=my;
E.x=ex;
E.y=ey;
IfChange=ifchange;
EatFoodNum=eatfoodnum;
FoodNum=foodnum;
memcpy(MapDat,mapdat,MapDatSize);
ShowMap();
ShowMyPic(M.x,M.y);
ShowEnemy(E.x,E.y,0);
Refresh();
}
void SaveVdo()
{
char datfp;
char i;
char str;
i=0;
if(!ChDir("/ClearVdo"))
{
MakeDir("/ClearVdo");
if(!ChDir("/ClearVdo"))
{
   return;
}
}
for(i=0;i<=20;i++)
{
sprintf(str,"/ClearVdo/Vdo[%d].vdo",i+1);
datfp=fopen(str,"r");
if(!datfp)
{
   fclose(datfp);
   break;
}
if(i==20)
{
   ShowTxt(0,0,"储出失败!",66,1);
   Refresh();
   return;
}
}
datfp=fopen(str,"w");
fwrite("Vdo.",1,4,datfp);
fwrite(&VdoNum,1,2,datfp);
fwrite(VdoDat,1,VdoSize,datfp);
fclose(datfp);
ShowTxt(0,0,"保存成功!",66,1);
Refresh();
}
void LoadVdo()
{
char str;
char sign;
char datfp;
ChooseFile(str);
datfp=fopen(str,"r");
if(!datfp)
{
ShowTxt(0,0,"录象文件打开错误!",66,1);
Refresh();
return;
}
rewind(datfp);
fread(sign,1,4,datfp);
if(strcmp(sign,"Vdo."))
{
ShowTxt(0,0,"不是有效的Vdo文件!",66,1);
fclose(datfp);
Refresh();
return;
}
fseek(datfp,4,0);
fread(&VdoNum,1,2,datfp);
fread(VdoDat,1,VdoSize,datfp);
fclose(datfp);
ShowTxt(0,0,"读取成功!",66,1);
Refresh();
}
void Main()
{
char key;
GameSub(Game_Init);
for(;;)
{
key=CheckKey(128);
if(key==Esc_Key)
{
   Inkey();
   GameSub(Game_Exit);
}
else if(key==Help_Key)
{
   Inkey();
   GameSub(Game_Help);
}
else if(key==Pause_Key)
{
   Inkey();
   GameSub(Game_Pause);
}
else if(key==Update_Key)
{
   ShowMap();
   Refresh();
}
else if(key==PlayVdo_Key)
{
   PlayVdo();
   continue;
}
else if(key==SaveVdo_Key)
{
   SaveVdo();
   continue;
}
else if(key==LoadVdo_Key)
{
   LoadVdo();
   continue;
}
if(E.x==M.x & E.y==M.y)
{
   Inkey();
   GameSub(Game_Lose);
}
Move(key,0);
}
}
void main()
{
Main();
}

[ 本帖最后由 TYCY 于 2008-4-30 09:44 编辑 ]

zhangyinggv 发表于 2008-2-20 09:14:50

沙发啊。我坐了。激动

TYCY 发表于 2008-2-20 09:34:03

板凳,自己做咯!

oiw 发表于 2008-2-20 10:01:50

地板~
第一次这么前面XD

天琊 发表于 2008-2-20 10:18:28

挖个地洞就顶!

aq203 发表于 2008-2-20 10:29:03

无论如何都要顶啊。。。。。。。。。。

TYCY 发表于 2008-2-20 10:37:45

帮忙测试下,看看有什么不足的,或是BUG!

aq203 发表于 2008-2-20 10:50:49

:L 我在TC800上玩速度飞快,一下就被抓到啦,加入速度控制吧。

TYCY 发表于 2008-2-20 11:14:47

TC800的实机上那么快?
我在NC2600C上是适当的速度啊
好的,我马上出其他版本的

CZJ1906 发表于 2008-2-20 13:00:51

支持啊!!!

:lol :lol :lol

zjjerry413 发表于 2008-2-20 17:12:11

支持!!

下来试试!!

滴鱼 发表于 2008-2-20 17:44:53

定一个:lol

kugaoyang 发表于 2008-2-20 18:13:22

原帖由 滴鱼 于 2008-2-20 17:44 发表 http://emsky.net/bbs/images/common/back.gif
定一个:lol
定一个!!:lol

CZJ1906 发表于 2008-2-21 13:33:53

我晕!!

速度也太快了吧!!

在V5100上都能玩!!

:lol :lol :lol

TYCY 发表于 2008-2-21 13:35:12

速度是很快,慢速度的还没发布!

真-血翼 发表于 2008-2-21 17:19:06

针对TC800等快速度机型,加入延时设定。

black 发表于 2008-2-21 18:04:00

迟到的飘过~~顶过~~

kugaoyang 发表于 2008-2-21 18:11:48

原帖由 black 于 2008-2-21 18:04 发表 http://emsky.net/bbs/images/common/back.gif
迟到的飘过~~顶过~~
再支持,:loveliness:
ps:black没上QQ?

black 发表于 2008-2-21 18:15:40

正在上……:L

congyi 发表于 2008-2-21 21:03:49

tc1000s的速度也太快了!
那个村长走得太快了吧?……
那个精灵走得没村长快,怎么在他面前跑呢?一下就被抓到了……
页: [1] 2
查看完整版本: 【贪吃小精灵】V1.5版发布!【含源码】【3.10更新】