龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

简单潜艇大战

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
/*简单潜艇大战 全局变量speed一开始需要调整,大家的速度不同 主要练习下这个游戏的基本算法,用简单的图形来模拟 ----跳蚤侦察------- */ #include #include #include #include #define KEY_ESC 0x01 #de

/*简单潜艇大战

   全局变量speed一开始需要调整,大家的速度不同

   主要练习下这个游戏的基本算法,用简单的图形来模拟

   ----跳蚤侦察-------

  */

  #include

  #include

  #include

  #include

  #define KEY_ESC 0x01

  #define KEY_SPACE 0x39

  #define KEY_LEFT 0x4b

  #define KEY_RIGHT 0x4d

  int 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:c");

   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<6;j++)/*判定子弹是否击中敌人*/ if(play.fire[i].x>(amy[j].x-22)&&play.fire[i].x<(amy[j].x+22)&&play.fire[i].y>(amy[j].y-14)&&play.fire[i].y

   {

   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

  

  

精彩图集

赞助商链接