关于这个射击程序!(二)接上

ekin7913046 2003-08-20 05:52:40
//判断是否撞机
int TForm1::JudgeCrash(BulletNode*TmpBullet,Plane TmpPlane,int nTmpFlag)
{
//根据指定的子弹节点的指针以及飞机的矩形判断两个是否发生了撞击,
//nTmpFlag用来表示撞击的类型
//局限于代码的长度,该算法只是简单的根据子弹和飞机的中心点的距离来
//判断是否相樟,结果较粗略
if((nTmpFlag==1)&&(TmpBullet->nNodeKind==1)) //敌子弹撞我飞机而且子弹是敌机的
if
(LENGTH(TmpBullet->rectCur.Left+3.5,TmpBullet->rectCur.Top+7.5,
TmpPlane.rectPlane.Left+40,TmpPlane.rectPlane.Top+30)<20)
return 1;
//我子弹撞敌机而且子弹是我方的
if((nTmpFlag==0)&&(TmpBullet->nNodeKind==0)&&(TmpPlane.nFlag==1))
if
(LENGTH(TmpBullet->rectCur.Left+4.5,TmpBullet->rectCur.Top+4.5,
TmpPlane.rectPlane.Left+30,TmpPlane.rectPlane.Top+22.5)<20)
return 1;
return 0;
}

int TForm::JudgeWin()
{
//用循环来判断是\否赢,如果所有的敌机的标记都是0(都被击落)则表示胜利
for(int i=0;i<4;i++)
if(EnemyPlaneGroup1[i].nFlag)
return 0;
for(int i=0;i<5;i++)
if(EnemyPlaneGroup2[i].nFlag)
return 0;
return 1;
}


//---------------------------------------------------------------------------





void __fastcall TForm1::MenuiExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::MenuStartClick(TObject *Sender)
{
Init();
Timer1->Enabled=true;
Timer2->Enabled=true;
Timer3->Enabled=true;
CreateBG();
}
//---------------------------------------------------------------------------
//该定时器用来定时根据子弹以及飞机的位置,状态数据,产生新的显示图,然后显示
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
CreateBG();
Image1->Canvas->Draw(0,0,BmpShow);
Image1->Refresh();
}
//---------------------------------------------------------------------------
/*该定时器用来定时移动指针,敌机,同时对移动以后的状态进行判断,看是否有撞机事件
发生,如果有,则进行相应处理 */
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
bool bFlag=true; //判断我方子弹在经过前一排飞机的时候是否已经撞上
MoveEmeny();
MoveBullet();
BulletNode*CurNode=FirstNode;
while(CurNode->Next)
{
//如果我方飞机被撞击,则生命力为-1
if((CurNode->Next->nNodeKind==1)&&JudgeCrash(CurNode->Next,MyPlane,1))
{
nMyLife--;
Caption="小蜜蜂 剩余生命力 : "+IntTostr(nMyLife);
if(nMyLife<=0) //如果生命力减到0,则游戏结束
{
Timer1->Enabled=false;
Timer2->Enabled=false;
Timer3->Enabled=false;
bInit=false;
Application->MessageBox("恭喜,你的飞机死光了!",MB_OK);
}
BulletNode*TmpNode=CurNode->Next;
CurNode->Next=CurNode->Next->Next;
delete TmpNode;
continue;
}
else if (CurNode->Next->nNodeKind==0) //如果是我方的子弹
{
for(int i=0;i<4;i++) //判断该子弹是否会撞上前一排的飞机
if(JudgeCrash(CurNode->Next,EnemyPlaneGroup1[i],0))
{
BulletNode*TmpNode*TmpNode=CurNode-Next;
CurNode->Next=CurNode->Next->Next;
delete TmpNode;
EnemyPlaneGroup1[i].nFlag=0;
bFlag=false;
break;
}
for(int i=0;i<5&&bFlag;i++) //判断该子弹是否会撞上后一排的飞机
if(JudgeCrash(CurNode->Next,EnemyPlaneGroup2[i],0))
{
BulletNode*TmpNode*TmpNode=CurNode-Next;
CurNode->Next=CurNode->Next->Next;
delete TmpNode;
EnemyPlaneGroup2[i].nFlag=0;
break;
}

}
for(int i=0;i<5&&bFlag;i++) //判断该子弹是否会撞上后一排的飞机
if(JudgeCrash(CurNode->Next,EnemyPlaneGroup2[i],0))
{
BulletNode*TmpNode*TmpNode=CurNode-Next;
CurNode->Next=CurNode->Next->Next;
delete TmpNode;
EnemyPlaneGroup2[i].nFlag=0;
break;
}

}
CurNode=CurNode->Next;
}
if(JudgeWin())
{
Timer1->Enabled=false;
Timer2->Enabled=false;
Timer3->Enabled=false;
bInit=false;
Application->MessageBox("你很厉害嘛!",MB_OK);
Image1->Canvas->Draw(0,0,pBmpBg);
}
}
//---------------------------------------------------------------------------
//该定时器用来随机判断敌人的飞机是否产生子弹(不是每一时刻都有子弹出现,是随机)
void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
srand(time(NULL));
for(int i=0;i<5;i++)
//如果该飞机正常(未被击落)而且产生的随机数是奇数
if((EnemyPlaneGroup2[i].nFag&&(rand()%2))
CreateNewBullet(TRect(EnemyPlaneGroup2[i].rectPlane.Left+26,
EnemyPlaneGroup2[i].rectPlane.Bottom,EnemyPlaneGroup2[i].rectPlane.Left+33,
EnemyPlaneGroup2[i].rectPlane.Bottom+15),1);
for(int i=0;i<4;i++)
//如果该飞机正常(未被击落)而且产生的随机数是奇数
if((EnemyPlaneGroup1[i].nFag&&(rand()%2))
CreateNewBullet(TRect(EnemyPlaneGroup1[i].rectPlane.Left+26,
EnemyPlaneGroup1[i].rectPlane.Bottom,EnemyPlaneGroup1[i].rectPlane.Left+33,
EnemyPlaneGroup1[i].rectPlane.Bottom+15),1);
}
int TForm1::JudgeCrash(BulletNode*TmpBullet,Plane TmpPlane,int nTmpFlag)
{
/*根据指定的子弹节点的指针以及飞机的矩形判断两个是否发生了撞击,nTmpFlag用来
表示撞击的类型
局限于代码的长度,该算法只是简单的根据子弹和飞机的中心点的距离来判断是否发生撞
击,这样的结果很粗略*/
if((nTmpFlag==1)&&(TmpBullet-nNodeKind==1)) //敌子弹撞我机且是敌机的
if
(LENGTH(TmpBullet->rectCur.Left+3.5,TmpBullet->rectCur.Top+7.5,
TmpPlane.rectPlane.Left+40,TmpPlane.rectPlane.Top+30)<20)
return 1;
//我子弹撞敌机而且子弹是我方的
if((nTmpFlag==0)&&(TmpBullet->nNodeKind==0)&&(TmpPlane.nFlag==1))
if
(LENGTH(TmpBullet->rectCur.Left+4.5,TmpBullet->rectCur.Top+4.5,
TmpPlane.rectPlane.Left+30,TmpPlane.rectPlane.Top+22.5)<20)
return 1;
return 0;
}

//按键响应的处理
void __fastcall TForm1::FormKeyDown(TObject*Sender,WORD&Key,TShiftState Shift)
{
if(bInit)
{
if(Key==VK_LEFT) //要求左移
{
if(MyPlane.rectPlane.Left<-10) //出界了
return;
MyPlane.rect.Plane.Left-=13;
MyPlane.rect.Plane.Right-=13; //飞机的距离左移了13个像素
}
else if(Key==VK_RIGHT)
if(MyPlane.rectPlane.Right>443) //出界了
return;
MyPlane.rect.Plane.Left+=13;
MyPlane.rect.Plane.Right+=13; //飞机的距离右移了13个像素
}
else if(Key==VK_CONTROL)
//发射子弹
CreateNewBullet(TRect(MyPlane.rectPlane.Left,MyPlane.rectPlane.Top,
MyPlane.rectPlane.Left+9,MyPlane.rectPlane.Top+9),0);
}

//---------------------------------------------------------------------------
...全文
73 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tccsdn 2003-08-28
  • 打赏
  • 举报
回复
一在哪里呀
hitxp 2003-08-26
  • 打赏
  • 举报
回复
这是个有问题的c++程序

不知道还有没有挽救的余地?还是请高手帮忙啊~
sun_wyz 2003-08-20
  • 打赏
  • 举报
回复
楼主厉害,建议去打日本鬼子!!!
Santos 2003-08-20
  • 打赏
  • 举报
回复
你在发布源代码吗?

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧