2012-02-19 4 views
1

Я собираюсь представить шахматную игру как структуру C++. Я думаю, что лучшим вариантом будет древовидная структура (потому что у каждой глубины есть несколько возможных ходов).C++ реализация игрового дерева

Это хороший подход?

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

Как эффективно хранить этот вид данных в файле? Есть ли способ убедиться, что вся древовидная структура будет храниться в той же части памяти, что позволит использовать функцию mmap?

+1

Вы не можете сохранить эту структуру в файл, не сериализируя ее каким-либо образом, так как она содержит указатели и использует «вектор». –

+2

Это три очень широких и очень разных вопроса, в одном лице. Пожалуйста, не делай этого. –

+1

Я бы попытался присвоить имена узлам (просто использовать значение указателя) и трансверсив дерево в первом порядке заказов, таким образом вы можете сгенерировать упорядоченный 1-мерный массив, например: [{node: 1, move: .., parent : 0}, {узел: 2, перемещение: .., родитель: 1}, {узел: 3, ход: .., родитель: 2}, {узел: 4, ход: .., родитель: 3}] – arthurprs

ответ

3

Чтобы сохранить данные в том же разделе памяти, вы, вероятно, захотите предоставить объект Allocator для используемого вами std::vector<TreeElement *> и выделить его из своего блока.

Чтобы иметь возможность сериализовывать его, вместо хранения фактических указателей вы можете рассмотреть возможность смещения в блоке. Затем, когда вы снова читаете данные, вы можете добавить адрес начала блока в каждое смещение, чтобы вернуть его обратно в адрес.

В зависимости от используемого ОС/компилятора, для этого может быть некоторая поддержка. Например, компилятор Microsoft поддерживает указатели __based, которые в значительной степени описаны мной: базовый адрес, и каждый указатель, основанный на этом адресе, на самом деле является просто смещением, а не полным указателем. Упоминание mmap указывает, что, вероятно, не доступно вам напрямую, но возможно , что у вашего компилятора/операционной системы есть что-то подобное. В противном случае вам, вероятно, придется выполнять работу самостоятельно (например, с классом based_pointer).

Реальный вопрос: почему вы пытаетесь сериализовать дерево перемещения вообще. В типичном случае вам лучше сэкономить текущую позицию на доске (или, примерно, историю движения) и перегенерировать дерево перемещения из этого при необходимости. Этого достаточно меньше, что его очень легко хранить.

0

Я думаю, что использование std :: vector - это не лучший способ создать дерево, одноименная структура дерева стилей, вероятно, проще и лучше.

Смежные вопросы