3

为了我个人的娱乐,我正在写我希望将成为以后游戏的基础的东西。目前,我正在开发游戏“棋盘”。请考虑以下几点:

class Board
{
    private Cube[,,] gameBoard;
    public Cube[, ,] GameBoard { get; }
    private Random rnd;
    private Person person;
    public Person _Person { get; }

    //default constructor
    public Board()
    {
        person = new Person(this);
        rnd = new Random();
        gameBoard = new Cube[10, 10, 10];
        gameBoard.Initialize();
        int xAxis = rnd.Next(11);
        int yAxis = rnd.Next(11);
        int zAxis = rnd.Next(11);

        gameBoard[xAxis, yAxis, zAxis].AddContents(person);
    }
}

还有这个:

class Person : IObject
{
    public Board GameBoard {get; set;}
    public int Size { get; set; }
    public void Move()
    {
        throw new NotImplementedException();
    }

    public void Move(Cube startLocation, Cube endLocation)
    {
        startLocation.RemoveContents(this);
        endLocation.AddContents(this);
    }

    public Person(Board gameBoard)
    {
        Size = 1;
        GameBoard = gameBoard;
    }

    public int[] GetLocation()
    {
        int[] currentLocation;
        var location =
            from cubes in GameBoard.GameBoard
            where cubes.GetContents.Contains(this)
            select cubes;
    }
}

我知道这是非常错误的,它可能甚至都不好笑,但这是最粗略的粗剪。

我正在尝试GetLocation返回 所在位置的特定Cube索引Person。这样,如果该人在,Board.GameBoard[1, 2, 10]我将能够检索该位置(可能int[]如上所述)。但是,目前,由于以下错误,我无法编译:

Could not find an implementation of the query pattern for source type 'Cubes.Cube[*,*,*]'. 'Where' not found.'

我很确定 LINQ 应该能够查询多维数组,但我还没有找到任何关于如何做到这一点的文档。

有什么建议,还是我在这里完全错误?

4

3 回答 3

8

LINQ 没有看到您想要的多维数组,因为它们没有实现IEnumerable<T>(尽管单索引数组可以,这让人们感到惊讶)。有几种解决方法:您可以避免使用 LINQ 搜索多维数据集,或者您可以编写自己的扩展方法来执行更传统的遍历。

在这种情况下,我不会使用 LINQ 进行搜索,但更重要的是,我可能会将一些对各种播放片段的引用保留在更易于更新和管理的简单结构(可能是字典)中。作为一个想法,您的片段对象将知道在棋盘上的位置,并且可以在立方体移动时通过将自身从一个单元格中移除并将其自身添加到另一个单元格来更新立方体。

重要的是要知道一个单元格是否可以包含多个片段:如果是这样,每个单元格也需要是某种类型的列表(它在您的代码中以这种方式出现)。一旦你到了这一点,如果玩的棋子比单元格少得多,我可能永远不会真正将“立方体”本身创建为数据结构。它将通过一些 Z 顺序绘图算法绘制并显示,该算法直接从片段列表中提取,而不是数组。不过,这将取决于游戏的风格:如果棋子具有属性并且数量很少,这将起作用。如果游戏更像 3D Go 或类似游戏,那么您的原始立方体将是有意义的……这实际上取决于您的棋子有多少“个性”(以及数据)。

于 2009-06-17T19:40:44.323 回答
0

将 int[] currentLocation 声明移动到 Person 类的顶层并提供 getter/setter 方法对我来说更有意义。然后每个人存储自己的位置。

对于 3 个整数的内存成本,您不必在每次想要检索该人的位置时查询 1000 个数据库条目。

于 2009-06-17T19:36:31.773 回答
0

我认为这个人应该告诉董事会他在哪里,而不是问董事会。换句话说,我将创建一个 Location3D 类 (x,y,z),在棋盘上所有其他东西都继承自的 GamePiece 类中使用它。那存储位置,然后每个peice都知道它的位置。

public class Location3D
{
  public Location3D(int x, int y, int z) { X = x; Y = y; Z = z; }
  public int X { get; set; }
  public int Y { get; set; }
  public int Z { get; set; }
}

public abstract GamePiece
{
  public Location3d { get; set; }

public class Person: GamePiece // inherit GamePiece
{
  // everything else about Person
}

public class Board
{
  public Board()
  {
    person = new Person(this);
    rnd = new Random();
    gameBoard = new Cube[10, 10, 10];
    gameBoard.Initialize();
    int xAxis = rnd.Next(11);
    int yAxis = rnd.Next(11);
    int zAxis = rnd.Next(11);

    var location = new Location3D(xAxis, yAxis, zAxis);
    person.Location = location;

    GetCubeAt(location).AddContents(person);
  }

  public Cube GetCubeAt(Location3D location)
  {
    return gameBoard[location.X, location.Y, location.Z];
  }

  public Cube GetCubeAt(int x, int y, int z)
  {
    return GetCubeAt(new Location3D(x,y,z));
  }
}
于 2009-06-17T19:48:18.923 回答