2009-06-17 14 views
3

私自身の個人的な娯楽のために、私は後で来るゲームの基礎となることを願っています。現在、私はゲーム「ボード」に取り組んでいます。次の点を考慮してください: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は、多次元配列を照会することができなければならないことをかなり確信していたが、私はどのように上の任意のドキュメントを発見していませんそれをするために。

ここに完全に間違ったトラックがありますか?

答えて

8

LINQは、IEnumerable<T>を実装していないため、多次元配列は表示されません(ただし、単一のインデックス配列では驚きです)。いくつかの回避策があります。キューブを検索するためのLINQを避けることができます。また、より伝統的な散歩を行う独自の拡張方法を記述することもできます。

これは、LINQ doを検索に使用しない場合ですが、それよりも簡単に、簡単な構造(おそらく辞書)でさまざまな再生部分を参照しやすく、管理する。アイデアとして、あなたの作品はを知っています。はボード上にあり、1つのセルから自分自身を削除し、別のセルに自分自身を追加することによって、キューブを更新することができます。

単一のセルに複数の要素を含めることができるかどうかを知ることは重要です。もしそうなら、各セルも同様にいくつかの型のリストである必要があります。この点に着目すれば、細胞よりもずっと少ない演奏部分があれば、実際にはデータ構造として「立方体」自体を作成することは決してありません。それは描画され、ピースリストから配列ではなく直接引っ張られたZオーダー描画アルゴリズムによってピースが表示されます。これは、ゲームのスタイルにも依存します:もし作品が属性を持ち、数が少ない場合、これはうまくいくでしょう。ゲームが3D Goやそれに類するものであれば、元のキューブは意味をなさないでしょう...それは本当にあなたの作品にどれくらいの "個性"(したがってデータ)があるかによって決まります。

+1

ありがとうございました...私はそれを恐れていました。 そして私は、私が答えが必要な質問の一部だけを尋ねた。うわー。 – AllenG

0

私は、あなたのPersonクラスの中でトップレベルにint [] currentLocation宣言を移動し、getter/setterメソッドを提供することにもっと意味があります。そして、それぞれの人は自分の場所を保管します。

メモリコストが3の場合、人の場所を取得するたびに1000データベースエントリをクエリする必要がありません。

0

私は人が彼がどこにいるのか、ボードに尋ねるべきではないと思うと思います。つまり、Location3Dクラス(x、y、z)を作成し、これをGamePieceクラスで使用して、ボード上の他のすべてのものを継承します。それは場所を格納し、各ピースはその場所を知っています。

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