2009-06-17 9 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; 
    } 
} 

나는 이것이 아마도 재미 없어 그렇게 잘못 알고 있지만,이 거친 컷의 거친입니다.

나는 Person이있는 Cube의 특정 색인을 반환하기 위해 GetLocation을 얻으려고합니다. 그 사람이 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를 검색에 사용하지 않는 경우이지만, 간단한 구조 (아마도 사전)로 다양한 재생 부분에 대한 참조를 유지하고 업데이트하기 쉽고 꾸리다. 아이디어로서, 당신의 조각 객체는 을 알고 있습니다.은 보드 자체에 있으며, 하나의 셀에서 자신을 제거하고 다른 셀에 자신을 추가하여 이동함에 따라 큐브를 업데이트 할 수 있습니다.

하나의 셀에 두 개 이상의 조각이 포함될 수 있는지를 아는 것이 중요합니다. 그렇다면 각 셀은 어떤 형식의 목록이어야합니다 (코드에서 그런 식으로 나타남). 그리고 일단 당신이이 시점에 도달하면, 세포보다 훨씬 적은 연주 곡이 있다면, 아마도 실제로 데이터 구조로 "큐브"자체를 만들지 않을 것입니다. 그것은 그려 질 것이고 조각은 배열이 아닌 조각 목록에서 직접 가져온 Z 순서 그리기 알고리즘을 통해 표시됩니다. 이것은 게임의 스타일에 달려 있습니다. 조각에 속성이 있고 숫자가 적 으면이 방법이 효과적입니다. 게임이 3D Go와 비슷하다면, 원래의 큐브는 말이 될 것입니다 ... 그것은 정말로 당신의 조각에 얼마나 많은 "성격"(따라서 데이터)이 있는지에 달려 있습니다.

+1

감사합니다 ... 나는 두려웠습니다. 그리고 나서 나는 그 질문의 일부분에 내가 필요한 대답을 물었습니다. 오케이. – AllenG

0

int [] currentLocation 선언을 Person 클래스의 최상위 레벨로 옮기고 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)); 
    } 
} 
관련 문제