память — Динамическое хранилище в C ++ для генерации шахматных ходов

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

1

Решение

В C ++ есть много контейнеров, в зависимости от ситуации вы можете использовать std::vector, или что-то другое.

Поскольку для выбора контейнера потребовалось бы больше информации от вашего шахматного движка (например, сколько раз он будет изменен, можно ли добавлять движения в передней и задней части вашего контейнера и т. Д.), Мы не можем дать вам прямой ответ с данными, которые вы дал.

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

2

Другие решения

Вы ищете что-то вроде std::vector — шаблон, представляющий коллекцию, размер которой динамически изменяется:

Векторы — это контейнеры последовательностей, представляющие массивы, размер которых может изменяться.

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

2

Многие шахматные движки интенсивно используют рекурсию. Когда вы думаете, скажем 5 ходов (5 сгибов) вперед, вы фактически получаете 5 рекурсивных вызовов. Если вы вводите вызов, локальные переменные этого вызова функции сохраняются в стеке. Так что теоретически было бы достаточно иметь локальную «шахматную доску», например массив полей, каждое из которых содержит фигуру (или является пустым), поскольку все шахматные доски будут автоматически перенесены в стек до тех пор, пока их вызов функции не вернется. Так как пространство стека обычно ограничено, вы также можете иметь каждый вызов (фрейм стека) только для удержания указателя на часть памяти кучи, выделяя его при входе в функцию, до освобождения при выходе из него. Каждый вызов функции возвращает вызывающей стороне «счет» (совокупное значение) комбинаций на «более глубоком» уровне рекурсии (используя обычное значение фигур (пешка = 1, ферзь = 9 и т. Д.). Вместо выделения отдельных досок Вы можете хранить их в векторе. Преимущество в том, что ваша память менее подвержена фрагментации. Каждый вызов может, например, содержать индекс состояния шахматной доски в векторе.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector