Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

memory-logic.html 8.1KB

1 månad sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <!DOCTYPE html>
  2. <html>
  3. <meta charset="utf-8">
  4. <head>
  5. <link rel="stylesheet" href="../../style.css">
  6. </head>
  7. <body>
  8. <script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script>
  9. <div id="header">
  10. <div class="header2">
  11. <div class="menu">
  12. <a href="../../ru/news/index.html">Новости</a>
  13. <a href="../../ru/game/index.html">Игры</a>
  14. <a href="../../ru/tool/index.html">Инструменты</a>
  15. <a href="../../ru/page/about.html">О нас</a>
  16. </div>
  17. <div id="lang">
  18. <a href="../../en/news/memory-logic.html">EN</a>
  19. <a href="../../ru/news/memory-logic.html">RU</a>
  20. </div>
  21. <div class="clear"></div>
  22. </div>
  23. </div>
  24. <h3 class="left_item_title">В новостях...</h3>
  25. <center>
  26. <div class="news_item">
  27. <h2 class="news_item_title">
  28. <a href="memory-logic.html">Игровая логика «Памяти»</a>
  29. </h2>
  30. <p class="news_item_date">
  31. 2024-05-03 00:00
  32. </p>
  33. <div class="news_item_contents">
  34. <h1 id="">Игровая логика «Памяти»</h1>
  35. <p>В апреле реализовал игровую логику игры «Память» на Python в виде модели ограниченного языка и успешно перевёл её инструментом в C++.</p>
  36. <p>Модель ограниченного языка предполагает следующую архитектуру из двух частей:</p>
  37. <ol>
  38. <li>контекст состояния</li>
  39. <li>чистые функции без побочных эффектов, работающие лишь с контекстом</li>
  40. </ol>
  41. <p>Контекст состояния игровой логики на Python получился следующим (<a href="https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory_Context.h">C++</a>):</p>
  42. <pre><code class="python language-python">class memory_Context:
  43. def __init__(self):
  44. self.hiddenItems = []
  45. self.mismatchedItems = []
  46. self.playfieldItems = {}
  47. self.playfieldSize = 0
  48. self.recentField = "none"
  49. self.selectedId = -1
  50. self.selectedItems = []
  51. self.victory = False
  52. </code></pre>
  53. <p>Т.к. инструмент на текущий момент работает лишь с функциями, то контекст для Python и С++ пока пишем руками.</p>
  54. <p>Функции получились примерно такими (<a href="https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory.cpp#L29">C++</a>):</p>
  55. <pre><code class="python language-python"># Select item
  56. @llm_by_value
  57. def memory_selectItem(
  58. c: memory_Context
  59. ) -&gt; memory_Context:
  60. if (
  61. len(c.selectedItems) == 2
  62. ):
  63. c.selectedItems.clear()
  64. #}
  65. c.selectedItems.append(c.selectedId)
  66. c.recentField = "selectedItems"
  67. return c
  68. #}
  69. </code></pre>
  70. <p>Особенности функций для модели ограниченного языка:</p>
  71. <ul>
  72. <li>декоратор <code>@llm_by_value</code> в Python нужен для передачи аргументов по значению, а не по ссылке (по умолчанию - по ссылке)</li>
  73. <li>передача по значению обязательна для ограничения сферы действия функции ровно одним исходящим полем контекста, т.е. это реализация Принципа Единственной Ответственности (Single Responsibility Principle)</li>
  74. <li>контекст содержит поле <code>recentField</code>, представляющее собой хранимое «событие»; это поле позволяет функциям среагировать лишь в момент изменения значения интересующего поля</li>
  75. <li>функция обязана в поле <code>recentField</code> указать изменённое поле контекста либо <code>none</code> в случае отсутствия изменений</li>
  76. <li>функция принимает на вход контекст и выдаёт (изменённый) контекст на выход</li>
  77. </ul>
  78. <p>Полный список фукций игровой логики «Памяти»:</p>
  79. <table>
  80. <thead>
  81. <tr>
  82. <th>№</th>
  83. <th>Функция</th>
  84. <th>Инициатор вызова</th>
  85. <th>Описание</th>
  86. </tr>
  87. </thead>
  88. <tbody>
  89. <tr>
  90. <td>1</td>
  91. <td><code>memory_generateConstPlayfield</code></td>
  92. <td>Пользователь</td>
  93. <td>Генерируем упрощённое игровое поле, в котором последовательно парами идут элементы одной группы</td>
  94. </tr>
  95. <tr>
  96. <td>2</td>
  97. <td><code>memory_selectItem</code></td>
  98. <td>Пользователь</td>
  99. <td>Выбор элемента игрового поля</td>
  100. </tr>
  101. <tr>
  102. <td>3</td>
  103. <td><code>memory_shouldDeselectMismatchedItems</code></td>
  104. <td>Система</td>
  105. <td>Реакция снятия выделения с пары выбранных фишек различающихся групп</td>
  106. </tr>
  107. <tr>
  108. <td>4</td>
  109. <td><code>memory_shouldDetectVictory</code></td>
  110. <td>Система</td>
  111. <td>Реакция определения победы после скрытия всех фишек</td>
  112. </tr>
  113. <tr>
  114. <td>5</td>
  115. <td><code>memory_shouldHideMatchingItems</code></td>
  116. <td>Система</td>
  117. <td>Реакция скрытия пары выбранных фишек одной группы</td>
  118. </tr>
  119. </tbody>
  120. </table>
  121. <p>Для удостоверения работоспособности и идентичности работы этих функций как в Python, так и в C++, на каждую функцию ввёл минимум по одной функции проверки:</p>
  122. <ul>
  123. <li><code>memory_test_generateConstPlayfield</code></li>
  124. <li><code>memory_test_selectItem_1x</code></li>
  125. <li><code>memory_test_selectItem_2x</code></li>
  126. <li><code>memory_test_selectItem_3x</code></li>
  127. <li><code>memory_test_shouldDeselectMismatchedItems</code></li>
  128. <li><code>memory_test_shouldDeselectMismatchedItems_itemTwice</code></li>
  129. <li><code>memory_test_shouldDetectVictory</code></li>
  130. <li><code>memory_test_shouldHideMatchingItems</code></li>
  131. </ul>
  132. <h1 id="-1">Планы на май</h1>
  133. <p>Сделаю возможность сыграть одну партию игры «Память» в текстовом интерфейсе.</p>
  134. </div>
  135. </div>
  136. <div id="disqus_thread"></div>
  137. <script>
  138. var disqus_config = function () {
  139. this.page.url = "https://opengamestudio.org/ru/news/memory-logic.html";
  140. this.page.identifier = "memory-logic.html";
  141. };
  142. (function() { // DON'T EDIT BELOW THIS LINE
  143. var d = document, s = d.createElement('script');
  144. s.src = 'https://opengamestudio.disqus.com/embed.js';
  145. s.setAttribute('data-timestamp', +new Date());
  146. (d.head || d.body).appendChild(s);
  147. })();
  148. </script>
  149. <noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript>
  150. <div id="footer">
  151. Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
  152. из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
  153. </div>
  154. </center>
  155. </body>
  156. </html>