📄 demo.cpp
字号:
// 空战摸拟源程序,林伟 1999年7月30日
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <conio.h>
#include <mem.h>
#include <time.h>
#include <math.h>
#include <lsys.h>
#include <ldraw.h>
#include <lkey.h>
#pragma library("lsys.lib")
#pragma library("ldraw.lib")
#pragma library("lkey.lib")
#define MAX_STAR 80
#define MAX_OBJ 30
#define MAXX (GModeData.LEN-1)
#define MAXY (GModeData.WID-1)
typedef unsigned long ulong;
LSURFACE layer;
MIDI *midi;
char *fly_pic; // keys[0..100] 键盘上各键的状态
// 键盘码
char GameStart();
struct TStars { int x,y,v; } Stars[MAX_STAR];
struct TObj { int mode,type,index,next,x,y; } Objs[MAX_OBJ];
long GameScore=0;
void copyright()
{ printf("Game Over. your score %ld\n",GameScore);
printf("Thank you for play it, if you have any question please call me\n");
printf("(0871)7167710 or lwwind@yeah.net, Lin Wei\n");
}
int random(int x)
{ ulong t,time;
_disable();
outp(0x43,0); t=inp(0x40);
t+=(inp(0x40)<<8); t=0xffff^t;
_enable(); // (not t) + (clock()<<16)
time=(clock()<<16)+t;
return (time%x);
}
void main()
{ int i;
RGB pal[256];
lt_install_timer();
lmMidiInit(MIDI_AUTO);
lkInitKey();
midi=lmLoadMidi("demo2.mid",0);
fly_pic=lrPicFile("demo.pcx",0,pal);
if (!fly_pic) { printf("read demo.pcx error\n"); return; }
for (i=0;i<MAX_STAR;i++) { Stars[i].x=random(320); Stars[i].y=-20+random(250);
Stars[i].v=1; if (i<MAX_STAR/3) Stars[i].v++; } // 星空初始化
for (i=0;i<MAX_OBJ;i++) Objs[i].mode=0; // 物体初始化
lInitGraph(SVGA_320X200);
lCreateSurface(GModeData.LEN,GModeData.WID,&layer,NULL,LSM_MEMORY);
lActiveSurface(&layer);
GameStart();
delete fly_pic;
lDeleteSurface(&layer);
lkRestKey();
lCloseGraph();
lmMidiRest();
lt_remove_timer();
}
////////////////////////////////////////////////////////////////////////
void drawfire(int x,int y) // 画出激光
{ int i,j;
lsetColor(9);
lline(x+3+8,y-6,x+3+8,y+5);
lline(x-5+7,y-6,x-5+7,y+5);
}
void show()
{ char text[80]="STAR WAR";
static int flag=1;
lsetColor(7);
louttextxy(MAXX/2-strlen(text)*4,10,text);
sprintf(text,"SCORE: %d",GameScore);
lsetColor(7);
louttextxy(0,MAXY-20,text); // 到一定的时间显示分数
if (flag>0) lOutToScr(&layer,0,0,0,0,MAXX,MAXY);
lClearSurface(&layer,0);
flag*=(-1);
}
void pimage(short x,short y,char *buf,int mode)
{ short len,wid;
int j=0,inc=1,i;
lgetSize(&len,&wid,buf);
if (mode==1) j=wid-1,inc=-1;
for (i=0;i<wid;i++,j+=inc) lScanLine2(x,y+i,len,buf+4+j*len);
}
////////////////////////////////////////////////////////////////////////
unsigned long timepass; // 游戏进行的时间
int GameOver, Sound=0;
int fly_x=160,fly_y,fly_flag=1,fire_flag=1;
void drivers(); // 事件引擎
void control(); // 对象控制(事件处理)
int AllocObj() // 分配空余对象
{ int i=0;
while (i<MAX_OBJ&&Objs[i].mode) i++;
if (i>=MAX_OBJ) i=MAX_OBJ-1;
return i;
}
int CheckHit(int x1,int y1,int x2,int y2,int r) // 检查碰撞
{ if (abs(x1-x2)<=r&&abs(y1-y2)<=r) return 1;
return 0;
}
char *texts[10]={
"USE ARROW KEYS TO MOVE",
"CTRL TO FIRE",
"ESC TO QUIT"
};
char GameStart()
{ int i, start;
timepass=0;
lmMidiPlay(midi,1);
lActiveSurface(NULL);
lsetColor(2);
for (i=0;i<3;i++) louttextxy(MAXX/2-4*strlen(texts[i]),MAXY/3+i*14,texts[i]);
lActiveSurface(&layer);
delay(4000);
fly_y=MAXY*3/4;
while (!GameOver)
{ while (lt_clock(0)-start<=1193181/70); start=lt_clock(0); // 等待
timepass++; // 1.时间基数++
control(); // 2.事件处理
drivers(); // 3.事件引擎
show(); // 4.显示
if (--Sound<=0) nosound(); // 声音处理
if (lKeyOn(KEY_ESC)) GameOver=1;
} sound(105); delay(700); nosound();
lmStopMidi();
return 1;
}
void control() // 游戏事件处理
{ int i,j,x,y, ok;
for (i=0;i<MAX_STAR;i++) { Stars[i].y+=Stars[i].v; // 星星处理
if (Stars[i].y>MAXY) { Stars[i].x=random(320); Stars[i].y=-random(60); }
if (Stars[i].v==1) lpixel(Stars[i].x,Stars[i].y,23);
else lpixel(Stars[i].x,Stars[i].y,28);
}
for (i=0;i<MAX_OBJ;i++) // 对象处理
{ x=Objs[i].x; y=Objs[i].y; ok=1;
switch (Objs[i].mode)
{ case 1: if (Objs[i].index==0) { switch (Objs[i].type)
/*敌人*/ { case 0: if (!random(30)) Objs[i].type=1; break; // 3种状态
case 1: if (x<fly_x) x++; if (x>fly_x) x--;
if (!random(40)) Objs[i].type=2; break;
case 2:
default:if (!random(3)) y+=3;
break;
} if (CheckHit(x,y,fly_x,fly_y,15)) fly_flag=0; // 与主角相撞
pimage(x,y,fly_pic,0);
}
if (Objs[i].index) // 被击中
{ if ((Objs[i].index&3)==0) pimage(x,y,fly_pic,0);
if (++Objs[i].index>50) Objs[i].mode=0;
}
y++; if (y>MAXY) Objs[i].mode=0; // 对象清除
break;
case 2: y-=4; if (y<-20) Objs[i].mode=0; drawfire(x,y);
/*激光*/for (j=0;j<MAX_OBJ;j++) // 检查与敌机相碰
if (Objs[j].mode==1&&CheckHit(x,y,Objs[j].x,Objs[j].y,15)&&
!Objs[j].index&&ok)
{ Objs[j].index=1; ok=0; Objs[i].mode=0;
sound(220); Sound=10; GameScore+=10;
}
break;
}
Objs[i].x=x; Objs[i].y=y;
}
if (lKeyOn(KEY_UP)) if (--fly_y<0) fly_y=0; // 主角控制
if (lKeyOn(KEY_DOWN)) if (++fly_y>MAXY) fly_y=MAXY;
if (lKeyOn(KEY_LEFT)) if (--fly_x<0) fly_x=0;
if (lKeyOn(KEY_RIGHT)) if (++fly_x>319) fly_x=319;
if (lKeyOn(KEY_CTRL)&&fire_flag==1) {
i=AllocObj(); Objs[i].x=fly_x,
Objs[i].y=fly_y-10, Objs[i].mode=2;
fire_flag=0;
}
if (!lKeyOn(KEY_CTRL)) fire_flag=1;
pimage(fly_x,fly_y,fly_pic,1);
if (!fly_flag) GameOver=1;
}
void drivers()
{ if (random(30)==0)
{ int i=AllocObj(); Objs[i].x=random(320); Objs[i].y=-random(20);
Objs[i].mode=1; Objs[i].type=Objs[i].index=0;
if (!random(20)) Objs[i].type=2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -