玩過,但你知道麼?俄羅斯方塊的旋轉算法。。。

   思考題答案(白色字體):{ 其實只要看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#                                      


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章