Frage

Für meinen eigenen persönlichen Belustigung, ich Schreibe, was ich hoffe, wird der Grundstein für ein Spiel zu kommen, später.Derzeit arbeite ich auf das Spiel "Brett".Bitte beachten Sie die folgenden:

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

Und dieses:

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

Ich weiß, das ist, so falsch ist es vermutlich auch nicht lustig, aber diese ist die härteste von Rohschnitten.

Ich versuche zu bekommen GetLocation die Rückkehr der bestimmten index des Cube in denen die Person befindet.So dass, wenn die person ist in Board.GameBoard[1, 2, 10] Ich werde in der Lage sein, die zum abrufen der Position (wahrscheinlich als ein int[] wie oben aufgeführt).Aber derzeit bin ich nicht in der Lage zu kompilieren aufgrund des folgenden Fehlers:

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

Ich war mir ziemlich sicher, dass LINQ sollten in der Lage zu Abfrage multi-dimensional arrays, aber ich habe nicht gefunden, keine Dokumentation, wie es zu tun.

Irgendwelche Vorschläge, oder bin ich da auf dem komplett falschen Weg?

War es hilfreich?

Lösung

LINQ nicht sehen multidimential-arrays, wie Sie es wollen, weil Sie nicht umsetzen IEnumerable<T> (obwohl single-index-arrays tun, das ist es, was die Menschen überrascht).Es gibt mehrere Problemumgehungen:vermeiden Sie LINQ für die Suche nach dem cube oder schreiben Sie eine Erweiterung Ihre eigene Methode, die mehr traditionelle Spaziergänge.

Dies ist ein Fall, wo ich würde nicht mit LINQ tun, um die Suche, aber mehr als das, ich würde wahrscheinlich halten einige Verweise auf die verschiedenen Spielsteine in eine einfache Struktur (wahrscheinlich ein Wörterbuch), dass ist einfacher zu aktualisieren und zu verwalten.Als Idee, Ihre Figur Objekt weiß wo es ist auf der platine selbst und konnte, aktualisieren Sie den cube, da Sie sich durch entfernen sich von einer Zelle und das hinzufügen von sich selbst an andere.

Es wäre wichtig zu wissen, ob eine einzelne Zelle kann mehr als ein Stück:wenn ja, jede Zelle müsste eine Liste geben, wie gut (es scheint, dass Art und Weise in Ihrem code).Und sobald Sie diesen Punkt, wenn es wesentlich weniger Figuren als Zellen, wäre ich wahrscheinlich nie tatsächlich schaffen, den "cube" selbst als datastructure.Es würde gezogen werden, und die Teile angezeigt, über einige Z -, um-Zeichnung-Algorithmus, der zog direkt von der Stück-Liste, anstatt ein array.Dies würde davon abhängen, die Art von Spiel, obwohl:wenn die Stücke haben Attribute und sind kleine Zahl dieser arbeiten würde.Wenn die Spiel ist mehr wie 3D-Fahren oder ähnliches, dann Ihren ursprünglichen Würfels würde Sinn machen...es hängt wirklich davon ab, wie viel "Persönlichkeit" (und damit Daten) Ihre Stücke haben.

Andere Tipps

macht viel mehr Sinn für mich die int [] Current Erklärung auf die oberste Ebene in Ihrer Klasse Person zu bewegen, und Getter / Setter-Methoden zur Verfügung stellen. Dann wird jede Person speichert seine eigene Lage.

Für die Speicherkosten von 3 Ints, sparen Sie sich von 1000 Datenbankeinträge Sie jedes Mal abzufragen, die wollen, dass die Person Standort abzurufen.

Ich denke, die Person soll das Board sagen, wo er ist, nicht das Board fragen. Mit anderen Worten, würde ich eine Location3D Klasse (x, y, z) erzeugen, verwendet, dass in einer GamePiece Klasse, die alle andere Dinge auf dem Brett aus erben. Das speichert Lage, dann weiß jeder peice seiner Lage.

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));
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top