Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

2024-05_memory-logic.md 4.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. Title: Игровая логика «Памяти»
  2. Date: 2024-05-03 00:00
  3. Category: News
  4. Slug: memory-logic
  5. Lang: ru
  6. # Игровая логика «Памяти»
  7. В апреле реализовал игровую логику игры «Память» на Python в виде модели ограниченного языка и успешно перевёл её инструментом в C++.
  8. Модель ограниченного языка предполагает следующую архитектуру из двух частей:
  9. 1. контекст состояния
  10. 1. чистые функции без побочных эффектов, работающие лишь с контекстом
  11. Контекст состояния игровой логики на Python получился следующим ([C++][ctx_cxx]):
  12. ```python
  13. class memory_Context:
  14. def __init__(self):
  15. self.hiddenItems = []
  16. self.mismatchedItems = []
  17. self.playfieldItems = {}
  18. self.playfieldSize = 0
  19. self.recentField = "none"
  20. self.selectedId = -1
  21. self.selectedItems = []
  22. self.victory = False
  23. ```
  24. Т.к. инструмент на текущий момент работает лишь с функциями, то контекст для Python и С++ пока пишем руками.
  25. Функции получились примерно такими ([C++][func_cxx]):
  26. ```python
  27. # Select item
  28. @llm_by_value
  29. def memory_selectItem(
  30. c: memory_Context
  31. ) -> memory_Context:
  32. if (
  33. len(c.selectedItems) == 2
  34. ):
  35. c.selectedItems.clear()
  36. #}
  37. c.selectedItems.append(c.selectedId)
  38. c.recentField = "selectedItems"
  39. return c
  40. #}
  41. ```
  42. Особенности функций для модели ограниченного языка:
  43. * декоратор `@llm_by_value` в Python нужен для передачи аргументов по значению, а не по ссылке (по умолчанию - по ссылке)
  44. * передача по значению обязательна для ограничения сферы действия функции ровно одним исходящим полем контекста, т.е. это реализация Принципа Единственной Ответственности (Single Responsibility Principle)
  45. * контекст содержит поле `recentField`, представляющее собой хранимое «событие»; это поле позволяет функциям среагировать лишь в момент изменения значения интересующего поля
  46. * функция обязана в поле `recentField` указать изменённое поле контекста либо `none` в случае отсутствия изменений
  47. * функция принимает на вход контекст и выдаёт (изменённый) контекст на выход
  48. Полный список фукций игровой логики «Памяти»:
  49. | № | Функция | Инициатор вызова | Описание |
  50. | --- | --- | --- | --- |
  51. | 1 | `memory_generateConstPlayfield` | Пользователь | Генерируем упрощённое игровое поле, в котором последовательно парами идут элементы одной группы |
  52. | 2 | `memory_selectItem` | Пользователь | Выбор элемента игрового поля |
  53. | 3 | `memory_shouldDeselectMismatchedItems` | Система | Реакция снятия выделения с пары выбранных фишек различающихся групп |
  54. | 4 | `memory_shouldDetectVictory` | Система | Реакция определения победы после скрытия всех фишек |
  55. | 5 | `memory_shouldHideMatchingItems` | Система | Реакция скрытия пары выбранных фишек одной группы |
  56. Для удостоверения работоспособности и идентичности работы этих функций как в Python, так и в C++, на каждую функцию ввёл минимум по одной функции проверки:
  57. * `memory_test_generateConstPlayfield`
  58. * `memory_test_selectItem_1x`
  59. * `memory_test_selectItem_2x`
  60. * `memory_test_selectItem_3x`
  61. * `memory_test_shouldDeselectMismatchedItems`
  62. * `memory_test_shouldDeselectMismatchedItems_itemTwice`
  63. * `memory_test_shouldDetectVictory`
  64. * `memory_test_shouldHideMatchingItems`
  65. # Планы на май
  66. Сделаю возможность сыграть одну партию игры «Память» в текстовом интерфейсе.
  67. [ctx_cxx]: https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory_Context.h
  68. [func_cxx]: https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory.cpp#L29