程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 簡單潛艇大戰

簡單潛艇大戰

編輯:C語言基礎知識
/*簡單潛艇大戰
    全局變量speed一開始需要調整,大家的速度不同
    主要練習下這個游戲的基本算法,用簡單的圖形來模擬
    ----跳蚤偵察-------
  */
  #include <graphics.h>
  #include <stdlib.h>
  #include <dos.h>
  #include <graphics.h>
  #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<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
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved