*简单潜艇大战 全局变量speed一开始需要调整,大家的速度不同 主要练习下这个游戏的基本算法,用简单的图形来模拟 ----跳蚤侦探-------*/#include #include #include #include #define KEY_ESC 0x01#define KEY_SPACE 0x39#define KEY_LEFT 0x4b#define KEY_RIGHT 0x4dint speed=10000;char key_state[128],key_pressed[128];/*键盘操作用的变量*/int score=0;/*得分*/char scorestr[10];/*输出分数的变量*/struct Fire/*子弹的结构体*/{ int x; int y; int start;/*是否发射炮弹*/}amyfire[6];/*屏幕上最多有5个敌人可以发子弹*/struct Play/*玩家的结构体*/{ int x; int y; struct Fire fire[6]; life;}play;struct Amy/*敌人的结构体*/{ int x; int y; int speed;/*敌人的速度*/ int color; int direction; life;}amy[6];void InitGraph(void);/*图形初始化*/void CloseGraph(void);/*图形结束*/void GamePlay(void);/*具体玩游戏*/void DrawPlay(void);/*画玩家*/void DrawAmy(int i);/*画敌人*/void DrawFire(int x,int y,int n);/*画子弹,0去除,1显示*/void DrawAmyFire(int x,int y,int n);/*画子弹,0去除,1显示*/void DrawBlack(int x,int y,int color);/*去除原来地方的物体*/void PrScore();/*输出得分*/int GetKey(int ScanCode);/*这里开始都是按键函数*/void interrupt far (*OldInt9Handler)();void far interrupt NewInt9();void InstallKeyboard();void ShutDownKeyboard();void main(void){ InitGraph();/*图形初始化*/ GamePlay();/*具体玩游戏*/ CloseGraph();/*图形结束*/}void InitGraph(void)/*图形初始化*/{ int gd=DETECT,gm; initgraph(&gd,&gm,"c:\\tc"); cleardevice(); InstallKeyboard();}void DrawPlay(void)/*画玩家*/{ setfillstyle(SOLID_FILL,6); bar(play.x-20,play.y-10,play.x+20,play.y); setfillstyle(SOLID_FILL,4); bar(play.x-20,play.y-10,play.x-10,play.y);}void DrawAmy(int i)/*画敌人*/{ setfillstyle(SOLID_FILL,amy[i].color); bar(amy[i].x-20,amy[i].y-10,amy[i].x+20,amy[i].y); setfillstyle(SOLID_FILL,GREEN); if(amy[i].direction==1) bar(amy[i].x-20,amy[i].y-10,amy[i].x-10,amy[i].y); else bar(amy[i].x+10,amy[i].y-10,amy[i].x+20,amy[i].y);}void DrawBlack(int x,int y,int color)/*去除原来地方的物体*/{ setfillstyle(SOLID_FILL,color); bar(x-20,y-10,x+20,y);}void DrawFire(int x,int y,int n)/*画子弹,0去除,1显示*/{ if(n==0) setfillstyle(SOLID_FILL,BLUE); else setfillstyle(SOLID_FILL,0); setcolor(BLUE); fillellipse(x,y,5,5);}void DrawAmyFire(int x,int y,int n)/*画子弹,0去除,1显示*/{ if(n==0) setfillstyle(SOLID_FILL,BLUE); else setfillstyle(SOLID_FILL,YELLOW);/*敌人的炮弹是黄的*/ setcolor(BLUE); fillellipse(x,y,3,3);}void PrScore()/*输出得分*/{ setfillstyle(SOLID_FILL,8);/*把原来分数去除*/ bar(30,0,200,40); setcolor(11);/*输出新得分*/ settextstyle(0,0,2); sprintf(scorestr,"%d",score); outtextxy(30,20,scorestr);}void GamePlay(void)/*具体玩游戏*/{ int i,j; setfillstyle(SOLID_FILL,BLUE); bar(0,100,640,480); setfillstyle(SOLID_FILL,8); bar(0,0,640,99); play.x=200;play.y=99;/*玩家初始位置*/ for(i=0;i<6;i++) { play.fire[i].start=0;/*一开始的子弹都为没发射状态*/ amyfire[i].start=0; amy[i].life=0; } play.life=1; DrawPlay();/*玩家初始位置*/ PrScore();/*输出得分*/ randomize(); while(1) { for(i=0;i<6;i++)/*查找玩家是否有发射的子弹*/ { if(play.fire[i].start==1)/*发射的子弹*/ { DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原来子弹位置*/ play.fire[i].y+=3; DrawFire(play.fire[i].x,play.fire[i].y,1);/*显示新位置*/ for(j=0;j(amy[j].x-22)&&play.fire[i].x(amy[j].y-14)&&play.fire[i].y<amy[j].y+5)/*击中敌人*/ { play.fire[i].start=0;/*子弹消失*/ amy[j].life=0;/*敌人生命结束*/ score+=10;/*得分增加*/ DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原来子弹位置*/ DrawBlack(amy[j].x,amy[j].y,BLUE);/*去除敌人*/ PrScore(); } if(play.fire[i].y>480)/*子弹超出屏幕就等于消失*/ { play.fire[i].start=0; DrawFire(play.fire[i].x,play.fire[i].y,0); } } } for(i=0;i<6;i++)/*敌人炮弹的产生*/ { if(amy[i].life==1&&amy[i].color<14&&amyfire[i].start==0)/*敌人发射炮弹的条件*/ { amyfire[i].start=1; amyfire[i].x=amy[i].x; amyfire[i].y=amy[i].y-10; } } for(i=0;i<6;i++)/*敌人炮弹移动以及移动*/ { if(amyfire[i].start==1)/*子弹存在*/ { DrawAmyFire(amyfire[i].x,amyfire[i].y,0); amyfire[i].y-=2; DrawAmyFire(amyfire[i].x,amyfire[i].y,1);/*画敌人炮弹新位置*/ } if(amyfire[i].x>(play.x-14)&&amyfire[i].x<(play.x+14)&&(amyfire[i].y+3)<100)/*击中玩家*/ { play.life=0; amyfire[i].start=0; DrawAmyFire(amyfire[i].x,amyfire[i].y,0); DrawBlack(play.x,play.y,8);/*去除玩家*/ break; } if(amyfire[i].y<96)/*敌人炮弹超出海洋就消失*/ { amyfire[i].start=0; setfillstyle(SOLID_FILL,8); setcolor(8); fillellipse(amyfire[i].x,amyfire[i].y,3,3); } } delay(speed);/*间隔时间可以自己定*/ if(play.life!=1)/*玩家被击中*/ break; for(i=0;i<6;i++) { if(amy[i].life==0)/*出现一个敌人后就跳出循环*/ { amy[i].life=1; amy[i].color=rand()%4+10;/*敌人的颜色*/ amy[i].y=rand()%300+130;/*高度随机*/ amy[i].speed=2+rand()%10;/*敌人的移动速度随机*/ amy[i].direction=rand()%2;/*敌人的移动方向,0左边,1右边出来*/ if(amy[i].direction==0) amy[i].x=-20; else amy[i].x=660; break; } } if(GetKey(KEY_ESC))/*退出键*/ break; if(GetKey(KEY_SPACE))/*发射*/ { for(i=0;i<6;i++) if(play.fire[i].start==0)/*发射一颗子弹后跳出循环*/ { play.fire[i].x=play.x; play.fire[i].y=105; play.fire[i].start=1; break; } } if(GetKey(K