2015-02-05 17 views
0

我有一個二維數組結構來表示我正在製作的遊戲的一部分瓷磚網格。遊戲的一個方面是基於對文本文件的分析,網格以某種隨機的方式填充。然而,從一開始我就已經意識到,只要將它幾乎隨機地做成這樣,而不必拘泥於某種有效性檢查或預防機制,阻止真正配置不當的網格形成,就無法實現。我想避免的主要問題是太多的瓦片會無法相互靠近在一起,從而有可能從其他網格切斷網格塊。 的想法,我想出了儘量避免一些非常糟糕的網格是檢查生成過程中與邏輯是這樣如何在「環視」這個二維數組時適當避免RangeErrors?

if (tileBeingInserted.isTraversable()) { 
    //all is well 
    return true; 
} else { 
    //we may have a problem, are there too many untraversables nearby? 
    //Proceed to check all squares "around" the current one. 
} 

分配瓷磚值每個「網格」時,需要明確的是,檢查各地當前平方意味着檢查8個主要方向中每一個緊鄰的方格。現在,我的問題是我試圖推斷如何編碼,以便在任何時候都不會給出RangeError,或者至少抓住它並在必要時進行恢復。作爲一個例子,你可以清楚地看到其中一個角落的方塊是最糟糕的情況,因爲算法只需要檢查2個方格就是在數組的範圍內。當然,如果一個RangeError發生這個原因,我只是希望程序沒有問題向前進步所以結構

try { 
    //check1 
    //check2...8 
} catch (RangeError e) { 

} 

是不可接受的,因爲只要一個超出範圍的正方形的測試代碼掉下來檢查的塊。我想到的另一種方式,但不喜歡因爲它的混亂,將每個支票單獨包裝在試試看,是的,這將工作,我猜,但這是一些可怕的代碼...所以任何人都可以幫我在這裏?在避免我沒有看到的RangeErrors這個問題上,可能有不同的角度?

+0

我是否正確理解您的問題 - 您是否嘗試避免這8項檢查,或者是否將檢查本身拋出?他們爲什麼會拋出? – 2015-02-05 14:03:36

+0

我想做檢查,因爲他們的想法是檢查與當前已經初始化的方塊相鄰的方塊是否也是不可逆地形。如果試圖在第一個方塊(左上角,0,0)周圍進行驗證並最終檢查諸如'grid [-1] [0]'之類的東西,那麼檢查就會拋出。這將超出範圍。我已經意識到的一件事情是,我可能很容易完成一半的工作,因爲在插入過程中我正在進行這種操作,所以4/8鄰接將始終未初始化或超出範圍。儘管如此,仍然存在一些問題。 – 2015-02-05 14:15:15

+0

您可以另外檢查參數以避免這些範圍錯誤。 – 2015-02-05 14:18:06

回答

0

所以我的測試代碼另一個不能遊歷瓷磚應放在是否已經形成了這樣的:

bool _tileFitsWell(int tileTypeInt, int row, int col) 
{ 
    //...initialise some things, set stuff up 
    ... 

    if (tile.traversable == true) { 
     //In this case a new traversable tile is being put in, so no problems. 
     return true; 
    } else { 
     //begin testing what tiles are around the current tile 
     //Test NW adjacent 
     if (row > 0 && col > 0) { 
     temp = tileAt(row - 1, col - 1); 
     if (!temp.traversable) { 
      strikeCount++; 
     } 
     } 
     //Test N adjacent 
     if (row > 0) { 
     temp = tileAt(row - 1, col - 1); 
     if (!temp.traversable) { 
      strikeCount++; 
     } 
     } 
     //Test NE adjacent 
     if (row > 0 && col < _grid[0].length - 2) { 
     temp = tileAt(row - 1, col 1); 
     if (!temp.traversable) { 
      strikeCount++; 
     } 
     } 
     //Test W adjacent 
     if (col > 0) { 
     temp = tileAt(row, col - 1); 
     if (!temp.traversable) { 
      strikeCount++; 
     } 
     } 
    } 
    return strikeCount < 2; 
    } 

每個「初始」 if語句中的代碼(即檢查rowcol的那些)爲了簡單起見,有點僞代碼。正如我在之前的評論中解釋的那樣,爲什麼我不需要檢查其他4個基本方向的瓷磚,因爲這些檢查是在填充地圖時完成的,因此這些位置的瓷磚將始終未被初始化或剛好超出邊界,這取決於函數在給定的時間被調用來檢查的瓦片。

相關問題