fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <deque>
  4. #include <cstdint>
  5. #include <tuple>
  6. #include <random>
  7. #include <string>
  8. #include <functional>
  9. // under dev.
  10. class NervousBreakdownSystem {
  11. typedef std::tuple<bool, bool, std::uintmax_t> Card;//open,onceopen,number.
  12. public:
  13. class INervousBreakdownPlayer;
  14. typedef std::deque<Card> CardSet;
  15. typedef std::shared_ptr<INervousBreakdownPlayer> SharedPlayer;
  16. protected:
  17.  
  18. typedef std::tuple<SharedPlayer, std::intmax_t> Data;
  19.  
  20. public:
  21. bool PushPlayer(SharedPlayer Sp) {
  22. Players.push_back({ Sp ,0 });
  23. return true;
  24. }
  25.  
  26. bool Initialize(const std::size_t& CardCount) {
  27. Clear();
  28. CreateCardSet(CardCount);
  29. return true;
  30.  
  31. }
  32. bool CreateCardSet(const std::size_t& CardCount) {
  33.  
  34. for (std::size_t i = 1; i < CardCount; i++) {
  35. Cards.push_back({ false,false,i });
  36. Cards.push_back({ false,false,i });
  37. }
  38.  
  39. std::shuffle(Cards.begin(), Cards.end(), mr);
  40. return true;
  41. }
  42. bool ShufflePlayer() {
  43. std::shuffle(Players.begin(), Players.end(), mr);
  44. return true;
  45. }
  46. bool Clear() {
  47. Cards.clear();
  48. Players.clear();
  49. return true;
  50. }
  51. bool IsEnd() {
  52. for (auto& o : Cards) {
  53. if (std::get<0>(o) == false)return false;
  54. }
  55.  
  56. return true;
  57. }
  58. bool IsCorrect(Card& A, Card& B) {
  59. if (&A == &B) return false;
  60. if (std::get<0>(A)) return false;
  61. if (std::get<0>(B)) return false;
  62.  
  63. if (std::get<2>(A) == std::get<2>(B)) {
  64. std::get<0>(A) = true;
  65. std::get<0>(B) = true;
  66. }
  67. else {
  68. return false;
  69. }
  70. return true;
  71. }
  72.  
  73. bool Game() {
  74.  
  75. for (std::size_t i = 0; i < Players.size();i++) {
  76. std::cout << std::get<0>(Players[i])->Name() << " Turn!" << std::endl;
  77. std::deque<Card> T;
  78. for (auto& oo : Cards) {
  79. if (std::get<1>(oo) != false) {
  80. T.push_back(oo);
  81. }
  82. else {
  83. T.push_back({ false,false,-1 });
  84. }
  85. }
  86.  
  87. std::size_t A = std::get<0>(Players[i])->thinkFirst(T);
  88. std::get<1>(Cards[A]) = true;
  89.  
  90. std::cout << std::get<0>(Players[i])->Name() << " Choice "<< A << std::endl;
  91.  
  92. T.clear();
  93. for (auto& oo : Cards) {
  94. if (std::get<1>(oo) != false) {
  95. T.push_back(oo);
  96. }
  97. else {
  98. T.push_back({ false,false,-1 });
  99. }
  100. }
  101. std::size_t B = std::get<0>(Players[i])->thinkSecond(T);
  102. std::get<1>(Cards[B]) = true;
  103.  
  104. std::cout << std::get<0>(Players[i])->Name() << " Choice "<< B << std::endl;
  105.  
  106. if (IsCorrect(Cards[A], Cards[B])) {
  107. std::get<1>(Players[i])++;
  108. i--;
  109. }
  110. for (auto& E : Players) {
  111. if (E != Players[i]) {
  112. std::get<0>(E)->EnemyOpen(A, std::get<2>(Cards[A]), B, std::get<2>(Cards[B]));
  113. }
  114. }
  115.  
  116. }
  117. return true;
  118. }
  119.  
  120. bool ChooseWiner() {
  121. Data W = Players[0];
  122. if (IsEnd()) {
  123. for (auto& o : Players) {
  124. if (std::get<1>(W) < std::get<1>(o)) {
  125. W = o;
  126. }
  127. }
  128. std::cout << "Winner is " << std::get<0>(W)->Name() << std::endl;
  129. }
  130. return true;
  131. }
  132.  
  133. bool Show() {
  134. char Ch[] = "123456789abcdefghijklnmopqrstuvwxyz";
  135.  
  136. for (auto& o : Cards) {
  137. std::cout <<'['<<(std::get<0>(o) ? Ch[std::get<2>(o)] : '*')<<']';
  138. }
  139. std::cout << std::endl;
  140. return true;
  141. }
  142.  
  143. class INervousBreakdownPlayer {
  144. public:
  145. virtual std::string Name() { return "774"; }
  146. virtual bool Initialize() { return true; }
  147. virtual std::size_t thinkFirst(const std::deque<Card>&) { return true; }
  148. virtual std::size_t thinkSecond(const std::deque<Card>&) { return true; }
  149. virtual bool EnemyOpen(const std::size_t& IndexA, const std::intmax_t& NumberA,const std::size_t& IndexB, const std::intmax_t& NumberB) { return true; }
  150. };
  151. protected:
  152. std::deque<Data> Players;
  153. std::deque<Card> Cards;
  154. std::random_device rd;
  155. std::minstd_rand mr;
  156. };
  157.  
  158. class RandomPlayer :public NervousBreakdownSystem::INervousBreakdownPlayer {
  159. public:
  160. RandomPlayer():mt(rd()){}
  161.  
  162. virtual std::string Name() {
  163. return "RandomPlayer!";
  164. }
  165. virtual std::size_t ThinkFirst(const NervousBreakdownSystem::CardSet& In) {
  166. std::uniform_int_distribution<> UI(0, In.size() - 1);
  167.  
  168. return UI(mt);
  169. }
  170. virtual std::size_t ThinkSecond(const NervousBreakdownSystem::CardSet& In) {
  171. std::uniform_int_distribution<> UI(0, In.size() - 1);
  172.  
  173. return UI(mt);
  174. }
  175. protected:
  176. std::random_device rd;
  177. std::mt19937 mt;
  178. };
  179.  
  180. #include <iostream>
  181. #include <memory>
  182. //#include "SinkeiSuizyakuSystem.h"
  183.  
  184. int main() {
  185. NervousBreakdownSystem NBS;
  186. NervousBreakdownSystem::SharedPlayer A = std::make_shared<RandomPlayer>();
  187. NervousBreakdownSystem::SharedPlayer B = std::make_shared<RandomPlayer>();
  188.  
  189. //std::size_t C = 9;
  190. std::size_t C = 4;
  191. NBS.Initialize(C);
  192.  
  193. NBS.PushPlayer(A);
  194. NBS.PushPlayer(B);
  195. while (!NBS.IsEnd()) {
  196. NBS.Game();
  197. NBS.Show();
  198. }
  199. NBS.ChooseWiner();
  200.  
  201. return 0;
  202. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In member function ‘bool NervousBreakdownSystem::CreateCardSet(const size_t&)’:
prog.cpp:39:3: error: ‘shuffle’ is not a member of ‘std’
   std::shuffle(Cards.begin(), Cards.end(), mr);
   ^~~
prog.cpp: In member function ‘bool NervousBreakdownSystem::ShufflePlayer()’:
prog.cpp:43:3: error: ‘shuffle’ is not a member of ‘std’
   std::shuffle(Players.begin(), Players.end(), mr);
   ^~~
stdout
Standard output is empty