Research portable Memory game | Исследовать портируемую игру Память
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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