Domanda

Per mio divertimento personale, sto scrivendo quello che spero possa essere la base di un gioco che verrà dopo. Al momento, sto lavorando al gioco & Quot; board & Quot ;. Si prega di considerare quanto segue:

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

E questo:

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

So che è così sbagliato che probabilmente non è nemmeno divertente, ma questo è il più approssimativo dei tagli approssimativi.

Sto cercando di ottenere GetLocation per restituire l'indice specifico del Cube in cui si trova Person. In modo che se la persona si trova in Board.GameBoard[1, 2, 10] sarò in grado di recuperare quella posizione (probabilmente come int[] come elencato sopra). Tuttavia, al momento, non riesco a compilare a causa del seguente errore:

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

Ero abbastanza sicuro che LINQ sarebbe stato in grado di interrogare array multidimensionali, ma non ho trovato alcuna documentazione su come farlo.

Qualche suggerimento o sono sulla strada completamente sbagliata qui?

È stato utile?

Soluzione

LINQ non vede le matrici multidimensionali come le vuoi tu perché non implementano IEnumerable<T> (anche se le matrici a indice singolo lo fanno, il che sorprende le persone). Esistono diverse soluzioni alternative: è possibile evitare LINQ per la ricerca nel cubo oppure è possibile scrivere un metodo di estensione personalizzato che esegua le camminate più tradizionali.

Questo è un caso in cui non userei LINQ per la ricerca, ma probabilmente conserverei alcuni riferimenti ai vari brani in una struttura semplice (probabilmente un dizionario) che è più facile da aggiornare e gestire . Come idea, l'oggetto pezzo riconoscerebbe dove si trova sulla scheda stessa e potrebbe aggiornare il cubo mentre si spostava rimuovendosi da una cella e aggiungendosi a un'altra.

Sarebbe importante sapere se una singola cella può contenere più di un pezzo: in tal caso, ogni cella dovrebbe essere anche un elenco di qualche tipo (appare così nel tuo codice). E una volta arrivato a questo punto, se ci sono molti meno pezzi da suonare rispetto alle celle, probabilmente non creerei mai il & Quot; cubo & Quot; stesso come una struttura di dati. Verrà disegnato e i pezzi visualizzati tramite un algoritmo di disegno dell'ordine Z che è stato estratto direttamente dall'elenco dei pezzi, piuttosto che un array. Ciò dipenderebbe dallo stile di gioco: se i pezzi hanno attributi e sono piccoli, funzionerebbe. Se il gioco è più simile a 3D Go o simile, il tuo cubo originale avrebbe senso ... dipende davvero da quanto & Quot; personalità & Quot; (e quindi i dati) dei tuoi pezzi.

Altri suggerimenti

Per me ha molto più senso spostare la dichiarazione int [] currentLocation al livello più alto all'interno della tua classe Person e fornire metodi getter / setter. Quindi ogni persona memorizza la propria posizione.

Per il costo della memoria di 3 pollici, ti risparmi di dover interrogare 1000 voci di database ogni volta che vuoi recuperare la posizione della persona.

Penso che la Persona dovrebbe dire al consiglio di amministrazione dove si trova, non chiedere al consiglio di amministrazione. In altre parole, creerei una classe Location3D (x, y, z), la userei in una classe GamePiece da cui ereditano tutte le altre cose sulla scacchiera. Che memorizza la posizione, quindi ogni pey sa che è la posizione.

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));
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top