📄 110.c
字号:
/*这份代码经源码格式软件格式化过
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,®s,®s);
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 + -