Сохранение состояния платы
Самый простой способ, о котором я подумал, - это сначала получить массив из 8 * 8 битов, представляющих местоположение каждой фигуры (1, если есть шахматная фигура, и 0, если ее нет). Поскольку это фиксированная длина, нам не нужен терминатор.
Далее представьте каждую шахматную фигуру в порядке ее расположения. Используя 4 бита на штуку, это занимает 32 * 4 бита (всего 128). Что действительно очень расточительно.
Используя бинарное дерево, мы можем представить пешку в одном байте, рыцаря и ладью и слона в 3 и короля и королеву в 4. Поскольку нам также нужно сохранить цвет фигуры, который занимает дополнительный байт в конечном итоге это выглядит так (извините, если это не так, я никогда раньше не рассматривал кодирование Хаффмана в деталях):
- Пешка: 2
- Ладья: 4
- Рыцарь: 4
- Епископ: 4
- Король: 5
- Королева: 5
С учетом итогов:
2*16 + 4*4 + 4*4 + 4*4 + 2*5 + 2*5 = 100
Что бьет, используя набор битов фиксированного размера на 28 бит.
Итак, лучший метод, который я нашел, это сохранить его в массиве 8 2 + 100 бит
8*8 + 100 = 164
Хранение ходов
Первое, что нам нужно знать, это то, какая часть движется куда. Учитывая, что на доске максимум 32 фигуры, и мы знаем, что такое каждая фигура, а не целое число, представляющее квадрат, мы можем иметь целое число, представляющее смещение фигуры, что означает, что нам нужно всего лишь подогнать 32 возможных значения, чтобы представить шт.
К сожалению, существуют различные специальные правила, такие как рокировка или свержение короля и формирование республики (ссылка на Терри Пратчетта), поэтому перед тем, как сохранить фигуру для перемещения, нам нужен один бит, указывающий, является ли это специальным ходом или нет.
Так что для каждого нормального хода у нас есть необходимые 1 + 5 = 6
биты. (1 битный тип, 5 бит на штуку)
После того, как номер фигуры был декодирован, мы затем узнаем тип фигуры, и каждая фигура должна представлять свой ход наиболее эффективным способом. Например, (если мои шахматные правила до нуля), пешка имеет в общей сложности 4 возможных хода (сделать левый, правый, один шаг вперед, два вперед).
Таким образом, чтобы представить ход пешки, нам нужно 6 + 2 = 8 битов. (6 бит для начального заголовка перемещения, 2 бита для какого перемещения)
Перемещение для королевы было бы более сложным, так как было бы лучше иметь направление (8 возможных направлений, таким образом, 3 бита) и в общей сложности 8 возможных квадратов для перемещения в каждом направлении (таким образом, еще 3 бита) , Таким образом, чтобы представить перемещение королевы, потребуется 6 + 3 + 3 = 12
битов.
Последнее, что приходит мне в голову, это то, что нам нужно хранить информацию о том, какие игроки повернули это. Это должен быть один бит (белый или черный, чтобы двигаться дальше)
Результирующий формат
Таким образом, формат файла будет выглядеть примерно так
[64 бита] Местоположения начальных частей
[100 бит максимум] Начальные части
[1 бит] Ход игрока
[n бит] ходов
Где ход
[1 бит] Тип перемещения (специальный или обычный)
[n бит] Переместить деталь
Если Движение - это нормальное движение, Детализация Движения выглядит примерно так:
[5 бит] шт
[n битов] конкретная часть движения (обычно в диапазоне от 2 до 6 битов)
Если это специальный ход
Он должен иметь целочисленный тип, а затем любую дополнительную информацию (например, если это рокировка). Я не могу вспомнить количество специальных ходов, поэтому, возможно, все будет в порядке, просто чтобы указать, что это особый ход (если есть только один)