2012-02-19 3 views
1

저는 체스 게임을 C++ 구조로 표현하려고합니다. 나는 최선의 선택이 나무 구조가 될 것이라고 생각한다.게임 트리의 C++ 구현

좋은 접근 방법입니까?

struct TreeElement{ 
    SomeMoveType move; 
    TreeElement *parent; 
    std::vector<TreeElement*> children; 
}; 

효율적으로 이러한 종류의 데이터를 파일에 저장 하시겠습니까? 거기에 전체 나무 구조가 mmap 함수를 사용할 수 있도록 메모리의 동일한 부분에 저장됩니다 있는지 확인하는 방법이 있습니까?

+1

포인터를 포함하고'벡터 '를 사용하기 때문에 어떻게 든 직렬화하지 않고 파일에 구조체를 저장할 수 없습니다. –

+2

이것들은 3 가지로 매우 광범위하고 매우 다른 질문들이 하나로 통합되어 있습니다. 제발 그만 하지마. –

+1

노드 이름을 지정하고 (단지 포인터 값 사용) 깊이 우선 orderearch에서 트리를 가로 지르려고 다음과 같이 순서가 지정된 1 차원 배열을 생성 할 수 있습니다. [{node : 1, move : .., parent : 0}, {노드 : 2, 이동 : .., 부모 : 1}, {노드 : 3, 이동 : .., 부모 : 2}, {노드 : 4, 이동 : .., 부모 : 3} – arthurprs

답변

3

데이터를 메모리의 동일한 섹션에 저장하려면 사용하는 std::vector<TreeElement *>에 대한 Allocator 개체를 제공하고 블록에서 할당해야합니다.

실제 포인터를 저장하는 대신 직렬화 할 수 있으려면 블록에 오프셋을 저장하는 것이 좋습니다. 그런 다음 데이터를 다시 읽을 때 각 오프셋에 블록 시작 주소를 추가하여 주소로 되돌릴 수 있습니다.

사용중인 OS/컴파일러에 따라 일부 지원이 이미있을 수 있습니다. 예를 들어, Microsoft의 컴파일러는 __based 포인터를 지원합니다. 그 포인터는 기본 주소와 해당 주소를 기반으로하는 각 포인터가 실제로 오프셋이며 전체 포인터가 아니라 설명했습니다. mmap에 대한 언급은 아마 당신에게 직접 사용 가능하지 않다는 것을 나타내지 만, 가능함 당신이 사용하고있는 컴파일러/OS가 비슷한 것을 가지고 있습니다. 그렇지 않으면 직접 작업해야합니다 (예 : based_pointer 클래스).

정말 중요한 이유는 이동 트리를 직렬화하려고하는 이유입니다. 일반적인 경우에는 현재 보드 위치를 저장하는 것 (또는 이동 히스토리)을 저장하는 것이 좋습니다. 필요할 경우 언제든지 이동 트리를 다시 생성하는 것이 좋습니다. 그만큼 작아서 저장하기가 쉽습니다.

0

std :: vector를 사용하는 것이 트리를 만드는 가장 좋은 방법은 아니지만, 단독 연결 목록 스타일 트리 구조는 아마도 더 간단하고 최상이라고 생각합니다.