Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 16.11.25 19:16
Оценка:
Начало тут: https://rsdn.org/forum/etude/9018754.flat
Автор: Shmj
Дата: 15.11 12:34


В общем то классическая мельница 3*3, но с условием запрета обратного хода (т.е. походив фишкой, потом не можешь отменить/пойти взад этой последней фишкой).

Интересно что если нет этого условия — список состояний (и разрешенных ходов из данного состояния) в простом массиве занимает около 180 Кб. — что норм. Т.е. даже об этом не думал, чтобы как-то сжимать.

А вот если добавить правило запрета обратного хода — то чтобы правильно походило (с учетом запретов себя и противника) — полный список всех состояний и данных куда можно ходить — уже занимает 15.9 MB, что проблема. Т.е. уже загружать — быстро не откроется...

Что можно сделать. Очевидное — это симметрия. Левая и правая клеточка равнозначны. А вот верх и низ — уже нет, т.к. там зависит от игрока.

Т.е. за счет симметричности левого и правого — можно ужать в 2 раза.

Далее, я пишут в таком виде:

{
  red: [A1, A2, A3],
  black: [B1, B2, B3],
  redForbidden: null,
  blackForbidden: null,
  transitions: [
    [B1, C1],
    [B2, C1],
    [B2, C2],
    [B2, C3],
    [B3, C3],
  ],
}


т.е. текущее состояние и transitions — разрешенные переходы.

Но состояний то вроде не много, менее 16 тыс., значит влезет в 2 байта. Первые 4 поля значит — 8 байт с лихвой. Ну и преходы.

Еще вариант вычислять на лету, но будет нагружать слабые телефоны.
=сначала спроси у GPT=
Re: Как лучше сжать данные разрешенных ходов для игры?
От: Muxa  
Дата: 17.11.25 08:01
Оценка:
S>Начало тут: https://rsdn.org/forum/etude/9018754.flat
Автор: Shmj
Дата: 15.11 12:34


S>В общем то классическая мельница 3*3,


Суть игры-то в чем?
Как ходить? Какая цель?
Re: Как лучше сжать данные разрешенных ходов для игры?
От: Qulac Россия  
Дата: 17.11.25 08:12
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Начало тут: https://rsdn.org/forum/etude/9018754.flat
Автор: Shmj
Дата: 15.11 12:34


S>В общем то классическая мельница 3*3, но с условием запрета обратного хода (т.е. походив фишкой, потом не можешь отменить/пойти взад этой последней фишкой).


S>Интересно что если нет этого условия — список состояний (и разрешенных ходов из данного состояния) в простом массиве занимает около 180 Кб. — что норм. Т.е. даже об этом не думал, чтобы как-то сжимать.


S>А вот если добавить правило запрета обратного хода — то чтобы правильно походило (с учетом запретов себя и противника) — полный список всех состояний и данных куда можно ходить — уже занимает 15.9 MB, что проблема. Т.е. уже загружать — быстро не откроется...


S>Что можно сделать. Очевидное — это симметрия. Левая и правая клеточка равнозначны. А вот верх и низ — уже нет, т.к. там зависит от игрока.


S>Т.е. за счет симметричности левого и правого — можно ужать в 2 раза.


S>Далее, я пишут в таком виде:


S>
S>{
S>  red: [A1, A2, A3],
S>  black: [B1, B2, B3],
S>  redForbidden: null,
S>  blackForbidden: null,
S>  transitions: [
S>    [B1, C1],
S>    [B2, C1],
S>    [B2, C2],
S>    [B2, C3],
S>    [B3, C3],
S>  ],
S>}
S>


S>т.е. текущее состояние и transitions — разрешенные переходы.


S>Но состояний то вроде не много, менее 16 тыс., значит влезет в 2 байта. Первые 4 поля значит — 8 байт с лихвой. Ну и преходы.


S>Еще вариант вычислять на лету, но будет нагружать слабые телефоны.


Обзор алгоритмов сжатия графов если что, я не читал что там, но может полезное. А вообще 15.9 MB это не много, запихни в source пусть при установки программы загружаются.
Программа – это мысли спрессованные в код
Re[2]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 09:25
Оценка:
Здравствуйте, Muxa, Вы писали:

S>>В общем то классическая мельница 3*3,


M>Суть игры-то в чем?


Выстроить линию как с крестиках ноликах — и не дать противнику выстроить линию первым.

M>Как ходить? Какая цель?


См. 2 схему — разрешенные направления хода — по линиям:

=сначала спроси у GPT=
Re[3]: Как лучше сжать данные разрешенных ходов для игры?
От: Muxa  
Дата: 17.11.25 09:55
Оценка:
S>>>В общем то классическая мельница 3*3,
M>>Суть игры-то в чем?

S>Выстроить линию как с крестиках ноликах — и не дать противнику выстроить линию первым.


Судя по описанию по ссылке, изначально фишки уже находятся в выигрышной позиции выстроенные в линию. Ходы можно пропускать?
Re[4]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 11:14
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Судя по описанию по ссылке, изначально фишки уже находятся в выигрышной позиции выстроенные в линию. Ходы можно пропускать?


Эта линия — исключение — для красных своя линия 1, которая не выигрышная. Для черных — своя.
=сначала спроси у GPT=
Re[2]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 11:18
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>Обзор алгоритмов сжатия графов если что, я не читал что там, но может полезное. А вообще 15.9 MB это не много, запихни в source пусть при установки программы загружаются.


Для сайта — много.
=сначала спроси у GPT=
Re[3]: Как лучше сжать данные разрешенных ходов для игры?
От: Muxa  
Дата: 17.11.25 12:20
Оценка:
Q>>Обзор алгоритмов сжатия графов если что, я не читал что там, но может полезное. А вообще 15.9 MB это не много, запихни в source пусть при установки программы загружаются.

S>Для сайта — много.


А сколько у тебя на сайте запросов в секунду?
Re[4]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 13:50
Оценка:
Здравствуйте, Muxa, Вы писали:

S>>Для сайта — много.

M>А сколько у тебя на сайте запросов в секунду?

Да просто человеку ждать загрузки страницы — 10 Мб даже — это много. Ну 1 Мб — еще куда ни шло...
=сначала спроси у GPT=
Re: Как лучше сжать данные разрешенных ходов для игры?
От: alpha21264 СССР  
Дата: 17.11.25 14:04
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Начало тут: https://rsdn.org/forum/etude/9018754.flat
Автор: Shmj
Дата: 15.11 12:34


А зачем тебе хранить "дерево ходов"?
Ну ты же правила описал с помощью нескольких русских фраз.
Опиши это на любом языке программирования.
И ничего не надо хранить/пересылать —
ты будешь строить дерево по мере необходимости.

Течёт вода Кубань-реки куда велят большевики.
Re[2]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 15:59
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>А зачем тебе хранить "дерево ходов"?

A>Ну ты же правила описал с помощью нескольких русских фраз.
A>Опиши это на любом языке программирования.
A>И ничего не надо хранить/пересылать —
A>ты будешь строить дерево по мере необходимости.

Так цель же не просто чтобы программа играла — цель чтобы гарантированно не проиграла и по возможности выиграла. А в этой игре есть ходы, которые приводят к поражению.

Возможно существует простое правило как не проиграть, но я такого правила не знаю.
=сначала спроси у GPT=
Re[3]: Как лучше сжать данные разрешенных ходов для игры?
От: alpha21264 СССР  
Дата: 17.11.25 16:19
Оценка:
Здравствуйте, Shmj, Вы писали:

A>>И ничего не надо хранить/пересылать —

A>>ты будешь строить дерево по мере необходимости.

S>Так цель же не просто чтобы программа играла — цель чтобы гарантированно не проиграла и по возможности выиграла. А в этой игре есть ходы, которые приводят к поражению.


S>Возможно существует простое правило как не проиграть, но я такого правила не знаю.


Научи программу смотреть на несколько ходов вперёд.

Течёт вода Кубань-реки куда велят большевики.
Re[4]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 16:26
Оценка:
Здравствуйте, alpha21264, Вы писали:

S>>Возможно существует простое правило как не проиграть, но я такого правила не знаю.

A>Научи программу смотреть на несколько ходов вперёд.

Пробовал — нужно достаточно на много ходов смотреть, иначе есть возможность "загнать в угол". Т.е. ходов вообще нет, к примеру (а обратный запрещен).

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

Причем, что интересно, ни одной полноценной реализации этой игры не встречал. Есть несколько в маркете, но везде алгоритм поверхностный, не гарантирует победу компьютера. А это не интересно — один раз победишь и уже знаешь как играть. В моей версии победа кожаного исключена и кожаный обычно на 30-40 шаге делает ошибку и проигрывает, это в лучшем случае.
=сначала спроси у GPT=
Отредактировано 17.11.2025 16:26 Shmj . Предыдущая версия .
Re: Как лучше сжать данные разрешенных ходов для игры?
От: mike_rs Россия  
Дата: 17.11.25 17:34
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Интересно что если нет этого условия — список состояний (и разрешенных ходов из данного состояния) в простом массиве занимает около 180 Кб. — что норм. Т.е. даже об этом не думал, чтобы как-то сжимать.

S>А вот если добавить правило запрета обратного хода — то чтобы правильно походило (с учетом запретов себя и противника) — полный список всех состояний и данных куда можно ходить — уже занимает 15.9 MB, что проблема. Т.е. уже загружать — быстро не откроется...

ты отменяешь только последний ход — банально запомни его отдельно не давай переходить, даже если стандартное состояние разрешает это. Зачем усложнять-то?
Re[2]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 17:42
Оценка:
Здравствуйте, mike_rs, Вы писали:

S>>А вот если добавить правило запрета обратного хода — то чтобы правильно походило (с учетом запретов себя и противника) — полный список всех состояний и данных куда можно ходить — уже занимает 15.9 MB, что проблема. Т.е. уже загружать — быстро не откроется...


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


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

Если правило запрета обратного хода убрать — то быстро приходим к туды-сюды, когда красный игрок, чтобы не проиграть — возвращает назад и черные тоже возвращает назад, потом вперед-назад. А это неинтересно, как бы ничья. Вот когда запрет на обратный ход — намного интереснее.
=сначала спроси у GPT=
Отредактировано 17.11.2025 17:42 Shmj . Предыдущая версия .
Re: Как лучше сжать данные разрешенных ходов для игры?
От: Hоmunculus  
Дата: 17.11.25 17:55
Оценка:
Здравствуйте, Shmj, Вы писали:

Ты хранишь целиком все состояния? Можно же дельту от предыдущего. Ну типа как git работает
Re[2]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 17:58
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Ты хранишь целиком все состояния? Можно же дельту от предыдущего. Ну типа как git работает


Так я храню состояния, чтобы для каждого из них знать куда можно походить а куда нельзя. Т. е. чтобы программа 100% гарантировано никогда не проиграла и выиграла, если кожаный допустил хотя бы одну ошибку (а кожаный ее обязательно допустит рано или поздно — устанет и допустит ошибку).

Возможно есть эвристические правила, которые позволяют не проиграть и не попасть в безвыходную ситуацию — но я их не знаю Видимо знахарь их знал.
=сначала спроси у GPT=
Отредактировано 17.11.2025 18:05 Shmj . Предыдущая версия .
Re[3]: Как лучше сжать данные разрешенных ходов для игры?
От: Hоmunculus  
Дата: 17.11.25 18:06
Оценка: 4 (1)
Здравствуйте, Shmj, Вы писали:

Храни тогда дельту не занятых мест, а наоборот дельту возможных ходов
Re[3]: Как лучше сжать данные разрешенных ходов для игры?
От: Qulac Россия  
Дата: 17.11.25 18:23
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Hоmunculus, Вы писали:


H>>Ты хранишь целиком все состояния? Можно же дельту от предыдущего. Ну типа как git работает


S>Так я храню состояния, чтобы для каждого из них знать куда можно походить а куда нельзя. Т. е. чтобы программа 100% гарантировано никогда не проиграла и выиграла, если кожаный допустил хотя бы одну ошибку (а кожаный ее обязательно допустит рано или поздно — устанет и допустит ошибку).


S>Возможно есть эвристические правила, которые позволяют не проиграть и не попасть в безвыходную ситуацию — но я их не знаю Видимо знахарь их знал.


А почему бы тогда просто не перенести логику игры на сервер, а фронт просто показывает?
Программа – это мысли спрессованные в код
Re[4]: Как лучше сжать данные разрешенных ходов для игры?
От: Shmj Ниоткуда  
Дата: 17.11.25 18:49
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>А почему бы тогда просто не перенести логику игры на сервер, а фронт просто показывает?


А если кто-то в оффлайне захочет время коротать? Онлайн и так куча развлечений.
=сначала спроси у GPT=
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.