문제

개인적인 즐거움을 위해 나중에 나올 게임의 기초가 되기를 바라는 내용을 쓰고 있습니다.현재 저는 "보드"라는 게임을 개발하고 있습니다.다음 사항을 고려하십시오.

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 특정 인덱스를 반환하려면 Cube 어느 Person 위치.그래서 그 사람이 안에 있다면 Board.GameBoard[1, 2, 10] 나는 그 위치를 검색할 수 있을 것입니다(아마도 int[] 위에 나열된 대로).그러나 현재 다음 오류로 인해 컴파일할 수 없습니다.

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

LINQ가 다차원 배열을 쿼리할 수 있어야 한다고 확신했지만 이를 수행하는 방법에 대한 문서를 찾지 못했습니다.

어떤 제안이 있습니까, 아니면 여기서 완전히 잘못된 길을 가고 있습니까?

도움이 되었습니까?

해결책

LINQ에서는 구현하지 않기 때문에 원하는 대로 다차원 배열이 표시되지 않습니다. IEnumerable<T> (단일 인덱스 배열도 가능하지만 이것이 사람들을 놀라게 합니다.)몇 가지 해결 방법이 있습니다.큐브 검색에 LINQ를 사용하지 않거나 보다 전통적인 탐색을 수행하는 확장 메서드를 직접 작성할 수 있습니다.

이는 검색에 LINQ do를 사용하지 않는 경우이지만 그 이상으로 업데이트 및 관리가 더 쉬운 간단한 구조(아마도 사전)로 다양한 연주 부분에 대한 일부 참조를 보관할 것입니다.아이디어로, 당신의 조각 객체는 어디 그것은 보드 자체에 있으며 한 셀에서 자신을 제거하고 다른 셀에 추가하여 큐브가 움직일 때 큐브를 업데이트할 수 있습니다.

단일 셀에 두 개 이상의 조각이 포함될 수 있는지 아는 것이 중요합니다.그렇다면 각 셀도 특정 유형의 목록이어야 합니다(코드에서는 그렇게 표시됩니다).그리고 이 지점에 도달하면 셀보다 플레이 조각이 훨씬 적다면 실제로 "큐브" 자체를 데이터 구조로 만들지 않을 것입니다.배열이 아닌 조각 목록에서 직접 가져온 일부 Z 순서 그리기 알고리즘을 통해 조각이 그려지고 표시됩니다.하지만 이는 게임 스타일에 따라 다릅니다.조각에 속성이 있고 수가 적다면 이것이 작동합니다.게임이 3D Go 또는 그와 유사하다면 원래 큐브가 의미가 있을 것입니다...그것은 실제로 당신의 작품이 얼마나 많은 "개성"(따라서 데이터)을 가지고 있는지에 달려 있습니다.

다른 팁

int[] currentLocation 선언을 Person 클래스 내부의 최상위 레벨로 이동하고 getter/setter 메소드를 제공하는 것이 훨씬 더 합리적입니다.그런 다음 각 Person은 자신의 위치를 ​​저장합니다.

3 정수의 메모리 비용으로 사람의 위치를 ​​검색할 때마다 1000개의 데이터베이스 항목을 쿼리하지 않아도 됩니다.

나는 그 사람이 이사회에 자신이 어디에 있는지 물어볼 것이 아니라 이사회에 알려야 한다고 생각합니다.즉, 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));
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top