2015-04-22 88 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