2015-04-22 66 views
0

我正在開發一款遊戲,其中包含8x8字段,每個字段包含1到9的值。遞歸構建對象列表

我有一個函數,它從一個特定的x,y字段開始,並檢查它旁邊的字段是否包含匹配的值。如果找到匹配的字段,則應該再次調用該函數,再次檢查其旁邊的字段。最後,我想要遞歸地找到所有值(它們是對象)的列表。

public void CheckForMatches(int x, int y, int value){ 
    if (field[x,y-1].value == value){ 
    //add to list 
    CheckForMatches[x,y-1,value] 
    } 
    if (field[x,y+1].value == value){ 
    //add to list 
    CheckForMatches[x,y+1,value] 
    } 
    if (field[x-1,y].value == value){ 
    //add to list 
    CheckForMatches[x-1,y,value] 
    } 
    if (field[x+1,y].value == value){ 
    //add to list 
    CheckForMatches[x+1,y,value] 
    } 
    return null; 
} 

如何在執行結束時獲取包含所有匹配對象的列表?

注意:我知道我需要防止檢查字段,我開始但爲了方便起見將它留在這裏。

+1

'return null'在給定'public void'時沒有意義,而遞歸調用對參數列表使用了錯誤的括號:這與您的實際代碼有多接近? – Blorgbeard

+0

我還沒寫過,但是想在睡覺前發佈這個問題,所以我可以在早上開始工作。 – Hedge

回答

2

將列表傳遞給CheckForMatches。當它找到一個時,只需將匹配添加到列表中,並將同一個列表傳遞給遞歸調用。

當您進行初始調用以啓動遞歸搜索時傳遞一個空列表。

+0

這似乎是最明顯的解決方案。畢竟,在代碼中已經有了一些評論,說'//添加到列表'中,一個簡單的'list.add(value);'就足夠了。 – leigero

1

你需要有一個列表...

public void CheckForMatches(int x, int y, int value, List<something> list){ 
    if (field[x,y-1].value == value){ 
    list.Add(match info) 
    CheckForMatches(x,y-1,value, list) 
    } 
    if (field[x,y+1].value == value){ 
    list.Add(match info) 
    CheckForMatches(x,y+1,value, list) 
    } 
    if (field[x-1,y].value == value){ 
    list.Add(match info) 
    CheckForMatches(x-1,y,value, list) 
    } 
    if (field[x+1,y].value == value){ 
    list.Add(match info) 
    CheckForMatches(x+1,y,value, list) 
    } 
} 

這就是所謂的第一次的東西,如:

List<something> matches = new List<something>(); 
CheckForMatches(0, 0, 0, matches); 

編輯:

你需要非常小心的(如上所述),因爲檢查匹配的第一個if語句(字段[x,y-1])將導致引發IndexOutOfBounds異常。同樣,在另一側,你離開陣列的上端。

+0

因此,C#使用引用列表的調用? – Hedge

+0

ref不是必需的,因爲您沒有更改列表的引用(創建新列表)。您可以修改/添加/從列表中刪除不帶ref關鍵字,因爲您正在修改現有的對象。 –

+0

不,它使用按值調用 - 但是您傳遞的是對列表的引用,而不是列表。 – Blorgbeard