2

我正在制作这个 2-D 游戏,我希望能够在其中构建结构。玩家必须能够从某些结构中受益。今天的比赛是这样的:

在此处输入图像描述 (蓝点是玩家,其他点是ais)

我创建了一个名为 Structure 的类和其他三个继承自 Structure 的类。这些类或多或少是空的。游戏的瓷砖有自己的名为 Tile 的类。在这堂课中,我写了一些东西,但感兴趣的代码是这样的:

public LinkedList<Structure> Structures = new LinkedList<Structure>();

当我构建一个结构(例如壁炉)时,代码如下所示:

Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.
    AddFirst(new Fireplace());

我不确定的部分是如何检查列表是否包含例如壁炉(这是一个名为 Fireplace 的类)或任何其他建筑物。例如,如果玩家在瓷砖上发现壁炉,他​​/她将重新获得温暖。这不起作用。也许我对所有这一切都有错误的方法,无论哪种情况,请为我提供一个代码示例。

答案结论:

bool anyFireplace = Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.OfType<Fireplace>().Any();
if (anyFireplace)
{
    Warmth = MaxWarmth;
}
else
{
if (Warmth > 0)
{
    Warmth--;
}
else
{
    HP--;
}
}
4

5 回答 5

2

我建议使用is关键字。它用于检查变量是否具有某种类型。例如:

object example = "Hello World!";
bool isString = example is string; // Evaluates to true

你可以在你的代码中使用它:

foreach (Structure s in Structures)
{
    if (s is FirePlace)
    {
        // Warmup the player
    }
}

另外,我建议使用List<T>而不是LinkedList<T>,因为List<T>(通常)要快得多

正如您可能从其他一些答案中收集到的那样,多种方式通向罗马,有多种方式。然而,根据这个测试,is这样做的方式优于所有其他建议的方式(感谢 Hogan btw 的这个测试):

OfType 时间:.6702958,GetType 时间:.2268946,属性时间:.1400208,Is 时间:.1112995

这种方式is更清洁恕我直言。

于 2013-01-12T19:30:59.763 回答
2

例如,您可以使用,Enumerable.OfType<TResult>()如下Enumerable.Any(TSource)所示:

LinkedList<Structure> structures = new LinkedList<Structure>();

// Add Different Types of Structures

Boolean anyFireplace = structures.OfType<Fireplace>().Any();

只要确保你有:

using System.Linq;

在源代码顶部的 using 指令和对 System.Core 程序集模块的引用中。如果您需要知道 LinkedList 中壁炉的确切数量,也可以使用 Count() 方法,否则 Any() 在 Linq 对象中更有效。

于 2013-01-12T20:03:58.003 回答
1

您可以为此使用 LINQ to Objects:

LinkedList<Structure> list = ...

List<Fireplace> fireplaces = list.OfType<Fireplace>().ToList();

fireplaces然后是类型列表中所有元素的列表Fireplace- 如果不存在,则为空列表。

如果您只想知道一个是否存在,您可以将其修改为:

bool hasFirplace = list.OfType<Fireplace>().Any();
于 2013-01-12T17:17:14.503 回答
0

也许让类名描述对象是不可取的。您将不得不使用有点慢的反射。而且你只会得到一个描述(类名)。你会想要的不止一个。您可能需要考虑这样的基础对象:

public abstract class MapObject
{
   public int x,y;  // object location
   public string myclass;  // object class
   public string mytype;   // object type
   // etc

   // constructor
   public MapObject(string myclass, string mytype);

}

那么壁炉可能看起来像这样

public class FirePlace : MapObject
{
   public FirePlace() 
       : base("Builtin furniture", "Fireplace") { }
   // etc
}

现在您可以遍历所有 MapObjects 的 mytype = "Fireplace"

于 2013-01-12T17:18:49.683 回答
-1

您可以使用 Type 来了解:

foreach(var s in Structures)
{
  var type = s.GetType();
  if(type == typeof(FirePlace)
  {
    (your code here)
  }
}

对于单一方法

public bool HasType<T>(IEnumerable<T> list, Type t)
{
    return list.Any(e=>e.GetType() == t);
}

用法应该是这样的:

if(HasType(Structures,typeof(FirePlace))
{
  (code here)
}

最后你可以把它变成一个扩展方法,但我把这个选项留给你;)

于 2013-01-12T17:16:57.187 回答