- 注册时间
- 2007-6-27
- 最后登录
- 1970-1-1
|
【游戏名称】: 【贪吃小精灵】
【游戏作者】: TYCY(Too)
【开发平台】: NC2600C
【游戏版本】: V1.5
【运行平台】: Lava All
【游戏说明】:游戏上有说明
这个游戏是我在其他机器上玩过的,不知道是DVD上还是BBV的游戏
一时兴起就做了,本来想做成仿灰度的,但是由于自己美工问题(竹子在做其他),还有就是图素小,图快多,整体刷会导致速度慢很多!
所以我只能把精灵很敌人的图片弄成灰度(我自己认为的,不知道象不象)
敌人AI中等.
修正点,小的BUG
按"R" 刷新屏幕,“B” 播放录像(仅限当局)
S:存储录像
L:载入录像
S和L合用,可以达到存档效果(你先储存,在读取)
//=====================================
[copy]
下面是源码,游戏包里也有!
[/copy]- //=========================================
- //========宏值定义========
- //--------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[EnemyNumMax];
- char EnemyNum;
- char FoodNum;
- char EatFoodNum;
- char Dir[3];
- char Str[26*6];
- char IfChange; // 用于AI中判断是否改变方向
- char PicDat[PicNumMax][BlockX*BlockY/8];
- char MapDat[MapY][MapX];
- char SaveMapDat[MapY][MapX];
- char VdoDat[VdoSize];
- int VdoNum;
- int Move_X[4]={0,0,1,-1};
- int Move_Y[4]={-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[id+in]);
- }
- 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[in].n++);
- if(E[in].n==2)
- {
- E[in].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[j][i],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[20];
- char nowd[60];
- 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]!='/';i--);
- if(i)nowd[i]=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[0]=2;
- //Dir[1]=3;
- //Dir[2]=3;
- FoodNum=FoodNumMax;
- EatFoodNum=IfChange=M.n=E[0].n=0;
- EnemyNum=1;
- M.x=Mx_Start;
- M.y=My_Start;
- E[0].x=Ex_Start_0;
- E[0].y=Ey_Start_0;
- IfChange=0;
- /*E[1].x=Ex_Start_1;
- E[1].y=Ey_Start_1;
- E[1].n=0;
- E[2].x=Ex_Start_2;
- E[2].y=Ey_Start_2;
- E[2].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[iy>>3][ix>>3];
- if(id==Blank)
- {
- return (1);
- }
- else if(id==Food)
- {
- if(is==Enemy)
- {
- return (2);
- }
- FoodNum--;
- EatFoodNum++;
- if(!FoodNum)
- {
- Inkey();
- GameSub(Game_Win);
- }
- MapDat[iy>>3][ix>>3]=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[id].x;
- iy=E[id].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[id]=2;
- }
- else if(iy<M.y)
- {
- if((ic=CheckMap(ix,iy+8,Enemy)))
- {
- Dir[id]=1;
- IfChange=(M.y-iy)>>3;
- }
- }
- else if(iy>M.y)
- {
- if((ic=CheckMap(ix,iy-8,Enemy)))
- {
- Dir[id]=0;
- IfChange=(iy-M.y)>>3;
- }
- }
- }
- else if(ix>M.x)
- {
- if((ic=CheckMap(ix-8,iy,Enemy)))
- {
- Dir[id]=3;
- }
- else if(iy<M.y)
- {
- if((ic=CheckMap(ix,iy+8,Enemy)))
- {
- Dir[id]=1;
- IfChange=(M.y-iy)>>3;
- }
- }
- else if(iy>M.y)
- {
- if((ic=CheckMap(ix,iy-8,Enemy)))
- {
- Dir[id]=0;
- IfChange=(iy-M.y)>>3;
- }
- }
- }
- else if(iy<M.y)
- {
- if((ic=CheckMap(ix,iy+8,Enemy)))
- {
- Dir[id]=1;
- }
- else if(ix<M.x)
- {
- if((ic=CheckMap(ix+8,iy,Enemy)))
- {
- Dir[id]=2;
- IfChange=(M.x-ix)>>3;
- }
- }
- else if(ix>M.x)
- {
- if((ic=CheckMap(ix-8,iy,Enemy)))
- {
- Dir[id]=3;
- IfChange=(ix-M.x)>>3;
- }
- }
- }
- else if(iy>M.y)
- {
- if((ic=CheckMap(ix,iy-8,Enemy)))
- {
- Dir[id]=0;
- }
- else if(ix<M.x)
- {
- if((ic=CheckMap(ix+8,iy,Enemy)))
- {
- Dir[id]=2;
- IfChange=(M.x-ix)>>3;
- }
- }
- else if(ix>M.x)
- {
- if((ic=CheckMap(ix-8,iy,Enemy)))
- {
- Dir[id]=3;
- IfChange=(ix-M.x)>>3;
- }
- }
- }
- if(IfChange>10)
- {
- IfChange=0;
- }
- return (ic);
- }
- void RecordVdo(char key)
- {
- VdoDat[VdoNum++]=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[0].x,E[0].y,0);
- Refresh();
- ifkeyout=1;
- }
- m=key-Up_Key;
- if(CheckMap((mx=M.x+(Move_X[m]<<3)),(my=M.y+(Move_Y[m]<<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[0].x+(Move_X[Dir[0]]<<3);
- ey=E[0].y+(Move_Y[Dir[0]]<<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[0].x;
- ey=E[0].y;
- i=0;
- while(i<4)
- {
- if(ifmyrun)
- {
- mx=mx+(Move_X[m]<<1);
- my=my+(Move_Y[m]<<1);
- ShowPic(M.x,M.y,Blank,0);
- ShowMyPic(mx,my);
- }
- if(ifenemyrun)
- {
- ex=ex+(Move_X[Dir[0]]<<1);
- ey=ey+(Move_Y[Dir[0]]<<1);
- ShowPic(E[0].x,E[0].y,Blank,0);
- ShowEnemy(ex,ey,0);
- }
- i++;
- Refresh();
- while(((Getms()-Last_Time)&0xff)<Delay_Time);
- }
- if(ifmyrun)
- {
- M.x=M.x+(Move_X[m]<<3);
- M.y=M.y+(Move_Y[m]<<3);
- ShowMyPic(M.x,M.y);
- }
- if(ifenemyrun)
- {
- if(ic==2)
- {
- ShowPic(E[0].x,E[0].y,Food_Pic,0);
- }
- E[0].x=E[0].x+(Move_X[Dir[0]]<<3);
- E[0].y=E[0].y+(Move_Y[Dir[0]]<<3);
- ShowEnemy(E[0].x,E[0].y,0);
- }
- Refresh();
- }
- void PlayVdo()
- {
- int i;
- char mapdat[MapY][MapX];
- char mx,my,ex,ey;
- char eatfoodnum,foodnum;
- char ifchange;
- i = 0;
- mx=M.x;
- my=M.y;
- ex=E[0].x;
- ey=E[0].y;
- ifchange=IfChange;
- eatfoodnum=EatFoodNum;
- foodnum=FoodNum;
- M.x=Mx_Start;
- M.y=My_Start;
- E[0].x=Ex_Start_0;
- E[0].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[0].x,E[0].y,0);
- Refresh();
- while(i < VdoNum)
- {
- Move(VdoDat[i++],1);
- }
- ClearScreen();
- ShowTxt(0,0,"播放结束~",2,0);
- M.x=mx;
- M.y=my;
- E[0].x=ex;
- E[0].y=ey;
- IfChange=ifchange;
- EatFoodNum=eatfoodnum;
- FoodNum=foodnum;
- memcpy(MapDat,mapdat,MapDatSize);
- ShowMap();
- ShowMyPic(M.x,M.y);
- ShowEnemy(E[0].x,E[0].y,0);
- Refresh();
- }
- void SaveVdo()
- {
- char datfp;
- char i;
- char str[32];
- 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[64];
- char sign[4];
- 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[0].x==M.x & E[0].y==M.y)
- {
- Inkey();
- GameSub(Game_Lose);
- }
- Move(key,0);
- }
- }
- void main()
- {
- Main();
- }
复制代码
[ 本帖最后由 TYCY 于 2008-4-30 09:44 编辑 ] |
评分
-
查看全部评分
|