繁体   English   中英

Select 使用 LINQ 来自多维数组的未知项

[英]Select unknown item from multi-dimensional array using LINQ

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

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返回Person所在的Cube的特定索引。 因此,如果此人在Board.GameBoard[1, 2, 10]中,我将能够检索该位置(可能是上面列出的int[] )。 但是,目前,由于以下错误,我无法编译:

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

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

有什么建议,还是我走错了路?

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

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

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

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

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

我认为这个人应该告诉董事会他在哪里,而不是问董事会。 换句话说,我会创建一个 Location3D class (x,y,z),在棋盘上所有其他东西继承的 GamePiece class 中使用它。 存储位置,然后每个 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));
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM