#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();
}

吃豆人C语言源代码


人生有無數種可能,人生有無限的精彩,人生沒有盡頭。一個人只要足夠的愛自己,尊重自己內心的聲音,就算是真正的活著。