#include "graphics.h"
#include "stdlib.h"
#include "dos.h"
#include "bios.h"
#include "stdio.h"
#include "time.h"
#include "graphics.h"
#include "conio.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
#define SPACE 0x3920
/*游戏中人物的结构体*/
struct play
{
int x;
int y;
};
struct Snow
{
int x;
int y;
int speed;
}snow[100];
int snownum=0;
struct play you,them[5];
void *save;
int sum=0;/*统计吃的豆子个数,吃满50颗就算胜利*/
int change=10;
/*0豆子,1空地2,墙壁,3自己,4敌人*/
int a[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,2,
2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2,
2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2,
2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,
2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2,
2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,
2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2,
2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2,
2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2,
2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,
2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2,
2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2,
2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
/*数组就是地图( level 1)*/ ;
int b[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,2,
2,1,2,2,2,2,1,2,1,1,0,0,0,1,1,4,1,1,0,2,
2,1,1,0,2,2,1,2,0,1,2,2,2,2,2,2,0,0,0,2,
2,4,1,0,2,1,1,2,1,1,1,0,1,1,2,1,0,1,1,2,
2,1,2,1,2,1,1,2,2,3,2,2,1,1,2,1,2,2,1,2,
2,1,2,1,2,2,1,1,1,1,1,1,1,0,0,0,1,1,1,2,
2,2,2,1,0,2,1,1,1,2,1,0,1,2,2,2,1,1,1,2,
2,2,0,1,0,2,2,1,1,2,1,0,1,2,2,1,4,1,1,2,
2,1,0,2,0,1,2,1,2,2,1,0,1,2,1,1,1,1,1,2,
2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,
2,1,1,2,1,1,2,1,1,2,1,0,2,1,2,2,2,1,1,2,
2,1,2,2,1,2,2,2,1,1,1,0,1,4,1,2,0,0,1,2,
2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
/*数组就是地图( level 2)*/
int c[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,1,1,0,0,0,0,0,1,0,0,0,1,1,2,1,1,1,0,2,
2,1,2,2,2,1,1,2,2,1,0,0,0,1,2,4,1,1,0,2,
2,1,1,0,2,2,1,2,0,1,2,2,2,2,2,2,0,0,0,2,
2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,
2,1,2,1,2,1,2,2,1,3,2,2,1,1,1,1,2,2,1,2,
2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,
2,1,2,1,0,2,1,1,1,2,2,0,1,2,2,2,1,1,1,2,
2,2,0,1,0,1,2,1,2,2,1,0,1,2,1,1,4,1,1,2,
2,2,0,2,0,1,2,1,1,2,1,0,1,2,2,1,1,1,1,2,
2,2,0,2,1,1,2,2,1,2,1,0,2,2,1,0,0,0,1,2,
2,1,1,2,1,1,2,1,1,2,2,0,2,1,1,2,2,2,1,2,
2,1,2,2,1,2,2,1,2,1,1,0,1,4,1,2,0,0,1,2,
2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
/*数组就是地图( level 3)*/
int xx[5][2];/*判断敌人方向用的结构体*/
int false=0; /*判断输赢的参数*/
/*************************选择关卡********************************************************************/
void levelchoose(int x)
{
int j,k;
switch(x)
{
case 1:break;
case 2:for(j=0;j<15;j++)
for(k=0;k<20;k++)
a[j][k]=b[j][k];
break;
case 3:for(j=0;j<15;j++)
for(k=0;k<20;k++)
a[j][k]=c[j][k];
break;
default:break;
}
}
/*********************欢迎界面*************************************************************************/
void hello()
{
/*输出界面*/
printf("XXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXX\n");
printf("X XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");
printf("X XXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");
printf("X XXX X XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");
printf("X XXX X XXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");
printf("X XXX XXX XXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXX\n");
printf("X XXX XXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXX\n");
printf("X XXX XXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXX XX XXXXXXXXXX\n");
printf("X XXXX XXXXXXXXXXXXXXX XXXXXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXX\n");
printf("X XXX XXX XXXXXXXXXXXXXXXXX XXXXXX XXXXXXXXXXXXXX XXXXXX XXXXXXXX\n");
printf("X XXX XXX XXXXXX XXXXXXXXXX XXXX XXXXXXXXXXXXX XXXXXXX XXXXXXX\n");
printf("XXXXXXXXXX XXXXXXX XXXXXXXXXX XXXXX XXXXXXXXXXXXX XXXXXXXX XXXXX\n");
printf("XXXXXXXXXXX XXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXX XXXX\n");
printf("XXXXXXXXXXX XXXXX XXXX XXXXXXXXXXXX XXX\n");
printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n");
printf("X XXXXXX XXXXXXXX XXX XXXX XXXXX XXXXXX XXXXX X\n");
printf("X XXXXX XXXXXX XXXXXXX XXX XXX XXXX XXXXX XXXXXX XXXXX X\n");
printf("X XXXXXX XXXXX XXXXXXX XXXXX XX XX XXXXX XXXXXX XXXX X\n");
printf("X XXXXXX XXXX X XXXXX XXXXXX XX XX XXXX X XXXXX XXXX X\n");
printf("X XXXXXX XXXX X XXXXX XXXXXX XX XX XXXX X XXXXX X XXX X\n");
printf("X XXXXXX XXXX X XXXXX XXXXXXXXXX X XX X XXXX X XXXXX X XXX X\n");
printf("X XXXXX XXXX XXX XXXX XXXXXXXXXX X X XXX XXX XXXX XX XX X\n");
printf("X XXXX XXX XXXX XXXXXXXXXX X X XXX XXX XXXX XX XX X\n");
printf("X XXXXXXXXXXX XXXX XXXXXX XX X X XXX XXXX XXX X X\n");
printf("X XXXXXXXXXX XXXXX XXX XXXXXX XX X X XX XXXXX XXX XXXX X\n");
printf("X XXXXXXXXXX XXXXX XXXX XXXX XX XX XX XX XXXXX XXX XXXX X\n");
printf("X XXXXXXXXXX XXXXX XXXX XXX XXX XX XX XX XXXXX XXX XXXXX X\n");
printf("X XXXXXXXXX XXXXXXX XXXX XXXX XX XX X XXXXXXX XX XXXXX X\n");
}
/*********************游戏说明*************************************************************************/
void instruction()
{
printf(" *****************************************\n");
printf(" * GAME INSTRUCTIONS *\n");
printf(" *****************************************\n");
printf(" WELCOME TO PACMAN WORLD!\n\n");
printf("Press up,down,left,right to play.\n");
printf("Press Esc to quit it.\n");
printf("Press space to reset the game when you are playing.\n");
printf("How to win the game:\n");
printf("\tIf you have aten all of the yellow peans without being in the same location with the green enemy , you win ! \n");
printf("\tIf you are in the same location with the green enemy ,you lose !\n");
printf("Please choose game level number from 1 to 3 and press Enter key to start game :\n");
}
/**************************延时函数 传入微秒数***************************************************************************/
void TimeDelay(unsigned long microsec)
{
union REGS r;
r.h.ah=0x86;
r.x.cx=microsec>>16;
r.x.dx=microsec;
int86(0x15,&r,&r);
}
/***************************吃豆子的函数*********************************************************************************/
drawblackdou(int x,int y)
{
setcolor(0);
circle(100+y*20,100+x*20,3);
/*吃到豆子后就加一*/
sum++;
/*吃到后这里就成为普通平地*/
a[x][y]=1;
}
/*******************播放音乐的函数*********************************************************************/
void Pr()
{
int s[15]={0,100,150,200,50,150,250,300,250,300,250,150,100,250,350};
/*改变欢迎词的颜色*/
setcolor(change/10);
/*改变欢迎词的字体*/
settextstyle(0,0,4);
/*输出欢迎词*/
outtextxy(20,200,"WELCOME TO OUR GAME!!");
outtextxy(20,250,"Press Space key to");
outtextxy(20,300,"continue...");
/*使扬声器以s[change/10]的频率发声*/
sound(s[change/10]);
}
/******************播放动画音乐**************************************************************************************/
void DrawSnow()
{
int i;
int sx[62];
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
/*一次3行画出白色雪花的3条线*/
line(1,1,9,9);
line(0,5,10,5);
line(9,1,1,9);
/*在堆中申请200字节空间*/
save=malloc(200);
/*将雪花位图保存到save中*/
getimage(0,0,10,10,save);
/*清屏*/
cleardevice();
/*设置随机数的种子数*/
randomize();
/*计算雪花位置的横坐标数组*/
for(i=0;i<62;i++)
sx[i]=(i+2)*10;
/*******************以下的键控while循环控制播放音乐和下雪动画********************************************/
/*如果未按键,执行循环体*/
while(!kbhit())
{
Pr();
if(snownum!=100)
{
snow[snownum].speed=2+random(5);
i=random(62);
/*取横坐标*/
snow[snownum].x=sx[i];
/*计算纵坐标*/
snow[snownum].y=10-random(100);
}
/*循环放置snownum个雪花*/
for(i=0;i<snownum;i++)
putimage(snow[i].x,snow[i].y,save,COPY_PUT);
/*延迟100ms以便看到雪花*/
delay(100);
/*清屏*/
cleardevice();
/*调用 Pr函数输出欢迎词并播放声音*/
Pr();
/*循环画出snownum个雪花*/
if(snownum!=100) snownum++;
setfillstyle(SOLID_FILL,15);
for(i=0;i<snownum;i++)
{
snow[i].y+=snow[i].speed;
putimage(snow[i].x,snow[i].y,save,COPY_PUT);
if(snow[i].y>500) snow[i].y=10-random(200);
}
change++;
if(change==140)
change=10;
}
nosound();
cleardevice();
}
/*****************图形系统初始化函数************************************************************************/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/***************************开始函数****************************************************************/
begain()
{
int i,j;
sleep(1);
for(i=0;i<15;i++)
for(j=0;j<20;j++)
/*代表墙壁*/
if(a[i][j]==2)
{
setfillstyle(SOLID_FILL,BLUE);
bar(100+j*20-10,100+i*20+10,100+j*20+10,100+i*20-10);
}
/*代表自己*/
else if(a[i][j]==3)
{
setcolor(RED);
circle(100+j*20,100+i*20,9);
}
/*代表敌人*/
else if(a[i][j]==4)
{
setcolor(GREEN);
circle(100+j*20,100+i*20,9);
}
/*代表豆子*/
else if(a[i][j]==0)
{
setcolor(YELLOW);
circle(100+j*20,100+i*20,3);
}
/*敌人也自己的开始坐标*/
you.x=5;you.y=9;
them[0].x=2;them[0].y=15;
them[1].x=4;them[1].y=1;
them[2].x=8;them[2].y=16;
them[3].x=12;them[3].y=13;
them[4].x=13;them[4].y=7;
}
/************************敌人移动的过程********************************************************************/
void movethem(struct play *them)
{
int i,loop;
randomize();
for(i=0;i<5;i++)
{
if(you.x==them[i].x&&(them[i].y+1)==you.y)
them[i].y++;
else if(you.x==them[i].x&&(them[i].y-1)==you.y)
them[i].y--;
else if(you.y==them[i].y&&(them[i].x+1)==you.x)
them[i].x++;
else if(you.y==them[i].y&&(them[i].x-1)==you.x)/*只要控制者在身边就立即靠上去*/
them[i].x--;
else
{
loop:
/*这里的方向采取随机赋值,原则是新的方向不可以和原来的方向相反*/
xx[i][0]=rand()%4+1;
if(xx[i][0]==1&&xx[i][1]==2||xx[i][0]==2&&xx[i][1]==1)
goto loop;
if(xx[i][0]==3&&xx[i][1]==4||xx[i][0]==4&&xx[i][1]==3)
goto loop;
xx[i][1]=xx[i][0];
if(xx[i][0]==1)/*四个方向*/
{
them[i].x--;
if(a[them[i].x][them[i].y]==2)/*如果碰墙壁的话就回到原来的地方等待随机的方向*/
{them[i].x++;
goto loop;
}
}
else if(xx[i][0]==2)
{
them[i].x++;
if(a[them[i].x][them[i].y]==2)
{them[i].x--;
goto loop;
}
}
else if(xx[i][0]==3)
{
them[i].y++;
if(a[them[i].x][them[i].y]==2)
{them[i].y--;
goto loop;
}
}
else if(xx[i][0]==4)
{
them[i].y--;
if(a[them[i].x][them[i].y]==2)
{them[i].y++;
goto loop;
}
}
}
}
}
/**********************敌人移动中的判断************************************************************************/
fun(struct play *them)
{
int i;
/*把敌人原来的位置删除*/
setcolor(0);
for(i=0;i<5;i++)
circle(them[i].y*20+100,them[i].x*20+100,9);
/*根据控制者的位置来决定敌人的移动方向*/
movethem(them);
}
/*********************胜利的话***********************************************************************************/
win()
{
cleardevice();
settextstyle(0,0,4);
while(!kbhit())
{
setcolor(rand()%13+1);
outtextxy(200,200,"YOU WIN!");
delay(1000);
}
}
/*********************失败的话***********************************************************************************/
false1()
{
cleardevice();
settextstyle(0,0,4);
while(!kbhit())
{
setcolor(rand()%13+1);
outtextxy(180,200,"GAME OVER!");
delay(1000);
}
}
loseyes()/*判断是否失败*/
{
int i;
for(i=0;i<5;i++)
if(them[i].x==you.x&&them[i].y==you.y)
/*如果失败的话*/
false=1;
}
/*********************主控函数*******************************************************************/
main()
{
int gd=DETECT,gm;
int key,i,loop,jump;
int choice;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
DrawSnow();
hello();
getchar();
instruction();
scanf("%d",&choice);
levelchoose(choice);
getchar();
loop:
Init();
/*开始画面*/
begain();
while(!kbhit())
{
/*重画敌人*/
for(i=0;i<5;i++)
setfillstyle(SOLID_FILL,GREEN);
circle(them[i].y*20+100,them[i].x*20+100,9);
TimeDelay(280000);
for(i=0;i<5;i++)
if(them[i].x==you.x&&them[i].y==you.y)
false=1;/*如果失败的话*/
loseyes();/*判断是否失败*/
if(false)
break;
key=bioskey(0);
setcolor(0);/*把自己原来位置的人给删除掉*/
circle(100+you.y*20,100+you.x*20,9);
fun(them);/*处理敌人*/
/*ESC键退出游戏*/
if(key==ESC)
break;
/*SPACE键重新开始本关游戏*/
if (key==SPACE)
goto loop;
/*这里开始的判断主要是是否吃到豆子和碰到墙壁*/
else if(key==UP)
{
you.x--;
if(a[you.x][you.y]==2)
you.x++;
else if(a[you.x][you.y]==0)
drawblackdou(you.x,you.y);
}
else if(key==DOWN)
{
you.x++;
if(a[you.x][you.y]==2)
you.x--;
else if(a[you.x][you.y]==0)
drawblackdou(you.x,you.y);
}
else if(key==RIGHT)
{
you.y++;
if(a[you.x][you.y]==2)
you.y--;
else if(a[you.x][you.y]==0)
drawblackdou(you.x,you.y);
}
else if(key==LEFT)
{
you.y--;
if(a[you.x][you.y]==2)
you.y++;
else if(a[you.x][you.y]==0)
drawblackdou(you.x,you.y);
}
if(sum==50)
break;
/*执行了一次键盘后再画出自己的位置*/
setcolor(RED);
circle(100+you.y*20,100+you.x*20,9);
for(i=0;i<5;i++)
{setcolor(GREEN);
circle(them[i].y*20+100,them[i].x*20+100,9);
}
setcolor(RED);
/*判断自己是否碰到敌人*/
loseyes();
if(false)
break;
}
/*吃满豆子了即获胜条件*/
if(sum==50)
{win();getch();}
if(false)
{false1();getch();}
closegraph();
}