寻求《打砖块》游戏简单算法?

a603473186 2010-12-30 05:44:55
正在写一个《打砖块》游戏,考虑了好几种算法,向各位大虾寻求一种较为简单和较为好理解的算法。
...全文
391 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a603473186 2010-12-31
  • 打赏
  • 举报
回复
没错!打砖块
ssddssljr 2010-12-31
  • 打赏
  • 举报
回复
《打砖块》
a603473186 2010-12-31
  • 打赏
  • 举报
回复
HitBrickTest(pDoc->ball,pDoc->brick[i][j])) 这个函数你是怎么实现的?
a603473186 2010-12-31
  • 打赏
  • 举报
回复
主要是吃砖块部分的算法问题,你那样就行???
ttssrs 2010-12-30
  • 打赏
  • 举报
回复
void CPenBallView::UpdateDC()
{
CPenBallDoc* pDoc = GetDocument();
int x = pDoc->ball.Position.x + pDoc->ball.Vx;
int y = pDoc->ball.Position.y + pDoc->ball.Vy;

//球下方点
CPoint point(x,y+pDoc->ball.Radius);
//挡板
CRect rect(MousePosition.x-ViewWidth/14,ViewHeight - ViewWidth/60,
MousePosition.x + ViewWidth/14,ViewHeight);

//设置鼠标移动标志
if(MousePosition.x - OldMousePosition.x < 0)
MoveFlag = -1;
else if(MousePosition.x - OldMousePosition.x > 0)
MoveFlag =1;
else
MoveFlag = 0;
//保存鼠标位置
OldMousePosition = MousePosition;

int i,j;

//判断是否击中墙壁
if(HitWallTest(pDoc->ball))
{
PlaySound("Boing.wav",NULL,SND_ASYNC | SND_ASYNC );
return ;
}
//判断是否击中砖块
switch(flag)
{
case 1:{for(i=4;i>=0;i--)
{

for(j=8;j>=0;j-=2)
{
if(pDoc->brick[i][j].IsSurvive == TRUE)
{
if(HitBrickTest(pDoc->ball,pDoc->brick[i][j]))
{
PlaySound("Bang.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->m_BrickCount-=1;
pDoc->brick[i][j].IsSurvive = FALSE;
pDoc->score += pDoc->brick[i][j].score;
//宝贝获取坐标
if(pDoc->brick[i][j].have)
pt1=pDoc->brick[i][j].Point;
return;
}
}
}


}
}
case 2:{for(i=6;i>=0;i-=2)
{
for(j=8;j>=0;j-=2)
{
if(pDoc->brick[i][j].IsSurvive == TRUE)
{
if(HitBrickTest(pDoc->ball,pDoc->brick[i][j]))
{
PlaySound("Bang.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->m_BrickCount-=1;
pDoc->brick[i][j].IsSurvive = FALSE;
pDoc->score += pDoc->brick[i][j].score;
//宝贝获取坐标
if(pDoc->brick[i][j].have)
pt1=pDoc->brick[i][j].Point;
return;
}

}
}
}
}
case 3:{for(i=6;i>=0;i--)
{
for(j=9;j>=0;j--)
{
if(pDoc->brick[i][j].IsSurvive == TRUE)
{
if(HitBrickTest(pDoc->ball,pDoc->brick[i][j]))
{
PlaySound("Bang.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->m_BrickCount-=1;
pDoc->brick[i][j].IsSurvive = FALSE;
pDoc->score += pDoc->brick[i][j].score;
//宝贝获取坐标
if(pDoc->brick[i][j].have)
pt1=pDoc->brick[i][j].Point;
return;
}
}
}
}
}
}
//判断是否击中挡板
if(PtInRect(rect,point))
{
PlaySound("Ball.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->ball.reflect(ViewHeight-ViewWidth/60,BOTTOM);

double step = sqrt(pDoc->ball.Vx*pDoc->ball.Vx
+ pDoc->ball.Vy*pDoc->ball.Vy);
int x = pDoc->ball.Vx + MoveFlag;
int y = pDoc->ball.Vy;
double R = sqrt(x*x + y*y);
//设置小球的速度
if(flag==1)
{
pDoc->ball.Vx = 15*(x/R);
pDoc->ball.Vy = 15*(y/R);
}
else if(flag==2)
{
pDoc->ball.Vx = 17*(x/R);
pDoc->ball.Vy = 17*(y/R);
}
else
{
pDoc->ball.Vx=18*(x/R);
pDoc->ball.Vy=18*(y/R);
}
}

//判断游戏是否结束
if(y>ViewHeight+20)
{
PlaySound("VOICE_0015.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
GameOver();
OnFileNewgame();
}

if( pDoc->m_BrickCount==0&&flag==1)
{
PlaySound("win.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
dlg.DoModal();
switch(dlg.flag1)
{
case 1:
{
//gameover=false;
OnFileNewgame();
break;
}
case 2:
{
//gameover=false;
OnFileNextgame() ;
break;
}
}
// TODO: Add your message handler code here
}
if(pDoc->m_BrickCount==0&&flag==2)
{
PlaySound("win.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
dlg1.DoModal();
switch(dlg1.flag2)
{
case 1:
{
OnFileNewgame();
break;
}
case 2:
{
OnThirdgame() ;
break;
}
}
}
if(pDoc->m_BrickCount==0&&flag==3)
{
PlaySound("win.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
AfxMessageBox("恭喜顺利通关!",MB_ICONINFORMATION,NULL );
}
pDoc->ball.Position.x += pDoc->ball.Vx;
pDoc->ball.Position.y += pDoc->ball.Vy;




}
ttssrs 2010-12-30
  • 打赏
  • 举报
回复
void CPenBallView::UpdateDC()
{
CPenBallDoc* pDoc = GetDocument();
int x = pDoc->ball.Position.x + pDoc->ball.Vx;
int y = pDoc->ball.Position.y + pDoc->ball.Vy;

//球下方点
CPoint point(x,y+pDoc->ball.Radius);
//挡板
CRect rect(MousePosition.x-ViewWidth/14,ViewHeight - ViewWidth/60,
MousePosition.x + ViewWidth/14,ViewHeight);

//设置鼠标移动标志
if(MousePosition.x - OldMousePosition.x < 0)
MoveFlag = -1;
else if(MousePosition.x - OldMousePosition.x > 0)
MoveFlag =1;
else
MoveFlag = 0;
//保存鼠标位置
OldMousePosition = MousePosition;

int i,j;

//判断是否击中墙壁
if(HitWallTest(pDoc->ball))
{
PlaySound("Boing.wav",NULL,SND_ASYNC | SND_ASYNC );
return ;
}
//判断是否击中砖块
switch(flag)
{
case 1:{for(i=4;i>=0;i--)
{

for(j=8;j>=0;j-=2)
{
if(pDoc->brick[i][j].IsSurvive == TRUE)
{
if(HitBrickTest(pDoc->ball,pDoc->brick[i][j]))
{
PlaySound("Bang.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->m_BrickCount-=1;
pDoc->brick[i][j].IsSurvive = FALSE;
pDoc->score += pDoc->brick[i][j].score;
//宝贝获取坐标
if(pDoc->brick[i][j].have)
pt1=pDoc->brick[i][j].Point;
return;
}
}
}


}
}
case 2:{for(i=6;i>=0;i-=2)
{
for(j=8;j>=0;j-=2)
{
if(pDoc->brick[i][j].IsSurvive == TRUE)
{
if(HitBrickTest(pDoc->ball,pDoc->brick[i][j]))
{
PlaySound("Bang.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->m_BrickCount-=1;
pDoc->brick[i][j].IsSurvive = FALSE;
pDoc->score += pDoc->brick[i][j].score;
//宝贝获取坐标
if(pDoc->brick[i][j].have)
pt1=pDoc->brick[i][j].Point;
return;
}

}
}
}
}
case 3:{for(i=6;i>=0;i--)
{
for(j=9;j>=0;j--)
{
if(pDoc->brick[i][j].IsSurvive == TRUE)
{
if(HitBrickTest(pDoc->ball,pDoc->brick[i][j]))
{
PlaySound("Bang.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->m_BrickCount-=1;
pDoc->brick[i][j].IsSurvive = FALSE;
pDoc->score += pDoc->brick[i][j].score;
//宝贝获取坐标
if(pDoc->brick[i][j].have)
pt1=pDoc->brick[i][j].Point;
return;
}
}
}
}
}
}
//判断是否击中挡板
if(PtInRect(rect,point))
{
PlaySound("Ball.wav",NULL,SND_ASYNC | SND_ASYNC );
pDoc->ball.reflect(ViewHeight-ViewWidth/60,BOTTOM);

double step = sqrt(pDoc->ball.Vx*pDoc->ball.Vx
+ pDoc->ball.Vy*pDoc->ball.Vy);
int x = pDoc->ball.Vx + MoveFlag;
int y = pDoc->ball.Vy;
double R = sqrt(x*x + y*y);
//设置小球的速度
if(flag==1)
{
pDoc->ball.Vx = 15*(x/R);
pDoc->ball.Vy = 15*(y/R);
}
else if(flag==2)
{
pDoc->ball.Vx = 17*(x/R);
pDoc->ball.Vy = 17*(y/R);
}
else
{
pDoc->ball.Vx=18*(x/R);
pDoc->ball.Vy=18*(y/R);
}
}

//判断游戏是否结束
if(y>ViewHeight+20)
{
PlaySound("VOICE_0015.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
GameOver();
OnFileNewgame();
}

if( pDoc->m_BrickCount==0&&flag==1)
{
PlaySound("win.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
dlg.DoModal();
switch(dlg.flag1)
{
case 1:
{
//gameover=false;
OnFileNewgame();
break;
}
case 2:
{
//gameover=false;
OnFileNextgame() ;
break;
}
}
// TODO: Add your message handler code here
}
if(pDoc->m_BrickCount==0&&flag==2)
{
PlaySound("win.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
dlg1.DoModal();
switch(dlg1.flag2)
{
case 1:
{
OnFileNewgame();
break;
}
case 2:
{
OnThirdgame() ;
break;
}
}
}
if(pDoc->m_BrickCount==0&&flag==3)
{
PlaySound("win.wav",NULL,SND_ASYNC | SND_ASYNC );
KillTimer(1);
KillTimer(2);
AfxMessageBox("恭喜顺利通关!",MB_ICONINFORMATION,NULL );
}
pDoc->ball.Position.x += pDoc->ball.Vx;
pDoc->ball.Position.y += pDoc->ball.Vy;




}

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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