美工用了tbf,程序以前写好后没整理过,所以也就这么发上来了,但是注释还是有的,有爱好的朋友可以交流下,因为敌人可以设置得再聪明点,emial:milo_zy@sohu.com.假如这里的附件有问题请到唯c原创找相关附件.
/*
吃豆程序
上海工程技术大学 02211 朱昀*/
#include <graphics.h>
#include <math.h>
#include "myinclude.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define HOME 0x4700
#define END 0x4f00
#define SPACE 0x3920
#define ESC 0x011b
#define ENTER 0x1c0d
#define N 6/*敌人的数量*/
struct PLay
{
double x;/*图形模式下的具体坐标*/
double y;
int i,j;/*转化后的坐标*/
int life;/*生命*/
int mode;/*判定8种样子*/
int move;/*判定是否按键移动*/
int flag;/*当跟踪性的敌人只有一个方向可走时,调用chang时需要变下方向*/
}play,amy[N];
char str[10];
int tbfPLAY[30][30];/*显示玩家*/
int tbfAMY[30][30];/*敌人1*/
int tbfAMY1[30][30];/*敌人2*/
int tbfFOOD[30][30];/*食物*/
int tbfWALL[30][30];/*墙壁*/
int score;/*得分*/
int WINNUM;/*要多少分才过关的标志*/
int GUAN;/*第几关的标志*/
double SPEED=9.0;/*地图中,0是食物,2是墙壁,-1空地*/
int MAP2[14][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,-1,0,0,0,0,0,0,-1,0,0,0,0,-1,-1,-1,0,0,0,2,
2,0,0,2,2,2,2,2,2,-1,-1,2,2,2,2,2,2,0,0,2,
2,0,-1,0,0,-1,-1,0,0,-1,0,-1,0,-1,0,-1,-1,0,0,2,
2,0,2,2,2,0,0,-1,0,2,0,0,-1,-1,0,2,2,2,0,2,
2,-1,-1,0,-1,-1,0,2,0,-1,0,0,2,-1,0,0,-1,-1,-1,2,
2,-1,-1,0,0,2,0,2,0,-1,-1,0,2,0,0,2,-1,2,0,2,
2,-1,-1,0,-1,2,0,2,2,2,0,-1,2,0,0,2,-1,2,0,2,
2,2,2,0,-1,2,0,2,-1,-1,0,-1,2,-1,-1,2,-1,-1,0,2,
2,0,-1,0,0,2,0,2,2,2,2,2,2,0,-1,2,0,2,0,2,
2,-1,2,0,0,2,0,0,-1,-1,-1,0,-1,-1,0,2,0,2,0,2,
2,0,-1,-1,-1,2,0,0,-1,-1,-1,0,0,-1,-1,2,0,-1,0,2,
2,-1,-1,-1,-1,-1,-1,2,-1,0,-1,-1,-1,-1,-1,0,0,-1,0,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*第一关的地图*/
int MAP3[14][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,-1,0,0,-1,-1,-1,0,0,-1,0,-1,-1,-1,-1,0,0,0,0,2,
2,0,2,0,2,2,0,2,0,2,-1,2,2,0,0,2,2,0,0,2,
2,-1,0,0,-1,-1,-1,0,0,0,-1,-1,0,-1,-1,-1,0,2,0,2,
2,-1,2,-1,2,0,-1,-1,0,0,-1,0,-1,-1,0,2,0,0,0,2,
2,0,2,0,2,-1,0,2,0,0,-1,0,2,0,0,2,0,0,0,2,
2,0,2,0,2,-1,0,0,-1,-1,-1,0,2,-1,0,2,0,2,0,2,
2,0,0,0,2,-1,0,2,0,0,-1,0,2,0,-1,2,0,-1,0,2,
2,-1,2,0,2,-1,0,2,0,0,-1,0,2,0,0,2,0,2,0,2,
2,-1,2,0,2,0,0,2,2,2,0,0,2,0,0,2,0,2,0,2,
2,-1,0,0,0,0,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,0,2,0,2,
2,0,2,2,0,2,0,2,0,2,0,2,2,2,0,0,2,2,0,2,
2,0,-1,-1,-1,0,0,-1,-1,0,0,-1,-1,0,0,0,-1,-1,-1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*第二关的地图*/
int MAP[14][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,
2,-1,2,0,-1,-1,0,0,0,2,0,0,0,0,0,0,0,0,2,2,
2,-1,-1,0,0,0,2,-1,-1,0,0,0,2,2,2,0,0,0,-1,2,
2,-1,-1,0,0,0,-1,-1,2,2,0,2,2,2,2,2,0,0,-1,2,
2,-1,-1,0,2,0,-1,-1,2,2,-1,2,2,2,2,2,2,0,-1,2,
2,-1,2,0,2,2,2,2,2,2,2,-1,2,2,2,2,2,0,-1,2,
2,-1,-1,0,0,2,2,2,2,2,2,2,2,2,2,2,0,0,-1,2,
2,-1,-1,0,0,0,0,2,2,2,-1,-1,-1,-1,0,2,2,0,-1,2,
2,-1,-1,2,0,0,0,0,0,2,2,2,0,0,0,0,0,0,-1,2,
2,-1,-1,0,2,2,0,0,0,0,2,0,0,2,0,2,0,0,-1,2,
2,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,2,-1,-1,2,
2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*第三关的地图*/
void Init();/*图形驱动*/
void Close();/*图形驱动*/
void GameBegain();/*开始选择画面*/
void DrawBrick(int,int);/*画砖*/
void DrawFirst();/*开始画面*/
void GamePlay();/*游戏具体函数*/
void DrawFood(int,int);/*画食物*/
void ClrPlay();/*去掉玩家或敌人原来的地方*/
void AmyClr(int n);/*去掉敌人原来的地方*/
void TbfMode();/*玩家的变化*/
void AmyMode(int n);/*敌人的变化*/
void AmyMode1(int n);/*跟踪性敌人的变化*/
void AmyClockTime(int);/*控制时间间断*/
void AmyModeChange(int);/*敌人移动*/
void AmyModeChange1(int);/*敌人跟踪移动*/
void PlayModeChange();/*玩家自动变化*/
int UMove(int);/*四个方向单独判定是否敌人可以移动*/
int DMove(int);
int RMove(int);
int LMove(int);
void Ugo(int);/*四发方向敌人的直线移动*/
void Dgo(int);
void Rgo(int);
void Lgo(int);
int AmyRight(int);/*判定敌人是否碰到死路*/
int PUMove();/*四个方向判定玩家是否可以走路*/
int PDMove();
int PRMove();
int PLMove();
void PUgo();/*四发方向玩家的直线移动*/
void PDgo();
void PRgo();
void PLgo();
int PlayRight();/*判定玩家是否碰到死路*/
void GameWin();/*胜利*/
void GameOver();/*游戏失败*/
void PrintScore();
void Chinese();/*显示中文*/
void MapCopy(int (*a)[20],int (*b)[20]);/*转换地图*/
void TongJi();/*计算要多少分才可以过关*/
void main()
{
Init();
GameBegain();
GamePlay();
Close();
}
void Chinese()/*显示中文*/
{
int i;
char str[]={
/* 以下是 '吃' 的 48点阵宋体 字模,288 byte */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,
0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,
0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x70,
0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
0x00,0x01,0x00,0xE0,0x00,0x00,0x0C,0x03,
0x80,0xE0,0x00,0x00,0x0F,0xFF,0xC0,0xC0,
0x00,0x40,0x0E,0x03,0x81,0x80,0x00,0xE0,
0x0E,0x03,0x81,0xFF,0xFF,0xF0,0x0E,0x03,
0x83,0x00,0x00,0x00,0x0E,0x03,0x83,0x00,
0x00,0x00,0x0E,0x03,0x86,0x00,0x00,0x00,
0x0E,0x03,0x84,0x00,0x00,0x00,0x0E,0x03,
0x8C,0x00,0x00,0x00,0x0E,0x03,0x98,0x00,
0x00,0x00,0x0E,0x03,0x90,0x00,0x18,0x00,
0x0E,0x03,0xA0,0x
00,0x3C,0x00,0x0E,0x03,
0xC7,0xFF,0xFE,0x00,0x0E,0x03,0x80,0x00,
0x78,0x00,0x0E,0x03,0x80,0x00,0xF0,0x00,
0x0E,0x03,0x80,0x00,0xE0,0x00,0x0E,0x03,
0x80,0x01,0xC0,0x00,0x0E,0x03,0x80,0x03,
0x80,0x00,0x0E,0x03,0x80,0x07,0x00,0x00,
0x0E,0x03,0x80,0x0F,0x00,0x00,0x0F,0xFF,
0x80,0x1E,0x00,0x00,0x0E,0x03,0x80,0x1C,
0x00,0x00,0x0E,0x03,0x80,0x38,0x00,0x00,
0x0E,0x03,0x80,0x70,0x00,0x40,0x0E,0x03,
0x00,0xE0,0x00,0x40,0x0E,0x00,0x01,0xE0,
0x00,0x60,0x0C,0x00,0x01,0xC0,0x00,0x60,
0x00,0x00,0x03,0x80,0x00,0x60,0x00,0x00,
0x07,0x00,0x00,0x60,0x00,0x00,0x07,0x00,
0x00,0x60,0x00,0x00,0x07,0x00,0x00,0x60,
0x00,0x00,0x07,0x00,0x00,0x70,0x00,0x00,
0x07,0x00,0x00,0xF8,0x00,0x00,0x03,0xFF,
0xFF,0xF0,0x00,0x00,0x01,0xFF,0xFF,0xF0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* 以下是 '豆' 的 48点阵宋体 字模,288 byte */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x07,0x80,0x03,0xFF,0xFF,0xFF,0xF8,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,
0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x00,
0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x38,
0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,
0x18,0x00,0x00,0x38,0x00,0x00,0x18,0x00,
0x00,0x38,0x00,0x00,0x18,0x00,0x00,0x38,
0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,
0x18,0x00,0x00,0x38,0x00,0x00,0x18,0x00,
0x00,0x38,0x00,0x00,0x18,0x00,0x00,0x3F,
0xFF,0xFF,0xF8,0x00,0x00,0x38,0x00,0x00,
0x18,0x00,0x00,0x38,0x00,0x00,0x18,0x00,
0x00,0x38,0x00,0x01,0x00,0x00,0x00,0x04,
0x00,0x01,0x80,0x00,0x00,0x03,0x00,0x01,
0xE0,0x00,0x00,0x03,0x80,0x03,0xE0,0x00,
0x00,0x01,0xC0,0x03,0xC0,0x00,0x00,0x00,
0xC0,0x03,0x80,0x00,0x00,0x00,0xE0,0x07,
0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,
0x00,0x00,0x70,0x06,0x00,0x00,0x00,0x00,
0x70,0x0C,0x00,0x00,0x00,0x00,0x70,0x0C,
0x00,0x00,0x00,0x00,0x60,0x18,0x00,0x60,
0x00,0x00,0x00,0x10,0x00,0xF0,0x3F,0xFF,
0xFF,0xFF,0xFF,0xF8,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
for(i=0;i<576;i+=288)
HZ48(260+i/4,100,48,48,0,str+i);
for(i=0;i<576;i+=288)
HZ48(258+i/4,100,48,48,RED,str+i);
}
void GameBegain()/*开始选择画面*/
{
int flag=0;
int s=0;
int key;
int namex,namey;
GUAN=1;/*一开始先玩第一关*/
InputTbf("heart.tbf",tbfFOOD);
namex=5;namey=440;
setfillstyle(SOLID_FILL,7);
bar(0,0,640,480);
Chinese();
play.x=10;play.y=220;
HZ12(150,300,15,0,"请先调整游戏速度,左键为减速,右键为加速,回车游戏开始");
while(1)
{
while(!kbhit())
{
if(s==3)
{
sound(250);
bar(play.x-30,play.y-30,play.x+30,play.y+30);
if(flag==1)
{InputTbf("r1.tbf",tbfPLAY);flag=0;}
else
{InputTbf("r2.tbf",tbfPLAY);flag=1;}
PrintTbf(play.x,play.y,tbfPLAY,15);
play.x+=30;
if(play.x>640)
play.x=10;
s=0;
}
HZ12(namex,namey,17,BLACK,"唯c联盟 朱昀");
AmyClockTime(0);/*测试时间间隔*/
if(s==1)
{
HZ12(namex,namey,17,7,"唯c联盟 朱昀");
namex+=20;
}
if(namex>640&&s==1)
namex=10;
nosound();
s++;
}
key=bioskey(0);
if(key==RIGHT&&SPEED>2)
SPEED-=1;
else if(key==LEFT&&SPEED<50)
SPEED+=1;
else if(key==ENTER)
break;
}
}
void Init()
{
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);/*独立模式*/
initgraph(&gd,&gm,"d:\\tc\\tc");
randomize();
}
int timeflag=0;/*移动间隔的判定变量*/
void AmyClockTime(int n)/*时间间隔*/
{
clock_t old,new;
if(n==0)
timeflag++;
old=clock();
while(1)
{
new=clock();
if(n==0)
{
if((fabs(new-old)/SPEED)>=0.15)
break;
}
else
{
if((fabs(new-old)/SPEED)>=0.05)
break;
}
}
}
void ClrPlay()/*去掉玩家原来的地方*/
{
setfillstyle(SOLID_FILL,7);
setcolor(7);
bar(30+play.x*30-9,40+play.y*30-9,30+play.x*30+9,40+play.y*30+9);
setcolor(GREEN);
}
void AmyClr(int n)/*去掉敌人原来的地方*/
{
setfillstyle(SOLID_FILL,7);
setcolor(7);
bar(30+amy[n].x*30-9,40+amy[n].y*30-9,30+amy[n].x*30+9,40+amy[n].y*30+9);
}
void TbfMode()/*玩家的变化*/
{
switch(play.mode)
{
case 1:InputTbf("r1.tbf",tbfPLAY);break;
case 2:InputTbf("r2.tbf",tbfPLAY);break;
case 3:InputTbf("d1.tbf",tbfPLAY);break;
case 4:InputTbf("d2.tbf",tbfPLAY);break;
case 5:InputTbf("l1.tbf",tbfPLAY);break;
case 6:InputTbf("l2.tbf",tbfPLAY);break;
case 7:InputTbf("u1.tbf",tbfPLAY);break;
case 8:InputTbf("u2.tbf",tbfPLAY);break;
}
PrintTbf((int)(30+play.x*30-14),(int)(40+play.y*30-14),tbfPLAY,7);
}
void AmyMode(int n)/*敌人的变化*/
{ switch(amy[n].mode)
{
case 1:InputTbf("ar1.tbf",tbfAMY);break;
case 2:InputTbf("ar2.tbf",tbfAMY);break;
case 3:InputTbf("ad1.tbf",tbfAMY);break;
case 4:InputTbf("ad2.tbf",tbfAMY);break;
case 5:InputTbf("al1.tbf",tbfAMY);break;
case 6:InputTbf("al2.tbf",tbfAMY);break;
case 7:InputTbf("au1.tbf",tbfAMY);break;
case 8:InputTbf("au2.tbf",tbfAMY);break;
}
PrintTbf((int)(30+amy[n].x*30-14),(int)(40+amy[n].y*30-14),tbfAMY,7);
}
void AmyMode1(int n)/*敌人的变化*/
{ switch(amy[n].mode)
{
case 1:InputTbf("aar1.tbf",tbfAMY1);break;
case 2:InputTbf("aar2.tbf",tbfAMY1);break;
case 3:InputTbf("aad1
.tbf",tbfAMY1);break;
case 4:InputTbf("aad2.tbf",tbfAMY1);break;
case 5:InputTbf("aal1.tbf",tbfAMY1);break;
case 6:InputTbf("aal2.tbf",tbfAMY1);break;
case 7:InputTbf("aau1.tbf",tbfAMY1);break;
case 8:InputTbf("aau2.tbf",tbfAMY1);break;
}
PrintTbf((int)(30+amy[n].x*30-14),(int)(40+amy[n].y*30-14),tbfAMY1,7);
}
int UMove(int i)
{
int flag=0;
if(MAP[amy[i].i-1][amy[i].j]==2&&amy[i].y-amy[i].i<0.1)
flag++;
if(amy[i].y-amy[i].i<0.1&&amy[i].x-amy[i].j>0.1&&MAP[amy[i].i-1][amy[i].j+1]==2)
flag++;
return flag;
}
int PUMove()
{
int flag=0;
if(MAP[play.i-1][play.j]==2&&play.y-play.i<0.1)
flag++;
if(play.y-play.i<0.1&&play.x-play.j>0.1&&MAP[play.i-1][play.j+1]==2)
flag++;
return flag;
}
int DMove(int i)
{
int flag=0;
if(MAP[amy[i].i+1][amy[i].j]==2)
flag++;
if(amy[i].y-amy[i].i<0.1&&amy[i].x-amy[i].j>0.1&&MAP[amy[i].i+1][amy[i].j+1]==2)
flag++;
return flag;
}
int PDMove()
{
int flag=0;
if(MAP[play.i+1][play.j]==2)
flag++;
if(play.y-play.i<0.1&&play.x-play.j>0.1&&MAP[play.i+1][play.j+1]==2)
flag++;
return flag;
}
int RMove(int i)
{
int flag=0;
if(MAP[amy[i].i][amy[i].j+1]==2)/*右边不能走的情况*/
flag++;
if(amy[i].y-amy[i].i>0&&amy[i].x-amy[i].j<0.1&&MAP[amy[i].i+1][amy[i].j+1]==2)
flag++;
return flag;
}
int PRMove()
{
int flag=0;
if(MAP[play.i][play.j+1]==2)/*右边不能走的情况*/
flag++;
if(play.y-play.i>0&&play.x-play.j<0.1&&MAP[play.i+1][play.j+1]==2)
flag++;
return flag;
}
int LMove(int i)
{
int flag=0;
if(amy[i].x-amy[i].j<0.1&&amy[i].y-amy[i].i<0.1&&MAP[amy[i].i][amy[i].j-1]==2)
flag++;
if(amy[i].x-amy[i].j<0.1&&amy[i].y-amy[i].i>0.1&&MAP[amy[i].i+1][amy[i].j-1]==2)
flag++;
if(amy[i].x-amy[i].j<0.1&&amy[i].y-amy[i].i>0.1&&MAP[amy[i].i][amy[i].j-1]==2)
flag++;
return flag;
}
int PLMove()
{
int flag=0;
if(play.x-play.j<0.1&&play.y-play.i<0.1&&MAP[play.i][play.j-1]==2)
flag++;
if(play.x-play.j<0.1&&play.y-play.i>0.1&&MAP[play.i+1][play.j-1]==2)
flag++;
if(play.x-play.j<0.1&&play.y-play.i>0.1&&MAP[play.i][play.j-1]==2)
flag++;
return flag;
}
int AmyRight(int i)/*判定敌人是否碰到死路*/
{
int flag=0;
flag+=UMove(i);
flag+=RMove(i);
flag+=DMove(i);
flag+=LMove(i);
return flag;
}
int PlayRight()/*判定me是否碰到死路*/
{
int flag=0;
flag+=PUMove();
flag+=PRMove();
flag+=PDMove();
flag+=PLMove();
return flag;
}
void Rgo(int i)/*让敌人笔直往右边移动*/
{
amy[i].x+=0.5;
if(amy[i].mode==2)
amy[i].mode=1;
else if(amy[i].mode==1)
amy[i].mode=2;
}
void PRgo()
{
play.x+=0.5;
if(play.mode==2)
play.mode=1;
else if(play.mode==1)
play.mode=2;
else play.mode=2;
}
void Dgo(int i)
{
amy[i].y+=0.5;
if(amy[i].mode==3)
amy[i].mode=4;
else if(amy[i].mode==4)
amy[i].mode=3;
}
void PDgo()
{
play.y+=0.5;
if(play.mode==3)
play.mode=4;
else if(play.mode==4)
play.mode=3;
else play.mode=4;
}
void Lgo(int i)
{
amy[i].x-=0.5;
if(amy[i].mode==5)
amy[i].mode=6;
else if(amy[i].mode==6)
amy[i].mode=5;
}
void PLgo()
{
play.x-=0.5;
if(play.mode==5)
play.mode=6;
else if(play.mode==6)
play.mode=5;
else play.mode=6;
}
void Ugo(int i)
{
amy[i].y-=0.5;
if(amy[i].mode==7)
amy[i].mode=8;
else if(amy[i].mode==8)
amy[i].mode=7;
}
void PUgo()
{
play.y-=0.5;
if(play.mode==7)
play.mode=8;
else if(play.mode==8)
play.mode=7;
else play.mode=8;
}
void AmyModeChange1(int i)/*敌人跟踪移动*/
{
int flag;
/*往右跟踪*/
if(amy[i].i==play.i&&amy[i].y==play.y)
{
flag=1;
if(amy[i].j<=16&&MAP[i][amy[i].j+1]==2&&play.j>amy[i].j)
flag=0;
if(amy[i].j>=3&&MAP[i][amy[i].j-1]==2&&play.j<amy[i].j)
flag=0;
if(flag)
{
if(amy[i].x>play.x&&LMove(i)==0)
{
if(amy[i].mode==5||amy[i].mode==6)
Lgo(i);
else
{amy[i].x-=0.5;amy[i].mode=6;}
return;
}
else if(RMove(i)==0)
{
if(amy[i].mode==1||amy[i].mode==2)
Rgo(i);
else
{amy[i].x+=0.5;amy[i].mode=2;}
return;
}
}
}
if(amy[i].j==play.j&&amy[i].x==play.x)/*上下跟踪*/
{
flag=1;
if(amy[i].i>2&&MAP[amy[i].i-1][amy[i].j]==2&&amy[i].i>play.i)
flag=0;
if(amy[i].i<11&&MAP[amy[i].i+1][amy[i].j]==2&&amy[i].i<play.i)
flag=0;
if(flag)
{
if(UMove(i)==0&&amy[i].y>play.y)
{
if(amy[i].mode>6)
Ugo(i);
else
{amy[i].y-=0.5;amy[i].mode=8;}
return;
}
else if(DMove(i)==0)
{
if(amy[i].mode==3||amy[i].mode==4)
Dgo(i);
else
{amy[i].y+=0.5;amy[i].mode=4;}
return;
}
}
}
amy[i].flag=1;
AmyModeChange(i);/*没办法跟踪就让敌人乱走*/
amy[i].flag=0;
}
void PlayModeChange()/*玩家自动变化*/
{int randflag,flag;
if(play.mode<3&&PRMove()==0)/*右边笔直走*/
{
PRgo();
return;
}
else if((play.mode==3||play.mode==4)&&PDMove()==0)/*下不变化*/
{
PDgo();
return;
}
else if((play.mode==5||play.mode==6)&&PLMove()==0)/*左不变*/
{
PLgo();
return;
}
else if(play.mode>6&&PUMove()==0)/*上不变*/
{
PUgo();
return;
}
flag=1;
while(flag)
{
randflag=random(4)+1;
if(randflag==1)/*右边*/
{
if(PRMove()!=0)
continue;
PRgo();
flag=0;
}
else if(randflag==2)/*下方*/
{
if(PDMove()!=0)
continue;
PDgo();
flag=0;
}
else if(randflag==3)/*左边走*/
{
if(PLMove()!=0)
continue;
PLgo();
flag=0;
}
else if(randflag==4)/*往上走*/
{
if(PUMove()!=0)
continue;
PUgo();
flag=0;
}
}
}
void AmyModeChange(int i)/*敌人的变化*/
{
int randflag,flag;
if(amy[i].mode<3&&RMove(i)==0)/*右边笔直走*/
{
Rgo(i);
return;
}
else if((amy[i].mode==3||amy[i].mode==4)&&DMove(i)==0)/*下不变化*/
{
Dgo(i);
return;
}
else if((amy[i].mode==5||amy[i].mode==6)&&LMove(i)==0)/*左不变*/
{
Lgo(i);
return;
}
else if(amy[i].mode>6&&UMove(i)==0)/*上不变*/
{
Ugo(i);
return;
}
if(a
my[i].flag==1)
{
switch(amy[i].mode)
{
case 1:
case 2:amy[i].mode=6;break;
case 3:
case 4:amy[i].mode=8;break;
case 5:
case 6:amy[i].mode=2;break;
case 7:
case 8:amy[i].mode=4;break;
}
amy[i].flag=0;
}
flag=1;
while(flag)
{
randflag=random(4)+1;
if(randflag==1)/*右边*/
{
if(AmyRight(i)<8)
{
if(amy[i].mode==5||amy[i].mode==6)
continue;
}
if(RMove(i)!=0)
continue;
amy[i].x+=0.5;
if(amy[i].mode==2)
amy[i].mode=1;
else if(amy[i].mode==1)
amy[i].mode=2;
else
amy[i].mode=2;
flag=0;
}
else if(randflag==2)/*下方*/
{
if(AmyRight(i)<8)
{
if(amy[i].mode>6)
continue;
}
if(DMove(i)!=0)
continue;
amy[i].y+=0.5;
if(amy[i].mode==3)
amy[i].mode=4;
else if(amy[i].mode==4)
amy[i].mode=3;
else
amy[i].mode=4;
flag=0;
}
else if(randflag==3)/*左边走*/
{
if(LMove(i)!=0)
continue;
amy[i].x-=0.5;
if(amy[i].mode==5)
amy[i].mode=6;
else if(amy[i].mode==6)
amy[i].mode=5;
else amy[i].mode=6;
flag=0;
}
else if(randflag==4)/*往上走*/
{
if(UMove(i)!=0)
continue;
amy[i].y-=0.5;
if(amy[i].mode==7)
amy[i].mode=8;
else if(amy[i].mode==8)
amy[i].mode=7;
else
amy[i].mode=8;
flag=0;
}
}
}
void DrawBrick(int x,int y)/*画砖*/
{
setfillstyle(SOLID_FILL,6);
bar(30+x*30-14,40+y*30-14,30+x*30+14,40+y*30+14);
setcolor(15);
line(30+x*30-9-5,40+y*30-4-1,30+x*30+9+5,40+y*30-4-1);
line(30+x*30-9-5,40+y*30+4+1,30+x*30+9+5,40+y*30+4+1);
line(30+x*30-4-1,40+y*30-9-5,30+x*30-4-1,40+y*30+9+5);
line(30+x*30+4+1,40+y*30-9-5,30+x*30+4+1,40+y*30+9+5);
}
void DrawFood(int x,int y)/*画食物*/
{
PrintTbf(30+x*30-14,40+y*30-14,tbfFOOD,7);
}
void DrawFirst()/*开始画面*/
{
int i,j;
setfillstyle(SOLID_FILL,7);
bar(0,0,640,480);
for(i=0;i<14;i++)
for(j=0;j<20;j++)
if(MAP[i][j]==2)/*砖头*/
DrawBrick(j,i);
else if(MAP[i][j]==0)
DrawFood(j,i);/*画心,这里作为食物处理*/
}
void GameWin()/*胜利*/
{
int key;
TbfMode();
InputTbf("esmile.tbf",tbfAMY);
DrawFrame(220,190,420,250,7);
HZ12(280,195,19,0,"你胜利了!");
PrintTbf(300,215,tbfAMY,RED);
while(1)
{
key=bioskey(0);
if(key==ENTER)
break;
}
}
void GameOver()/*游戏失败*/
{
int key,i,j;
for(i=1;i<=16;i+=2)
{
if(i>7)
j=i-9+1;
else
j=i;
ClrPlay();
play.mode=j;
TbfMode();
for(j=0;j<N;j++)
{
if(amy[j].x==play.x&&amy[j].y==play.y)/*与玩家碰在一起的敌人不显示出来*/
continue;
else if(j<3)
AmyMode(j);
else
AmyMode1(j);
}
for(j=0;j<4;j++)
{
if(j!=0)
sound(50*(16-i));
AmyClockTime(0);
}
nosound();
}
InputTbf("ecry.tbf",tbfAMY);
DrawFrame(220,190,420,250,7);
HZ12(280,195,19,0,"你失败了!");
PrintTbf(300,215,tbfAMY,RED);
while(1)
{
key=bioskey(0);
if(key==ENTER)
break;
}
}
void MapCopy(int (*a)[20],int (*b)[20])/*转换地图*/
{
int i,j;
for(i=0;i<14;i++)/*交换地图*/
{
for(j=0;j<20;j++)
a[i][j]=b[i][j];
}
}
void PrintScore()
{
setfillstyle(SOLID_FILL,7);
bar(140,0,200,25);
HZ12(80,8,20,0,"得分:");
sprintf(str,"%d",score);
setcolor(0);
outtextxy(150,10,str);/*显示得分*/
}
void TongJi()/*计算要多少分才可以过关*/
{
int i,j;
WINNUM=0;/*统计需要多少分数才过关*/
for(i=0;i<14;i++)
for(j=0;j<20;j++)
if(MAP[i][j]==0)
WINNUM++;
}
void GamePlay()/*游戏的具体过程*/
{
int key;
int i;
int foodi,foodj,foodflag;/*判定是敌人走过的地方是否要重新显示心*/
DrawFirst();/*显示当前地图*/
TongJi();/*统计要多少分才及格*/
timeflag=0;
play.x=1;/*玩家初值*/
play.y=1;
play.life=1;
play.mode=2;
play.move=0;
amy[0].y=1;/*敌人的初始坐标以及方向*/
amy[0].x=18;
amy[0].mode=6;
amy[1].y=12;
amy[1].x=1;
amy[1].mode=2;
amy[2].y=12;
amy[2].x=18;
amy[2].mode=6;
amy[3].y=8;
amy[3].x=10;
amy[3].mode=8;
amy[4].y=5;
amy[4].x=5;
amy[4].mode=6;
amy[5].y=8;
amy[5].x=13;
amy[5].mode=8;
for(i=0;i<N;i++)
amy[i].flag=0;
score=0;/*一开始的分数*/
while(1)
{
for(i=0;i<N;i++)/*玩家撞敌人*/
{
if(play.x==amy[i].x&&play.y==amy[i].y)
{play.life=0;break;}
}
if(play.life==0)/*玩家移动后碰到敌人死去*/
{
GameOver();
break;
}
play.j=play.x;/*玩家计算i,j坐标*/
play.i=play.y;
if(MAP[play.i][play.j]==0&&play.x-play.j<0.1&&play.y-play.i<0.1)/*吃到一个食物*/
{
score++;
PrintScore();
TbfMode();
for(i=0;i<N;i++)
{
if(i<3) AmyMode(i);
else AmyMode1(i);
}
MAP[play.i][play.j]=-1;/*吃到食物后变为空地*/
}
if(score==WINNUM)/*玩家胜利*/
{
GameWin();
break;
}
if(play.move==0)/*假如有变化就重新显示*/
{
PrintScore();
TbfMode();
play.move=1;
}
while(1)/*敌人自动移动*/
{
for(i=0;i<N;i++)/*amy meet player*/
{
if(play.x==amy[i].x&&play.y==amy[i].y)
{play.life=0;break;}
}
if(play.life==0)/*敌人自动的过程中碰到玩家*/
break;
if(timeflag==3)/*敌人和玩家都改自动移动的时候*/
{
sound(250);/*敌人移动的时候有声音*/
for(i=0;i<N;i++)/*first must clear*/
AmyClr(i);
for(i=0;i<N;i++)/*显示所有敌人*/
{
foodflag=0;/*表示没食物*/
amy[i].j=amy[i].x;
amy[i].i=amy[i].y;
foodi=amy[i].i;/*food x,y*/
foodj=amy[i].j;
if(MAP[amy[i].i][amy[i].j]==0)
foodflag=1;
if(foodflag)
DrawFood(foodj,foodi);
if(i<3)
AmyModeChange(i);/*这里是没跟踪功能的敌人*/
else
AmyModeChange1(i);/*厉害的敌人*/
if(i<3)
AmyMode(i);/*普通的敌人*/
else
AmyMode1(i);/*厉害的敌人*/
}
TbfMode();
timeflag=0;
for(i=0;i<N;i++)/*敌人碰到玩家*/
{
if(play.x==amy[i].x&&play.y==amy[i].y)
{play.life=0;break;}
}
if(play.life==0)/*敌人自动的过程中碰到玩家*/
break;
if(kbhit())/*按键盘跳出循环*/
{
key=bioskey(0);
AmyClockTime(0);
nosound();/*取消声音*/
break;
}
ClrPlay();
PlayModeChange();/*玩家自动变化*/
TbfMode();
for(i=0;i<N;i++)
{
if(i<3)
AmyMode(i)
;
else
AmyMode1(i);
}
play.j=play.x;/*玩家计算i,j坐标*/
play.i=play.y;
for(i=0;i<N;i++)/*amy meet player*/
{
if(play.x==amy[i].x&&play.y==amy[i].y)
{
play.life=0;break;
}
}
if(i<N)
break;
if(MAP[play.i][play.j]==0&&play.x-play.j<0.1&&play.y-play.i<0.1)/*吃到一个食物*/
{
score++;
PrintScore();
TbfMode();
MAP[play.i][play.j]=-1;/*吃到食物后变为空地*/
for(i=0;i<N;i++)
{
if(i<3)
AmyMode(i);
else
AmyMode1(i);
}
}
if(score==WINNUM)/*自动移动过程中胜利*/
break;
}
AmyClockTime(0);
nosound();/*取消声音*/
}
nosound();
if(score==WINNUM)/*玩家胜利*/
{
GameWin();
break;
}
if(play.life==0)/*游戏失败*/
{
GameOver();
break;
}
if(key==ESC)
break;
else if(key==RIGHT)/*右边移动*/
{
if(PRMove()!=0)
continue;
ClrPlay();
PRgo();
play.move=0;
}
else if(key==LEFT)/*左边移动*/
{
if(PLMove()!=0)
continue;
ClrPlay();
play.move=0;
PLgo();
}
else if(key==UP)/*上键盘移动*/
{
if(PUMove()!=0)
continue;
ClrPlay();
play.move=0;
PUgo();
}
else if(key==DOWN)/*下键盘移动*/
{
if(PDMove()!=0)
continue;
ClrPlay();
play.move=0;
PDgo();
}
}
if(GUAN==1&&score==WINNUM)/*过了第一关继续过第二关*/
{
GUAN++;
MapCopy(MAP,MAP2);
score=0;
timeflag=0;
GamePlay();
}
if(GUAN==2&&score==WINNUM)/*过了第二关继续过第三关*/
{
GUAN++;
MapCopy(MAP,MAP3);
score=0;
timeflag=0;
GamePlay();
}
}
void Close()
{
closegraph();
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |