2012-11-14 57 views
0

我正在制作基于文本的游戏,我希望我的英雄能够在3x3网格内移动。我试着用一个二维数组很容易地做到这一点。我遇到的问题是,我想为每个英雄所在的网格调用一个方法。因此,如果英雄处于网格0,0,那么我会调用atHouse()方法,如果他去了0,1我打电话atTree()方法。每种方法都会给出该区域的描述,其中的项目等...基于文本的游戏运动

因此,由于我无法在数组中存储方法,因此我正在考虑可能采取另一种方式。我只是不知道什么方式可能是最好的。有人以一种比我所描述的更好的质量方式建立了一个世界吗?

+0

为什么你不能在数组中存储方法?如何处理一组数据用你想要的方法放置对象? –

+0

您可以将二维数组映射的索引调用某种调用方对象的函数调用。或者,也许我不明白这个问题... – Whymarrh

+0

你能分享一些代码吗? – Whymarrh

回答

1

最简单的解决方案是创建一个工厂方法:

我建议为每个位置名称的二维数组:

[ 
    ["House", "Tree", "etc"], 
    ["etc", "etc", "etc"], 
    ["etc", "etc", "etc"] 
] 

然后 ,你可以定义一个方法,您可以将该位置传递给您的工厂方法,该方法将获取要在交换机中使用的函数名称。显然,这个解决方案并不是最好的,因为你必须明确定义每个方法调用。

public void runMethod(int row, int col) 
{ 
    string mName = myArray[row][col]; 

    switch(mName) 
    { 
     case "House": 
      atHouse(); 
     break; 
     //etc 
    } 
} 
+0

我喜欢这个想法。我明白它可以工作,但感觉就像我在太多的地方添加代码。所以我明确指出这不是最好的解决方案。什么可能是更优雅的解决方案? – tazboy

+0

这似乎是最好的选择。这对我来说很有意义,而现在,这才是最重要的。谢谢。 – tazboy

1

我会认为一个基类的数组,使用describe()方法将它称为location是最好的方法。然后,您可以继承house类和tree类。

或者您可以创建location的实例并设置description属性。

+0

所以像位置[] []位置= {Location.atHouse(),Location.atTree(),...}或类似的东西? – tazboy

1

而不是将对象存储在一个数组中,您可以定义一个方法,将位置作为参数。 说位置1表示英雄在0,0,位置2表示英雄在0,1。

public void heroMoved(int position){ 
    switch(position){ 
    case 1: 
      call method associated 
      break; 
    case 2: 
      call method associated 
      break; 
     . 
     . 
     so on 
} 
} 
+0

我明白你的意思了。但因为我宁愿有两个值,就像坐标点一样,我想我可以嵌套switch语句或if语句。所以像1,然后1,2或3; 2然后1,2,3; 3然后是1,2,3;使其成为3x3。不错。谢谢。 – tazboy