Pregunta

Para mi propia diversión personal, estoy escribiendo lo que espero sea la base de un juego que vendrá más tarde. Actualmente, estoy trabajando en el juego & Quot; board & Quot ;. Tenga en cuenta lo siguiente:

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);
    }
}

Y esto:

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;
    }
}

Sé que esto está tan mal que probablemente ni siquiera sea gracioso, pero este es el corte más rudo.

Estoy intentando que GetLocation devuelva el índice específico de Cube en el que se encuentra Person. De modo que si la persona está en Board.GameBoard[1, 2, 10] podré recuperar esa ubicación (probablemente como int[] como se enumeró anteriormente). Sin embargo, en este momento, no puedo compilar debido al siguiente error:

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

Estaba bastante seguro de que LINQ debería poder consultar matrices multidimensionales, pero no he encontrado ninguna documentación sobre cómo hacerlo.

¿Alguna sugerencia, o estoy en el camino completamente equivocado aquí?

¿Fue útil?

Solución

LINQ no ve las matrices multidimensionales como desea porque no implementan IEnumerable<T> (aunque las matrices de índice único sí, que es lo que sorprende a la gente). Existen varias soluciones alternativas: puede evitar LINQ para buscar en el cubo o puede escribir un método de extensión propio que realice las caminatas más tradicionales.

Este es un caso en el que no usaría LINQ para la búsqueda, pero más que eso, probablemente mantendría algunas referencias a las diversas piezas de juego en una estructura simple (probablemente un diccionario) que es más fácil de actualizar y administrar . Como idea, su objeto de pieza sabría dónde está en el tablero y podría actualizar el cubo a medida que se movía al eliminarse de una celda y agregarse a otra.

Sería importante saber si una sola celda puede contener más de una pieza: si es así, cada celda también debería ser una lista de algún tipo (así aparece en su código). Y una vez que llegue a este punto, si hay muchas menos piezas de juego que celdas, probablemente nunca crearía el & "; Cubo &"; a sí mismo como una estructura de datos. Se dibujaría y las piezas se mostrarían a través de un algoritmo de dibujo de orden Z que se extraía directamente de la lista de piezas, en lugar de una matriz. Sin embargo, esto dependería del estilo del juego: si las piezas tienen atributos y son pequeños en número, esto funcionaría. Si el juego se parece más a 3D Go o similar, entonces tu cubo original tendría sentido ... realmente depende de cuánto & "; Personalidad &"; (y, por lo tanto, datos) que tienen tus piezas.

Otros consejos

Tiene mucho más sentido para mí mover la declaración int [] currentLocation al nivel superior dentro de su clase Person y proporcionar métodos getter / setter. Luego, cada Persona almacena su propia ubicación.

Por el costo de memoria de 3 ints, se ahorra tener que consultar 1000 entradas de la base de datos cada vez que desea recuperar la ubicación de la persona.

Creo que la Persona debería decirle al tablero dónde está, no preguntarle al tablero. En otras palabras, crearía una clase Location3D (x, y, z), la usaría en una clase GamePiece de la que todas las demás cosas del tablero heredan. Eso almacena la ubicación, luego cada pieza sabe su ubicación.

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));
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top