加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

《俄罗斯方块------碰撞检测》

(2011-11-18 15:09:27)
标签:

c

it

程序源

源程序

俄罗斯方块

旋转

分类: 我的课外小作业

碰撞检测其实就是有预见性;

假设下面有障碍物;

然后判断;

**************************************************************************************************

//定义容器数组
int cheng[20][14]={1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                   1,1,1,1,1,1,1,1,1,1,1,1,1,1};

 

 

//方块下方碰撞检测;
int detection(int x,int i)
{
 int m,n,ce=0;
    for(n=0;n<=3;n++)
 {
  for(m=0;m<=3;m++)
  {
   if(cheng[i+1-n][x/20+m-2]==b[3-n][m])
   {
    if(b[3-n][m]==1)
    {
     ce=1;
     break;
    }
   }
   
  }
  if(ce==1)break;
 
 return ce;
}

//左右检测;
int jiance(int x,int i)
{
 int ce=0,n,m;

for(n=0;n<=3;n++)
{
 for(m=0;m<=3;m++)
  {
    if(cheng[i-3+m][x/20+1-n]==b[m][3-n])
  {
   if(b[m][3-n]==1)
   {
   ce=1;
   break;
   }
  }
  }
 if(ce==1)break;
}
 
    return ce;
}

 

 

////////////////////////////////////////////摞叠////////////////////////////////////////////////

//下方的检测由于方块的固定;

//如果检测有方块跳出画图并赋值;
   if(detection(x,i)==1)
   {
    for(n=0;n<=3;n++)
    {
     for(m=0;m<=3;m++)
     {
      if(b[n][m]==1)
       cheng[i-3+n][x/20-2+m]=b[n][m];//赋值以便下次检测到有方块;
     }
    }
    break;
   }

////////////////////////////////////检测左右移动///////////////////////////////////////////

case 'a':
     x-=20;
     if (jiance(x,i)==1)x+=20;break;
    case 'd':
     x+=20;
     if (jiance(x,i)==1)x-=20;break;

///////////////////////////////////////////////检测旋转////////////////////////////////////////

//其实用到的还是左右检测;

//因为旋转检测就是判断移动后是否会有阻碍;

//跟左右一样;

case 'w':
     //图形旋转;
     //旋转检测;
     for(m=0;m<=3;m++)
     {
      for(n=0;n<=3;n++)
      {
       store2[m][n]=b[m][n];
      }
     }
     for(n=0;n<=2;n++)
      store[n]=b[0][n];
     
     store[3]=b[1][1];
     for(n=0;n<=2;n++)
      b[0][n]=b[3-n][0];
     for(n=0;n<=2;n++)
      b[3-n][0]=b[3][3-n];
     for(n=0;n<=2;n++)
      b[3][3-n]=b[n][3];
     for(n=0;n<=2;n++)
      b[n][3]=store[n];
     
     b[1][1]=b[2][1];
     b[2][1]=b[2][2];
     b[2][2]=b[1][2];
     b[1][2]=store[3];
     if(jiance(x,i)==1)//若有方块,画图数组恢复原值;
     {
      for(m=0;m<=3;m++)
      {
       for(n=0;n<=3;n++)
       {
        b[m][n]=store2[m][n];
       }
      }
     }
     break;
     ////////////////////////////////////////////////////////////////////////////////////////

 感觉这种检测效率太低;

为了提高效率在下方的检测我已加入了break;

使他快速跳出;

后面的还没有加;

感觉运行起来还是有点卡;

不够灵活;

、、、、

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有