同样是最初步的模拟,有待再完善下去.飞碟速度上的问题还是希望大家自己调整gamespeed的速度.
空格是发射,发射的具体样子我没写.
#include <graphics.h> #include <math.h> #include <stdlib.h> #include <dos.h> #define KEY_ESC 0x01 #define KEY_SPACE 0x39 #define KEY_UP 0x48 #define KEY_LEFT 0x4b #define KEY_RIGHT 0x4d #define KEY_DOWN 0x50 int gamespeed=1200;/*自己改游戏的速度*/ int speed;/*飞碟移动速度*/ int col;/*中心坐标*/ int score=0;/*得分*/ char key_state[128],key_pressed[128];/*键盘操作用的变量*/ void Init();/*初始*/ void Close();/*关闭*/ void PlayGame();/*游戏过程*/ void PrScore();/*输出成绩*/ void DrawM(int x,int y,int color);/*画瞄准器*/ void Win();/*输出最后结果*/ int GetKey(int ScanCode);/*这里开始都是按键函数*/ void interrupt far (*OldInt9Handler)(); void far interrupt NewInt9(); void InstallKeyboard(); void ShutDownKeyboard(); DrawFly(int x,int y,int color);/*画飞碟*/ void main(void)
void PrScore()/*输出成绩*/ { char s[10]; setfillstyle(SOLID_FILL,BLACK); bar(30,0,100,50); setcolor(6); settextstyle(0,0,2); sprintf(s,"%d",score); outtextxy(30,20,s); } void DrawM(int x,int y,int color)/*画瞄准器*/
void Win()/*输出最后结果*/ { settextstyle(0,0,4); setcolor(RED); if(score>18) outtextxy(200,200,"VERY GOOD"); else if(score>10) outtextxy(250,200,"GOOD"); else outtextxy(250,200,"~@_@~"); }
void PlayGame()/*游戏过程*/ { float x,y;/*飞碟的坐标*/ int mx,my; int i,num=0; for(i=40;i<640;i+=30) DrawFly(i,65,WHITE); mx=my=300; setcolor(15); line(0,80,640,80); randomize(); while(num<20) { PrScore();/*输出成绩*/ col=random(10);/*中心坐标随机*/ col=col*20+200; speed=2+random(2);/*飞碟速度随机*/ for(x=-250;x<=250;x+=speed)/*飞碟移动全过程*/ { y=pow((x/10),2)+200;/*求y坐标*/ DrawFly(x,y,WHITE); DrawM(mx,my,YELLOW); delay(gamespeed);/*间隔*/ DrawM(mx,my,BLACK); DrawFly(x,y,BLACK); if(GetKey(KEY_ESC))/*结束游戏*/ break; if(GetKey(KEY_LEFT)) mx-=4; if(GetKey(KEY_RIGHT)) mx+=4; if(GetKey(KEY_DOWN)) my+=4; if(GetKey(KEY_UP)&&my>100) my-=4; if(GetKey(KEY_SPACE))/*发子弹*/ { if(((x+col+10)>=(mx-2)&&x<=(mx+2))&&(y>=(my-2)&&y<=(my+2)))/*这里控制精确度*/ { score++; DrawFly(x,y,BLACK); DrawM(mx,my,YELLOW); PrScore(); DrawM(mx,my,BLACK); break; } } if(y>490&&col+x>col)/*自动消失*/ break; } if(y<490) { setcolor(RED); line(40+num*30-10,55,40+num*30+10,75); line(40+num*30-10,75,40+num*30+10,55); } num++; if(GetKey(KEY_ESC))/*结束游戏*/ break; } Win(); while(1) } void Init()/*初始*/ { int gd=DETECT,gm; initgraph(&gd,&gm,"c:\tc"); cleardevice(); InstallKeyboard(); } void Close()/*关闭*/
DrawFly(int x,int y,int color)/*画飞碟*/
void far interrupt NewInt9(void) { unsigned char ScanCode,temp; ScanCode=inportb(0x60); temp=inportb(0x61); outportb(0x61,temp 0x80); outportb(0x61,temp & 0x7f); if(ScanCode&0x80) { ScanCode&=0x7f; key_state[ScanCode]=0; } else { key_state[ScanCode]=1; key_pressed[ScanCode]=1; } outportb(0x20,0x20); }
void InstallKeyboard(void) { int i; for(i=0;i<128;i++) key_state[i]=key_pressed[i]=0; OldInt9Handler=getvect(9); /*中断向量值*/ setvect(9,NewInt9); /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/ }
void ShutDownKeyboard(void)
int GetKey(int ScanCode) { int res; res=key_state[ScanCode]key_pressed[ScanCode]; key_pressed[ScanCode]=0; return res; }
|