Research portable Memory game | Исследовать портируемую игру Память
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
2.8KB

  1. #include <map>
  2. #include <string>
  3. #include <vector>
  4. #include "llm.h"
  5. #include "memory_Context.h"
  6. #include "main.h"
  7. // Detect mismatched items
  8. //
  9. // Conditions:
  10. // 0. Two items has just been selected
  11. // 1. The same item has been selected twice
  12. // 2. Selected items are of different groups
  13. memory_Context memory_detectMismatchedItems(
  14. memory_Context c
  15. ) {
  16. if (!(
  17. c.recentField == "selectedItems" &&
  18. c.selectedItems.size() == 2
  19. )) {
  20. c.recentField = "none";
  21. return c;
  22. }
  23. if (
  24. c.selectedItems[0] == c.selectedItems[1]
  25. ) {
  26. c.mismatchedItems.clear();
  27. c.mismatchedItems.push_back(c.selectedItems[0]);
  28. c.recentField = "mismatchedItems";
  29. return c;
  30. }
  31. if (
  32. c.playfieldItems[c.selectedItems[0]] != c.playfieldItems[c.selectedItems[1]]
  33. ) {
  34. c.mismatchedItems.clear();
  35. c.mismatchedItems.push_back(c.selectedItems[0]);
  36. c.mismatchedItems.push_back(c.selectedItems[1]);
  37. c.recentField = "mismatchedItems";
  38. return c;
  39. }
  40. c.recentField = "none";
  41. return c;
  42. }
  43. // Detect victory
  44. //
  45. // Conditions:
  46. // 1. Matching items have just been hidden and all items are hidden now
  47. memory_Context memory_detectVictory(
  48. memory_Context c
  49. ) {
  50. if (
  51. c.recentField == "hiddenItems" &&
  52. c.hiddenItems.size() == c.playfieldItems.size()
  53. ) {
  54. c.victory = true;
  55. c.recentField = "victory";
  56. return c;
  57. }
  58. c.recentField = "none";
  59. return c;
  60. }
  61. // Generate constant playfield
  62. //
  63. // Conditions:
  64. // 1. Size has just been specified
  65. //
  66. // Both ids and group ids start with 0
  67. memory_Context memory_generateConstPlayfield(
  68. memory_Context c
  69. ) {
  70. if (!(
  71. c.recentField == "playfieldSize"
  72. )) {
  73. c.recentField = "none";
  74. return c;
  75. }
  76. std::map<int, int> idGroups = { };
  77. auto id = 0;
  78. for (auto gid = 0; gid < c.playfieldSize; ++gid) {
  79. idGroups[id] = gid;
  80. id += 1;
  81. idGroups[id] = gid;
  82. id += 1;
  83. }
  84. c.playfieldItems = idGroups;
  85. c.recentField = "playfieldItems";
  86. return c;
  87. }
  88. // Hide matching selected items
  89. //
  90. // Conditions:
  91. // 1. Two items are selected and they are of the same group
  92. memory_Context memory_hideMatchingItems(
  93. memory_Context c
  94. ) {
  95. if (
  96. c.recentField == "selectedItems" &&
  97. c.selectedItems.size() == 2 &&
  98. c.playfieldItems[c.selectedItems[0]] == c.playfieldItems[c.selectedItems[1]]
  99. ) {
  100. c.hiddenItems.push_back(c.selectedItems[0]);
  101. c.hiddenItems.push_back(c.selectedItems[1]);
  102. c.recentField = "hiddenItems";
  103. return c;
  104. }
  105. c.recentField = "none";
  106. return c;
  107. }
  108. // Select item
  109. //
  110. // Conditions:
  111. // 1. Id has just been specified for selection
  112. memory_Context memory_selectItem(
  113. memory_Context c
  114. ) {
  115. if (!(
  116. c.recentField == "selectedId"
  117. )) {
  118. c.recentField = "none";
  119. return c;
  120. }
  121. if (
  122. c.selectedItems.size() == 2
  123. ) {
  124. c.selectedItems.clear();
  125. }
  126. c.selectedItems.push_back(c.selectedId);
  127. c.recentField = "selectedItems";
  128. return c;
  129. }