Я створюю просту реалізацію MiniMax на мові функціонального програмування Elixir. Оскільки існує безліч ігор з бездоганним знаннями (tic tac toe, connect-four, шашки, шахи тощо), ця реалізація може стати основою для створення AI ігор для будь-якої з цих ігор.
Однак одна із проблем, з якими я стикаюся, полягає в тому, як правильно зберігати стан гри на функціональній мові. Ці ігри в основному мають справу з двовимірними ігровими дошками, де такі операції часті:
- Прочитайте вміст певного місця на дошці
- Оновіть вміст певного місця на дошці (при поверненні нової можливості переміщення)
- З урахуванням вмісту однієї або декількох локацій, які підключені до поточного місця розташування (тобто наступного або попереднього горизонтального, вертикального або діагонального розташування)
- Розгляд вмісту кількох підключених місць у будь-якому напрямку.
- Враховуючи вміст цілих файлів, рангів та діагоналей.
- Обертання або дзеркальне відображення дошки (щоб перевірити наявність симетрій, які дають такий же результат, як і щось, що вже розраховано).
Більшість функціональних мов використовують пов'язані списки та кортежі як основні будівельні блоки багатоелементних структур даних. Однак вони здаються дуже поганими для роботи:
- Пов'язані списки мають O (n) (лінійний) час пошуку. Крім того, оскільки ми не можемо "сканувати та оновлювати дошку" за один проїзд над дошкою, використання списків видається дуже недоцільним.
- Кортежі мають O (1) (постійний) час пошуку. Однак подання дошки як кортежу фіксованого розміру дуже важко переглядати ранги, файли, діагоналі чи інші види послідовних квадратів. Крім того, і Elixir, і Haskell (які є двома моїми функціональними мовами) не мають синтаксису для читання n- го елемента кортежу. Це унеможливить написання динамічного рішення, яке б працювало для дощок довільного розміру.
Elixir має вбудовану структуру даних карт (І Haskell має Data.Map
), яка дозволяє O (log n) (логарифмічний) доступ до елементів. Зараз я використовую карту з x, y
кортежами, які представляють позицію як ключі.
Це "працює", але почувається неправильним зловживати картами таким чином, хоча я не знаю точно, чому. Я шукаю кращого способу зберігання двовимірної ігрової дошки на функціональній мові програмування.