|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- Title: Игровая логика «Памяти»
- Date: 2024-05-03 00:00
- Category: News
- Slug: memory-logic
- Lang: ru
-
- # Игровая логика «Памяти»
-
- В апреле реализовал игровую логику игры «Память» на Python в виде модели ограниченного языка и успешно перевёл её инструментом в C++.
-
- Модель ограниченного языка предполагает следующую архитектуру из двух частей:
-
- 1. контекст состояния
- 1. чистые функции без побочных эффектов, работающие лишь с контекстом
-
- Контекст состояния игровой логики на Python получился следующим ([C++][ctx_cxx]):
-
- ```python
- class memory_Context:
- def __init__(self):
- self.hiddenItems = []
- self.mismatchedItems = []
- self.playfieldItems = {}
- self.playfieldSize = 0
- self.recentField = "none"
- self.selectedId = -1
- self.selectedItems = []
- self.victory = False
- ```
-
- Т.к. инструмент на текущий момент работает лишь с функциями, то контекст для Python и С++ пока пишем руками.
-
- Функции получились примерно такими ([C++][func_cxx]):
-
- ```python
- # Select item
- @llm_by_value
- def memory_selectItem(
- c: memory_Context
- ) -> memory_Context:
- if (
- len(c.selectedItems) == 2
- ):
- c.selectedItems.clear()
- #}
- c.selectedItems.append(c.selectedId)
- c.recentField = "selectedItems"
- return c
- #}
- ```
-
- Особенности функций для модели ограниченного языка:
-
- * декоратор `@llm_by_value` в Python нужен для передачи аргументов по значению, а не по ссылке (по умолчанию - по ссылке)
- * передача по значению обязательна для ограничения сферы действия функции ровно одним исходящим полем контекста, т.е. это реализация Принципа Единственной Ответственности (Single Responsibility Principle)
- * контекст содержит поле `recentField`, представляющее собой хранимое «событие»; это поле позволяет функциям среагировать лишь в момент изменения значения интересующего поля
- * функция обязана в поле `recentField` указать изменённое поле контекста либо `none` в случае отсутствия изменений
- * функция принимает на вход контекст и выдаёт (изменённый) контекст на выход
-
- Полный список фукций игровой логики «Памяти»:
-
- | № | Функция | Инициатор вызова | Описание |
- | --- | --- | --- | --- |
- | 1 | `memory_generateConstPlayfield` | Пользователь | Генерируем упрощённое игровое поле, в котором последовательно парами идут элементы одной группы |
- | 2 | `memory_selectItem` | Пользователь | Выбор элемента игрового поля |
- | 3 | `memory_shouldDeselectMismatchedItems` | Система | Реакция снятия выделения с пары выбранных фишек различающихся групп |
- | 4 | `memory_shouldDetectVictory` | Система | Реакция определения победы после скрытия всех фишек |
- | 5 | `memory_shouldHideMatchingItems` | Система | Реакция скрытия пары выбранных фишек одной группы |
-
- Для удостоверения работоспособности и идентичности работы этих функций как в Python, так и в C++, на каждую функцию ввёл минимум по одной функции проверки:
-
- * `memory_test_generateConstPlayfield`
- * `memory_test_selectItem_1x`
- * `memory_test_selectItem_2x`
- * `memory_test_selectItem_3x`
- * `memory_test_shouldDeselectMismatchedItems`
- * `memory_test_shouldDeselectMismatchedItems_itemTwice`
- * `memory_test_shouldDetectVictory`
- * `memory_test_shouldHideMatchingItems`
-
- # Планы на май
-
- Сделаю возможность сыграть одну партию игры «Память» в текстовом интерфейсе.
-
- [ctx_cxx]: https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory_Context.h
- [func_cxx]: https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory.cpp#L29
|