fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <string>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. // プレイヤーが装備できる武器
  10. enum Weapon {
  11. greatSword, // グレソ
  12. longSword, // ロングソード
  13. dagger, // ダガー
  14. spear, // スピア
  15. bow, // 弓
  16. crossBow, // クロスボウ
  17. staff, // ロッド
  18. wand // ワンド
  19. };
  20.  
  21. // 各プレイヤーが持つデータ
  22. struct Player {
  23. string name; // プレイヤーの名前
  24. Weapon mainWeapon; // メイン武器
  25. Weapon subWeapon; // サブ武器
  26. };
  27.  
  28. int main(void) {
  29. vector < Player > teamA {};
  30. vector < Player > teamB {};
  31.  
  32. std::random_device seed_gen;
  33. std::default_random_engine engine(seed_gen());
  34.  
  35.  
  36. // zantei
  37. vector < Player > member {
  38. {"Fulro", Weapon::wand, Weapon::bow},
  39. {"聖大", Weapon::spear, Weapon::longSword},
  40. {"nockout", Weapon::greatSword, Weapon::crossBow},
  41. {"shiba", Weapon::wand, Weapon::bow},
  42. {"だいご", Weapon::spear, Weapon::longSword},
  43. {"Luna", Weapon::spear, Weapon::dagger},
  44. {"くおん", Weapon::longSword, Weapon::dagger},
  45. {"パビロック", Weapon::staff, Weapon::dagger},
  46. {"hakuryu", Weapon::bow, Weapon::crossBow},
  47. };
  48. // zantei
  49.  
  50. // メイン武器とサブ武器が一緒な人は除外
  51. auto new_end =
  52. std::remove_if(member.begin(), member.end(),
  53. [](const Player& player) {
  54. return player.mainWeapon == player.subWeapon;
  55. });
  56. member.erase(new_end, member.end());
  57.  
  58. // 参加メンバーが6人に満たない場合は終了
  59. if(member.size() < 6) {
  60. std::cout << "参加メンバーが6人に満ちていません" << std::endl;
  61. return 0;
  62. }
  63.  
  64. // ワンドのプレイヤーを抽出
  65. vector < Player > wandPlayerList;
  66. for(Player player: member) {
  67. if ((player.mainWeapon == Weapon::wand) || (player.subWeapon == Weapon::wand)) {
  68. wandPlayerList.push_back(player);
  69. }
  70. }
  71.  
  72. // ワンドが2人以上いる場合、必ず各チームに1人ずつ振り分ける
  73. if(wandPlayerList.size() >= 2) {
  74. // teamAに割り当てるワンドをランダムに選ぶ
  75. uniform_int_distribution < int > dist(0, wandPlayerList.size()-1);
  76. const int firstPlayerNum {
  77. dist(engine)
  78. };
  79. teamA.push_back(wandPlayerList[firstPlayerNum]);
  80. wandPlayerList.erase(wandPlayerList.begin() + firstPlayerNum);
  81.  
  82. // teamBに割り当てるワンド使いをランダムに選ぶ
  83. uniform_int_distribution < int > dist2(0, wandPlayerList.size()-1);
  84. const int secondPlayerNum {
  85. dist2(engine)
  86. };
  87. teamB.push_back(wandPlayerList[secondPlayerNum]);
  88. wandPlayerList.erase(wandPlayerList.begin() + secondPlayerNum);
  89. }
  90.  
  91. // メンバーをランダムに選び、武器の重複ルールに基づいてteamAに追加
  92. while(true) {
  93. uniform_int_distribution < int > memberDist(0, member.size()-1);
  94. const int num = memberDist(engine);
  95.  
  96. // memberリストが空になったら、チーム作成が不可能と判断して終了
  97. if(member.empty()) {
  98. std::cout << "闘技場ルールに合致するチームが作れませんでした。" << std::endl;
  99. return 0;
  100. }
  101.  
  102. // 選ばれたメンバーがワンド使いであればスキップ
  103. if((member[num].mainWeapon == Weapon::wand) || (member[num].subWeapon == Weapon::wand)) {
  104. member.erase(member.begin()+num);
  105. continue;
  106. }
  107.  
  108. int mainWeaponCount = 0;
  109. int subWeaponCount = 0;
  110.  
  111. // 武器の重複チェック
  112. for(Player teamMember: teamA) {
  113. if((teamMember.mainWeapon == member[num].mainWeapon) || (teamMember.subWeapon == member[num].mainWeapon)) {
  114. mainWeaponCount++;
  115. }
  116. if((teamMember.mainWeapon == member[num].subWeapon) || (teamMember.subWeapon == member[num].subWeapon)) {
  117. subWeaponCount++;
  118. }
  119. }
  120.  
  121. // グレソは各チームに1人
  122. if((member[num].mainWeapon == Weapon::greatSword) || member[num].subWeapon == Weapon::greatSword) {
  123. if(mainWeaponCount >= 1) {
  124. // 既にteamAにグレソのメンバーがいる場合
  125. } else {
  126. // teamAにグレソのメンバーがまだいない場合
  127. teamA.push_back(member[num]);
  128. member.erase(member.begin()+num);
  129. }
  130. }
  131. else {
  132. if ((mainWeaponCount >= 2) && (subWeaponCount) >= 2) {
  133. // 既にteamAに同じ武器を2人以上持っている場合
  134. }else {
  135. // teamAに同じ武器が2人未満の場合
  136. teamA.push_back(member[num]);
  137. member.erase(member.begin()+num);
  138. }
  139. }
  140.  
  141. // teamAのメンバーが3人になったらループを終了
  142. if(teamA.size() == 3) {
  143. break;
  144. }
  145. }
  146.  
  147. // teamB
  148. while(true) {
  149. uniform_int_distribution < int > memberDist(0, member.size()-1);
  150. const int num = memberDist(engine);
  151.  
  152. // memberリストが空になったら、チーム作成が不可能と判断して終了
  153. if(member.empty()) {
  154. std::cout << "闘技場ルールに合致するチームが作れませんでした。" << std::endl;
  155. return 0;
  156. }
  157.  
  158. // 選ばれたメンバーがワンド使いであればスキップし、memberリストから削除
  159. if((member[num].mainWeapon == Weapon::wand) || (member[num].subWeapon == Weapon::wand)) {
  160. member.erase(member.begin()+num);
  161. continue;
  162. }
  163.  
  164. int mainWeaponCount = 0;
  165. int subWeaponCount = 0;
  166.  
  167. // 武器の重複チェック
  168. for(Player teamMember: teamB) {
  169. if((teamMember.mainWeapon == member[num].mainWeapon) || (teamMember.subWeapon == member[num].mainWeapon)) {
  170. mainWeaponCount++;
  171. }
  172. if((teamMember.mainWeapon == member[num].subWeapon) || (teamMember.subWeapon == member[num].subWeapon)) {
  173. subWeaponCount++;
  174. }
  175. }
  176.  
  177. if((member[num].mainWeapon == Weapon::greatSword) || member[num].subWeapon == Weapon::greatSword) {
  178. if(mainWeaponCount >= 1) {
  179. // 既にteamBにグレソのメンバーがいる場合
  180. } else {
  181. // teamBにグレソのメンバーがまだいない場合
  182. teamB.push_back(member[num]);
  183. member.erase(member.begin()+num);
  184. }
  185. }
  186. else {
  187. if ((mainWeaponCount >= 2) && (subWeaponCount) >= 2) {
  188. // 既にteamBに同じ武器を2人以上持っている場合
  189. }else {
  190. // teamBに同じ武器が2人未満の場合
  191. teamB.push_back(member[num]);
  192. member.erase(member.begin()+num);
  193. }
  194. }
  195.  
  196. // teamBのメンバーが3人になったらループを終了
  197. if(teamB.size() == 3) {
  198. break;
  199. }
  200. }
  201.  
  202. // --- 最終結果の表示 ---
  203. std::cout << "=teamA============" << std::endl;
  204. for(Player player: teamA) {
  205. std::cout << player.name << std::endl;
  206. }
  207.  
  208. std::cout << "=teamB============" << std::endl;
  209. for(Player player: teamB) {
  210. std::cout << player.name << std::endl;
  211. }
  212.  
  213. return 0;
  214. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
=teamA============
shiba
Luna
パビロック
=teamB============
Fulro
聖大
hakuryu