回覆列表
  • 1 # 豔子58683

     俄羅斯方塊是一個很經典的遊戲,程式設計實現也不是很難,但並不是每個程式設計師都能編寫出這個遊戲。也許很多人(包括我在內)在編寫前對這個遊戲或多或少存在一些疑問,比如方塊如何旋轉變形,如何判斷下落等,也許正是這些問題的存在導致了一部分人沒有著手開發。

      本篇就俄羅斯方塊講解幾個難點和技巧。

      (1)方塊如何旋轉(變形)?

      這是我遇到的最難的問題了,網上一些資料說使用陣列儲存方塊的幾種形狀,看到這句話時我還是一頭霧水,因為陣列中儲存的是固定的xy座標值。後來當我製作這個遊戲時,才發現數組原來是這麼用的:旋轉使用的是狀態間的座標偏移量,即當由狀態A轉到狀態B時,x上偏移量記為bx-ax,則方塊的新的x座標=原x座標+(bx-ax),同理y座標。

    如上圖所示,假如方塊由ABCD四小塊組成,狀態由左到右轉換時,方塊A的xy座標均加+1(+1是x方向上的偏移量,也是y上的偏移量);方塊B的x座標加+1,y座標加-1;C不變;D的x座標加-1,y座標加+1。

      (2)方塊如何移動?

      拿左移舉例,ABCD的x座標均加-1,但有一個前提,即新的座標位置均沒有被其他方塊佔用時,此組方塊才能移動,上面的旋轉也不例外。所以每次移動或旋轉前計算新座標位置,判斷新位置不被佔用時移動或旋轉。

      右移,下落同左移。

      關於如何判斷,講一個小技巧:

      我們定義一個二維陣列10*20,代表整個空間的狀態,初始全為0,0表示未被方塊佔用,1佔用。因此,左移只需判斷的是二維陣列中每個方塊的offsetX-1位置是否被佔用,是否越過了左邊界。offsetX與x的關係是:x=offsetX*方塊邊長。

      如果我們不想判斷邊界,那麼我們可以把這個二維陣列擴大為11*21的陣列,最左列、最右列和底行初始化為1,相當於在原有二維陣列之外包了一層牆壁。

      (3)當有其中一個方塊停止下落時,如何保證其他3個方塊也停止下落?

      很簡單,當有其中一個方塊停止下落後,馬上建立新的一組方塊即可保證。因為自動下落所操作的方塊都是最新(當前)的4個(或一組)。

      (4)如何消行?

  • 中秋節和大豐收的關聯?
  • 愛情怎麼了?感覺愛一個人好難,為什麼?