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.  
  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. std::shuffle(Cards.begin(), Cards.end(), mr);
  39. std::shuffle(Cards.begin(), Cards.end(), mr);
  40. std::shuffle(Cards.begin(), Cards.end(), mr);
  41. return true;
  42. }
  43. bool ShufflePlayer() {
  44. std::shuffle(Players.begin(), Players.end(), mr);
  45. return true;
  46. }
  47. bool Clear() {
  48. Cards.clear();
  49. Players.clear();
  50. return true;
  51. }
  52. bool IsEnd() {
  53. for (auto& o : Cards) {
  54. if (std::get<0>(o) == false)return false;
  55. }
  56.  
  57. return true;
  58. }
  59. bool IsCorrect(Card& A, Card& B) {
  60. if (&A == &B) return false;
  61. if (std::get<0>(A)) return false;
  62. if (std::get<0>(B)) return false;
  63.  
  64. if (std::get<2>(A) == std::get<2>(B)) {
  65. std::get<0>(A) = true;
  66. std::get<0>(B) = true;
  67. }
  68. else {
  69. return false;
  70. }
  71. return true;
  72. }
  73.  
  74. bool Game() {
  75.  
  76. for (std::size_t i = 0; i < Players.size();i++) {
  77. std::size_t XX = i;
  78. std::cout << std::get<0>(Players[i])->Name() << " Turn!" << std::endl;
  79. std::deque<Card> T;
  80. for (auto& oo : Cards) {
  81. if (std::get<1>(oo) != false) {
  82. T.push_back(oo);
  83. }
  84. else {
  85. T.push_back({ false,false,-1 });
  86. }
  87. }
  88.  
  89. SA:
  90.  
  91. std::size_t A = std::get<0>(Players[i])->ThinkFirst(T);
  92. std::cout << std::get<0>(Players[i])->Name() << " First Choice "<< A << std::endl;
  93.  
  94. if (std::get<0>(Cards[A])) {
  95. std::cout<< A << " is alrady open."<<std::endl;
  96. goto SA;
  97. }
  98. std::get<1>(Cards[A]) = true;
  99. T.clear();
  100. for (auto& oo : Cards) {
  101. if (std::get<1>(oo) != false) {
  102. T.push_back(oo);
  103. }
  104. else {
  105. T.push_back({ false,false,-1 });
  106. }
  107. }
  108.  
  109. SB:
  110.  
  111. std::size_t B = std::get<0>(Players[i])->ThinkSecond(T);
  112. std::cout << std::get<0>(Players[i])->Name() << " Second Choice "<< B << std::endl;
  113.  
  114. if (std::get<0>(Cards[B])) {
  115. std::cout << B << " is alrady open."<<std::endl;
  116. goto SB;
  117. }
  118.  
  119. std::get<1>(Cards[B]) = true;
  120. for(std::size_t j=0;j<Players.size();j++){
  121. //for (auto& E : Players) {
  122. if (!(Players[j] == Players[i])) {
  123. std::get<0>(Players[j])->EnemyOpen(A, std::get<2>(Cards[A]), B, std::get<2>(Cards[B]));
  124. }
  125. }
  126.  
  127. if (IsCorrect(Cards[A], Cards[B])) {
  128. std::get<1>(Players[i])++;
  129. std::cout << std::get<0>(Players[i])->Name() << " Find Pair!" << std::endl;
  130. i = XX - 1;
  131. bool f = true;
  132. if (IsEnd()) break;
  133. }else{
  134. std::cout << "MISS!!" << std::endl;
  135. }
  136.  
  137.  
  138. }
  139.  
  140.  
  141. return true;
  142. }
  143.  
  144. bool ChooseWiner() {
  145. Data W = Players[0];
  146. if (IsEnd()) {
  147. for (auto& o : Players) {
  148. if (std::get<1>(W) < std::get<1>(o)) {
  149. W = o;
  150. }
  151. }
  152. std::cout << "Winner is " << std::get<0>(W)->Name() << std::endl;
  153. }
  154. return true;
  155. }
  156.  
  157. bool Show() {
  158. char Ch[] = "0123456789abcdefghijklnmopqrstuvwxyz";
  159.  
  160. for (auto& o : Cards) {
  161. std::cout <<'['<<(std::get<0>(o) ? Ch[std::get<2>(o)] : '*')<<']';
  162. }
  163. std::cout << std::endl;
  164. return true;
  165. }
  166.  
  167. class INervousBreakdownPlayer {
  168. public:
  169. virtual std::string Name() { return "774"; }
  170. virtual bool Initialize() { return true; }
  171. virtual std::size_t ThinkFirst(const std::deque<Card>&) { return true; }
  172. virtual std::size_t ThinkSecond(const std::deque<Card>&) { return true; }
  173. 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; }
  174. };
  175. protected:
  176. std::deque<Data> Players;
  177. std::deque<Card> Cards;
  178. std::random_device rd;
  179. std::minstd_rand mr;
  180. };
  181.  
  182. class RandomPlayer :public NervousBreakdownSystem::INervousBreakdownPlayer {
  183. public:
  184. RandomPlayer():mt(rd()){}
  185. RandomPlayer(const std::string In):N(In),mt(rd()){}
  186.  
  187. virtual std::string Name() {
  188. return "RandomPlayer!"+N;
  189. }
  190. virtual std::size_t ThinkFirst(const NervousBreakdownSystem::CardSet& In) {
  191. std::uniform_int_distribution<> UI(0, In.size() - 1);
  192.  
  193. return UI(mt);
  194. }
  195. virtual std::size_t ThinkSecond(const NervousBreakdownSystem::CardSet& In) {
  196. std::uniform_int_distribution<> UI(0, In.size() - 1);
  197.  
  198. return UI(mt);
  199. }
  200. protected:
  201. std::random_device rd;
  202. std::mt19937 mt;
  203. std::string N;
  204. };
  205. #include <memory>
  206. //#include "SinkeiSuizyakuSystem.h"
  207.  
  208. int main() {
  209. NervousBreakdownSystem NBS;
  210. NervousBreakdownSystem::SharedPlayer A = std::make_shared<RandomPlayer>("1");
  211. NervousBreakdownSystem::SharedPlayer B = std::make_shared<RandomPlayer>("2");
  212.  
  213. std::size_t C = 9;
  214. //std::size_t C = 4;
  215. NBS.Initialize(C);
  216.  
  217. NBS.PushPlayer(A);
  218. NBS.PushPlayer(B);
  219. while (!NBS.IsEnd()) {
  220. NBS.Game();
  221. NBS.Show();
  222. }
  223. NBS.ChooseWiner();
  224.  
  225. return 0;
  226. }
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:38:3: error: ‘shuffle’ is not a member of ‘std’
   std::shuffle(Cards.begin(), Cards.end(), mr);
   ^~~
prog.cpp:39:3: error: ‘shuffle’ is not a member of ‘std’
   std::shuffle(Cards.begin(), Cards.end(), mr);
   ^~~
prog.cpp:40: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:44:3: error: ‘shuffle’ is not a member of ‘std’
   std::shuffle(Players.begin(), Players.end(), mr);
   ^~~
stdout
Standard output is empty