#include <iostream>
#include <vector>
#include <random>
#include <string>
#include <algorithm>
using namespace std;
// プレイヤーが装備できる武器
enum Weapon {
greatSword, // グレソ
longSword, // ロングソード
dagger, // ダガー
spear, // スピア
bow, // 弓
crossBow, // クロスボウ
staff, // ロッド
wand // ワンド
};
// 各プレイヤーが持つデータ
struct Player {
string name; // プレイヤーの名前
Weapon mainWeapon; // メイン武器
Weapon subWeapon; // サブ武器
};
int main(void) {
vector < Player > teamA {};
vector < Player > teamB {};
std::random_device seed_gen;
std::default_random_engine engine(seed_gen());
// zantei
vector < Player > member {
{"Fulro", Weapon::wand, Weapon::bow},
{"聖大", Weapon::spear, Weapon::longSword},
{"nockout", Weapon::greatSword, Weapon::crossBow},
{"shiba", Weapon::wand, Weapon::bow},
{"だいご", Weapon::spear, Weapon::longSword},
{"Luna", Weapon::spear, Weapon::dagger},
{"くおん", Weapon::longSword, Weapon::dagger},
{"パビロック", Weapon::staff, Weapon::dagger},
{"hakuryu", Weapon::bow, Weapon::crossBow},
};
// zantei
// メイン武器とサブ武器が一緒な人は除外
auto new_end =
std::remove_if(member.begin(), member.end(),
[](const Player& player) {
return player.mainWeapon == player.subWeapon;
});
member.erase(new_end, member.end());
// 参加メンバーが6人に満たない場合は終了
if(member.size() < 6) {
std::cout << "参加メンバーが6人に満ちていません" << std::endl;
return 0;
}
// ワンドのプレイヤーを抽出
vector < Player > wandPlayerList;
for(Player player: member) {
if ((player.mainWeapon == Weapon::wand) || (player.subWeapon == Weapon::wand)) {
wandPlayerList.push_back(player);
}
}
// ワンドが2人以上いる場合、必ず各チームに1人ずつ振り分ける
if(wandPlayerList.size() >= 2) {
// teamAに割り当てるワンドをランダムに選ぶ
uniform_int_distribution < int > dist(0, wandPlayerList.size()-1);
const int firstPlayerNum {
dist(engine)
};
teamA.push_back(wandPlayerList[firstPlayerNum]);
wandPlayerList.erase(wandPlayerList.begin() + firstPlayerNum);
// teamBに割り当てるワンド使いをランダムに選ぶ
uniform_int_distribution < int > dist2(0, wandPlayerList.size()-1);
const int secondPlayerNum {
dist2(engine)
};
teamB.push_back(wandPlayerList[secondPlayerNum]);
wandPlayerList.erase(wandPlayerList.begin() + secondPlayerNum);
}
// メンバーをランダムに選び、武器の重複ルールに基づいてteamAに追加
while(true) {
uniform_int_distribution < int > memberDist(0, member.size()-1);
const int num = memberDist(engine);
// memberリストが空になったら、チーム作成が不可能と判断して終了
if(member.empty()) {
std::cout << "闘技場ルールに合致するチームが作れませんでした。" << std::endl;
return 0;
}
// 選ばれたメンバーがワンド使いであればスキップ
if((member[num].mainWeapon == Weapon::wand) || (member[num].subWeapon == Weapon::wand)) {
member.erase(member.begin()+num);
continue;
}
int mainWeaponCount = 0;
int subWeaponCount = 0;
// 武器の重複チェック
for(Player teamMember: teamA) {
if((teamMember.mainWeapon == member[num].mainWeapon) || (teamMember.subWeapon == member[num].mainWeapon)) {
mainWeaponCount++;
}
if((teamMember.mainWeapon == member[num].subWeapon) || (teamMember.subWeapon == member[num].subWeapon)) {
subWeaponCount++;
}
}
// グレソは各チームに1人
if((member[num].mainWeapon == Weapon::greatSword) || member[num].subWeapon == Weapon::greatSword) {
if(mainWeaponCount >= 1) {
// 既にteamAにグレソのメンバーがいる場合
} else {
// teamAにグレソのメンバーがまだいない場合
teamA.push_back(member[num]);
member.erase(member.begin()+num);
}
}
else {
if ((mainWeaponCount >= 2) && (subWeaponCount) >= 2) {
// 既にteamAに同じ武器を2人以上持っている場合
}else {
// teamAに同じ武器が2人未満の場合
teamA.push_back(member[num]);
member.erase(member.begin()+num);
}
}
// teamAのメンバーが3人になったらループを終了
if(teamA.size() == 3) {
break;
}
}
// teamB
while(true) {
uniform_int_distribution < int > memberDist(0, member.size()-1);
const int num = memberDist(engine);
// memberリストが空になったら、チーム作成が不可能と判断して終了
if(member.empty()) {
std::cout << "闘技場ルールに合致するチームが作れませんでした。" << std::endl;
return 0;
}
// 選ばれたメンバーがワンド使いであればスキップし、memberリストから削除
if((member[num].mainWeapon == Weapon::wand) || (member[num].subWeapon == Weapon::wand)) {
member.erase(member.begin()+num);
continue;
}
int mainWeaponCount = 0;
int subWeaponCount = 0;
// 武器の重複チェック
for(Player teamMember: teamB) {
if((teamMember.mainWeapon == member[num].mainWeapon) || (teamMember.subWeapon == member[num].mainWeapon)) {
mainWeaponCount++;
}
if((teamMember.mainWeapon == member[num].subWeapon) || (teamMember.subWeapon == member[num].subWeapon)) {
subWeaponCount++;
}
}
if((member[num].mainWeapon == Weapon::greatSword) || member[num].subWeapon == Weapon::greatSword) {
if(mainWeaponCount >= 1) {
// 既にteamBにグレソのメンバーがいる場合
} else {
// teamBにグレソのメンバーがまだいない場合
teamB.push_back(member[num]);
member.erase(member.begin()+num);
}
}
else {
if ((mainWeaponCount >= 2) && (subWeaponCount) >= 2) {
// 既にteamBに同じ武器を2人以上持っている場合
}else {
// teamBに同じ武器が2人未満の場合
teamB.push_back(member[num]);
member.erase(member.begin()+num);
}
}
// teamBのメンバーが3人になったらループを終了
if(teamB.size() == 3) {
break;
}
}
// --- 最終結果の表示 ---
std::cout << "=teamA============" << std::endl;
for(Player player: teamA) {
std::cout << player.name << std::endl;
}
std::cout << "=teamB============" << std::endl;
for(Player player: teamB) {
std::cout << player.name << std::endl;
}
return 0;
}