递归构建对象列表

时间:2015-04-22 21:06:21

标签: c# recursion mono

我正在开发一款游戏,其中我有一个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;
}

如何在执行结束时获得包含所有匹配对象的列表?

注意:我知道我需要阻止检查我开始的字段,但为了方便起见,请将其留在这里。

2 个答案:

答案 0 :(得分:2)

将列表传递给CheckForMatches。它只是在找到匹配时将匹配添加到列表中,并将相同的列表传递给递归调用。

在进行初始调用时传递一个空列表以开始递归搜索。

答案 1 :(得分: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异常。与您离开阵列上端的另一侧相同。