#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语言源代码


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