现在的位置: 首页 > 综合 > 正文

玩过,但你知道么?俄罗斯方块的旋转算法。。。

2018年02月16日 ⁄ 综合 ⁄ 共 1424字 ⁄ 字号 评论关闭

   思考题答案(白色字体):{ 其实只要看a[0]的位置放的是原来a[?]的值就可以矩阵是怎么转的了?嘿嘿,现在你们还看不懂哦,所以写在了这里,坏啊。。。。} 选中查看,不要偷看哦!

 

   本例子是我一年前在大学毕业实习期间做过的一个小游戏中一位年轻的老师讲过的,虽然自己当时也实现了算法,但是比这个算法复杂多了。本来都已经忘记怎么算了,前几天琢磨一下还是记起来了,所以想写写记下来省的以后又忘记了。

    由于本人比较懒,画图困难,所以这里去掉长条。这里只演示一下3X3的图形变换的过程,4X4的可以照搬。

    正文如下:

    采用一个一维数组模拟一个3X3的数字矩阵a[9] = {0};其中很容易通过对下标除3取余得到一个3X3二维排列的矩阵形式如下:

      a[0] a[1] a[2]                0, 0, 0,
      a[3] a[4] a[5]    ----->>>    0, 0, 0,
      a[6] a[7] a[8]                0, 0, 0

    如果对数组初始化成:

                  a[] = { 0, 1, 1,
                          0, 1, 0,
                          0, 1, 0 };

     如果1表示显示颜色(小方块),0则不显示,

     那么以上数组表示的就是俄罗斯方块中的(蓝色部分):

                                      

     如果要把上述图形按照【逆时针】翻转成:

                                       

     那么对应的数组的值则变成了:                                 

                  a[] = { 1, 0, 0,
                          1, 1, 1,
                          0, 0, 0 };

     你会用怎样的同一个方法来实现这样的连续翻转呢?

    玩家按一下向上的方向键则变换一次,每按一次则变换一次。

    其实这也是上一个数组a[]中相应的值进行一次【逆时针变换】即可,即:     

    0, 1, 1            a[0] a[1] a[2]    逆        a[2] a[5] a[8]            1, 0, 0
    0, 1, 0     ==     a[3] a[4] a[5]  ----->>>    a[1] a[4] a[7]     ==     1, 1, 1
    0, 1, 0            a[6] a[7] a[8]              a[0] a[3] a[6]            0, 0, 0

-----------------------------------------------------------------------------------------

    所以怎样实现这种变换才是关键问题,这里我们设置一个数组b[]记录逆时

    针翻转后数组的下标序列 : 

             b[] = { 2, 5, 8,
                     1, 4, 7,
                     0, 3, 6 };

   那么我们设置一个新数组,

              int a_2[8] = {0};
              int i;
              for ( i = 0; i < 9; i++ )
              {
                 a_2[i] = a[ b[i] ];             /* @1 */
              };

   这样就得到了一个由a逆时针翻转后的新数组a_2[],然后:

              memcpy( a, a_2, sizeof(a_2) );

   则a得到了自己逆时针翻转后的数组了,然后当玩家再按一次向上的方向键的时候再运行一次这个过程即可。

   呵呵,写玩了,是不是有读到@1的时候有种从<昏昏欲睡>的感觉到精神为之<一震>的感觉?有木有,有木有啊?木有的

   话我会失望的啦,其实我学编程就是超喜欢这种感觉哈~

    最后留个思考题:如果把@1处改为:

              a_2[ b[i] ] = a[i]           /* @2 */

   会是一样的结果么?懂的留下你的答案吧!最后预祝五一快乐啦~第一个技术贴。。。bingo#                                      



抱歉!评论已关闭.