⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 110.c

📁 c语言版飞机闪射
💻 C
📖 第 1 页 / 共 2 页
字号:


/*这份代码经源码格式软件格式化过
     yang_hx@neusoft.com      */
#include<stdlib.h>
#include<stdio.h>
#include<graphics.h>
#include<dos.h>
#include<io.h>
#include<conio.h>
#include<math.h>
#include "stdlib.h" 
#include<time.h>
#include "KEY.c" 
#include "fei2.c"
#include "gameover.c"
#include "graphics.h" 
#include "Svga256.h" 
#include "stdio.h" 
#include "fcntl.h" 
#include "malloc.h" 
#define RIGHT 0x4d00
#define LEFT  0x4b00
#define GAME_SPEED 100 
#define BULLET_SUM 30 
#define PLAYER_MOVE_SPEED 5 
#define UP 0x4800 
#define DOWN 0x5000
#define Q  0x1000
#define ESC 0x11b 
#define ENTER 0x1c0d 
#define PI 3.1415927 
#define GAME_SPEED 100 
#define BULLET_SUM 30 
#define PLAYER_MOVE_SPEED 20

/*延时,*/
int TimeDelayUnit(float t)
{
    static clock_t start_time=0,end_time ;
    if(start_time==0)
    {
        start_time=clock();
    }
    end_time=clock();
    if((end_time-start_time)/CLK_TCK>=t)
    {
        start_time=0 ;
        return(1);
    }
    else 
    return(0);
}
/*生命直*/
void DISPLAY_HP(int HP)
{
    int x ;
    int HP_X=384 ;
    x=HP_X-(100-HP);
    setcolor(15);
    rectangle(282,9,386,23);
    setfillstyle(1,2);
    bar(282+1,9+1,386-1,23-1);
    setfillstyle(1,4);
    bar(282+2,9+2,386-2,23-2);
    if(HP!=100)
    {
        setfillstyle(1,0);
        bar(x,11,384,21);
    }
}
/*改变调色板*/
void set_color(int color,int R,int G,int B)
{
    static union REGS regs ;
    switch(color)
    {
        case 6 :
        color=20 ;
        break ;
        case 8 :
        color=56 ;
        break ;
        case 9 :
        color=57 ;
        break ;
        case 10 :
        color=58 ;
        break ;
        case 11 :
        color=59 ;
        break ;
        case 12 :
        color=60 ;
        break ;
        case 13 :
        color=61 ;
        break ;
        case 14 :
        color=62 ;
        break ;
        case 15 :
        color=63 ;
        break ;
        default :
        break ;
    }
    regs.h.ah=0x10 ;
    regs.h.al=0x10 ;
    regs.x.bx=color ;
    regs.h.ch=G ;
    regs.h.cl=B ;
    regs.h.dh=R ;
    int86(0x10,&regs,&regs);
    return ;
}
/*VGA设置*/
void VGA_RESET()
{
    int driver=VGA ;
    int mode=VGAHI ;
    registerbgidriver(EGAVGA_driver);
    initgraph(&driver,&mode,"");
    cleardevice();
    setpalette(4,36);
    setpalette(10,18);
    setpalette(13,45);
    setpalette(9,11);
    setpalette(1,9);
    setpalette(12,32);
    set_color(7,112,112,112);
    set_color(8,95,95,95);
}
/******************************************************888*/


int huge Return_SVGA256(void)
{
    return(SVGA640x480x256);
    /* 返回各种分辨率的对应编号 0~6 宏定义参见 Svga256.h */
}

/*调用图片*/
int map(char*name)
{
    
    int width,height,i=DETECT,j=0,x0,y0,fp ;
    unsigned char fix,*buffer,pix24b[4];
    DacPalette256 dac256 ;
    installuserdriver("Svga256",Return_SVGA256);
    /* 对于svga256必需执行该函数以安装BGI驱动 */
    initgraph(&i,&j,"");
    /* 执行TC默认的BGI初始化函数 */
    
    if((fp=open(name,O_RDONLY|O_BINARY))==-1)
    {
        puts("Can't find file " "00.bmp" ".");
        return 1 ;
    }
    lseek(fp,18,SEEK_SET);
    read(fp,&width,4);
    read(fp,&height,4);
    fix=(width%4)?(4-width%4):0 ;
    
    x0=(640-width)/2 ;
    y0=(480-height)/2 ;
    lseek(fp,54,SEEK_SET);
    /* 按照该图片的DAC色表设置色彩寄存器 */
    for(i=0;i<256;i++)
    {
        read(fp,pix24b,4);
        /* 读取DAC分量信息 */
        /* 设置调色板 */
        dac256[i][0]=pix24b[2]>>2 ;
        dac256[i][1]=pix24b[1]>>2 ;
        dac256[i][2]=pix24b[0]>>2 ;
    }
    setvgapalette256(&dac256);
    /* 应用调色板, 定义参见 Svga256.h */
    buffer=(unsigned char*)malloc(width);
    for(j=height-1;j>=0;j--)
    {
        read(fp,buffer,width);
        lseek(fp,fix,SEEK_CUR);
        for(i=0;i<width;i++)
        putpixel(x0+i,y0+j,buffer[i]);
    }
    free(buffer);
    close(fp);
    getch();
    closegraph();
    
    
}
/*******************************************************************/
initmap()
{
    
    int d=DETECT,g ;
    registerbgidriver(EGAVGA_driver);
    initgraph(&d,&g,"");
}
/***********************************************************/
/*画子弹*/
void GB_BULLET(int x,int y,int mode)
{
    int COLOR1,COLOR2 ;
    if(mode==1)
    {
        COLOR1=14 ;
        COLOR2=4 ;
    }
    else if(mode==0)
    {
        COLOR1=0 ;
        COLOR2=0 ;
    }
    setfillstyle(1,COLOR1);
    bar(x,y,x+1,y+1);
    setcolor(COLOR2);
    line(x,y-1,x+1,y-1);
    line(x-1,y,x-1,y+1);
    line(x,y+2,x+1,y+2);
    line(x+2,y,x+2,y+1);
    
}
/*把TBF图片文件放如数组*/
void TRANSFORM(char filename[],int*NAME)
{
    int i,j ;
    char C ;
    FILE*fp ;
    /*打开TBF图片*/
    if((fp=fopen(filename,"r"))==NULL)
    {
        sound(450);
        delay(1200);
        nosound();
        return ;
    }
    for(i=0;i<=29;i++)
    {
        for(j=0;j<=29;j++)
        {
            C=fgetc(fp);
            *(NAME+(i*30+j))=(int)(C-65);
        }
        
    }
    fclose(fp);
}
/*显示TBF数组*/
void GB_TBF(int x,int y,int*NAME)
{
    int i,j,X,Y ;
    X=x ;
    Y=y ;
    for(i=0,y=Y;i<=29;i++,y++)
    {
        for(j=0,x=X;j<=29;j++,x++)
        if(*(NAME+(i*30+j))==3)
        {
            ;
        }
        else 
        {
            putpixel(x,y,*(NAME+(i*30+j)));
        }
    }
}
/***************************/

/**************************/
/*产生A--B的随机数*/
int Xrand(int A,int B)
{
    int x ;
    while(1)
    {
        x=random(B);
        if(x>=A);
        break ;
    }
    return x ;
}
/**************************************/
/*子弹与飞机两点的距离*/
double DZ(double X1,double Y1,double X2,double Y2)
{
    double D ;
    D=sqrt(fabs((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)));
    return(D);
}
/***************************************/
/*移动到。。。。*/
void MOVE_TO3(int oa,float*PX,float*PY,int D)
{
    *PX+=D*cos(oa*PI/180);
    *PY+=D*sin(oa*PI/180);
}
/********************************************/
/*得到中心点到目标点的角度*/
int ASK_a(int X1,int Y1,int X2,int Y2)
{
    double duibian,xiebian ;
    double k ;
    double m=0 ;
    if(X1==X2&&Y1==Y2)
    {
        return(-1);
    }
    if(Y2>Y1)
    duibian=Y2-Y1 ;
    else 
    duibian=Y1-Y2 ;
    xiebian=DZ(X1,Y1,X2,Y2);
    k=duibian/xiebian ;
    if(k>=-1&&k<=1)
    {
        /*防止asin()出错*/
        m=asin(k)/PI*180 ;
        if(X1>X2&&Y1>Y2)
        {
            m=180+m ;
        }
        else if(X1<X2&&Y1>Y2)
        {
            m=360-m ;
        }
        else if(X1>X2&&Y1<Y2)
        {
            m=180-m ;
        }
        else if(X1>X2&&Y1<Y2)
        {
            ;
        }
        else if(X1<X2&&Y1==Y2)
        {
            m=0 ;
        }
        else if(X1==X2&&Y1<Y2)
        {
            m=90 ;
        }
        else if(X1>X2&&Y1==Y2)
        {
            m=180 ;
        }
        else if(X1==X2&&Y1>Y2)
        {
            m=270 ;
        }
        return(m);
    }
    else 
    return(-1);
}


/************************************************************/
/*引擎*/
run(char*fly,int PLAYER,int D)
{
    int flag=0,add 
    ;
    int END=0 ;
    int key ;
    int y2=130,y1=100 ;
    int n,i,j,tt,tv;
    struct time t ;
    int R ;
    int TimeM=0 ;
    int TimeS=0 ;
    char TM[3];
    char TS[3];
    char*name ;
    /*定义玩家结构*/
    struct player 
    {
        int LIVE ;
        int X1 ;
        int Y1 ;
        int X0 ;
        int Y0 ;
        int HP ;
        int move ;
        int LIFE ;
    }
    ;
    struct player P ;
    struct BB 
    {
        int RUN ;
        float PX ;
        float PY ;
        int oa ;
        int LB ;
        int MAX_LB ;
    }
    ;
    int PLANE[30][30];
    int baoza[30][30];
    int hp[30][30];
    struct BB EB[BULLET_SUM];
    int x1,y9,S ,A,B;
    int hp_x[30],hp_y=25 ;
        int a[100];
    FILE*fp;
    P.X1=300 ;
    P.Y1=240 ;
    P.X0=P.X1 ;
    P.Y0=P.Y1 ;
    P.HP=100 ;
    P.LIVE=4;
    P.LIFE=3;
    B=3;
    closegraph();
    start :;
    VGA_RESET();
    TRANSFORM(fly,&PLANE[0][0]);
    /*加载TBF图片*/
    /*绘制共有几条命*/
   /*if(B==1)
      {P.LIFE++;}*/
      if(B<5)
    { P.LIFE=B;
    for(S=130,i=0;i<B;S+=24,i++)
    
       {
        GB_TBF(S,1,&PLANE[0][0]);
       }
     }
    for(n=0;n<BULLET_SUM;n++)
    /*敌人子弹初始化*/
    {
        EB[n].RUN=0 ;
        EB[n].MAX_LB=4 ;
        EB[n].LB=EB[n].MAX_LB ;
    }

   if (P.LIFE <=0)
    /*玩家没命了 GAME OVER 游戏结束*/
    {
        closegraph();
        over();
     tt=TimeS;
     tv=TimeM;
    memset(a,0,sizeof(a));/*设置a中的所有字节为0, a数组的大小由sizeof(a)给定*/
    fp=fopen("c:\\min.txt","a+");
    fread(a,4,5,fp);
    setcolor(2);
    settextstyle(0, 0, 2);
    outtextxy(220, 100, a);
    fclose(fp);

fp=fopen("c:\\min.txt","w");
fprintf(fp,"%d ",tv);
fprintf(fp," %d  ",tt);
setcolor(4);
settextstyle(0, 0, 2);
outtextxy(265, 350, TS);
outtextxy(220, 350, TM);
fclose(fp);
        /*setcolor(15);
        settextstyle(0, 0, 2);
        outtextxy(226, 260, "TIME");
        setcolor(10);
        sprintf(TM, "%02d", TimeM);
        outtextxy(312, 260, TM);
        outtextxy(342, 260, ":");
        sprintf(TS, "%02d", TimeS);
        outtextxy(357, 260, TS);等待3秒*/
        sleep(3);
        exit(0);
    }
    /*显示最初的界面*/
    gettime(&t);
    R=t.ti_hund ;
    srand(R);
    P.HP=100 ;
    setcolor(15);
    settextstyle(0,0,2);
    outtextxy(60,10,"LIFE");
    outtextxy(245,10,"HP");
    DISPLAY_HP(P.HP);
    outtextxy(420,10,"TIME");
    setcolor(10);
    sprintf(TM,"%02d",TimeM);
    outtextxy(506,10,TM);
    outtextxy(536,10,":");
    sprintf(TS,"%02d",TimeS);
    outtextxy(551,10,TS);
    InstallKeyboard();
    if(P.LIVE==4)
    {
        while(1)
        {
            setfillstyle(1,0);
            setcolor(9);
            outtextxy(200,250,"PRESS ENTER TO START");
            /*进入游戏*/
            sleep(1);
            if(GetKey(KEY_ENTER))
            {
                {
                    bar(200,250,520,268);

                    break ;
                }
            }
        }
    }

    while(flag!=1)
    {
        P.LIVE--;
        /*敌人的子弹*/
        aaa :
        ;
        for(n=0;n<BULLET_SUM;n++)
        {
            if(EB[n].RUN==1)
            {
                if(EB[n].LB<=0)
                {
                    GB_BULLET(EB[n].PX,EB[n].PY,0);
                    MOVE_TO3(EB[n].oa,&EB[n].PX,&EB[n].PY,10);
                    GB_BULLET(EB[n].PX,EB[n].PY,1);
                    EB[n].LB=EB[n].MAX_LB ;
                }
                if(EB[n].PX<=5||EB[n].PX>=638||EB[n].PY<=40||
                EB[n].PY>=465)
                /*子弹碰墙 消失*/
                {
                    GB_BULLET(EB[n].PX,EB[n].PY,0);
                    EB[n].RUN=0 ;
                }
                EB[n].LB--;
                /*延时*/
                
                delay(90);
            }
        }
        /*判断接触*/
        for(n=0;n<BULLET_SUM;n++)
        {
            if(EB[n].RUN==1)
            {
                if(P.HP>=2)
                {
                    /*S=DZ(P.X1+15,P.Y1+1,EB[n].PX,EB[n].PX);*/
                    if(EB[n].PX>=P.X1&&EB[n].PX<=P.X1+29&&EB[n].PY>=P.Y1&&EB[n].PY<=P.Y1+29)
                    {   /*hp_x[n]=Xrand(200,500);*/
                        P.HP=P.HP-5 ;
                        /*击中玩家HP-5*/
                        DISPLAY_HP(P.HP);
                        sound(450);
                        /*提示音*/
                        delay(1500);
                        nosound();
                        GB_BULLET(EB[n].PX,EB[n].PY,0);
                        EB[n].RUN=0 ;
                        
                    }
                }
            }
        }
        /*游戏的延时*/
        delay(D);

        /*时间是20的倍数时显示你很棒*/
        if((TimeS+1)%41==0)
        {
            setcolor(RED);
            outtextxy(250,100,"SUPERMAN!");
            delay(5000);
            setcolor(0);
            outtextxy(250,100,"SUPERMAN!");
        }

        /*时间是40的倍数时飞机加一*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -