尝试从矢量中配对2个项目,但只使用它们一次

时间:2017-09-16 20:33:11

标签: c++ arrays vector random

我不确定我的标题是多么具有描述性,但有希望点击一下,并且会更好地理解我的意思。

我正在制作一个简单的游戏,我想要创建的函数应该从数组(名称)中获取一个项目,从另一个中获取一个项目(角色)并将它们组合在一起以形成“name-role”,这将被添加在另一个向量中。

我的第一个版本让我尝试使用rand(),所有数字都在13以下,但我发现自己必须在前6个项目后等待大约30分钟,因为很明显,它需要一些时间才会得到另一个索引尚未使用过。我尝试使用一些带有项目的向量,从中提取随机数,然后删除该数字,这样它会更快但是它陷入循环中,我不确定为什么。我在这方面工作了很长时间,开始对我自己的代码感到非常困惑和厌倦,所以如果有人能帮助我,那就太好了。

我当前未使用的代码:

std::vector<std::string> gGetResidents()
{
    std::string gPlayers[12]{ "Deodat Lawson", "James Bayley", "Edward Bishop", "Rebecca Nurse", "Sarah Good",
    "Bridget Bishop", "Sarah Wildes", "Elizabeth Howe", "John Proctor", "Martha Carrier", "George Burroughs",
    "Giles Corey" };

    std::string gRoles[12]{ "Jailor", "Sheriff", "Investigator", "Vigilante", "Doctor", "Bodyguard", "Lookout",
    "Escort", "Godfather", "Mafioso", "Consort", "Framer" };

    std::vector<size_t> gUsed;

    std::vector<std::string> gMetaResidents;

    for (size_t gInd{ 0 }; gInd < 12; ++gInd)
    {
    gLabel:

        std::vector<size_t> gNumbersPlayer{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

        std::vector<size_t> gNumbersRole{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

        srand(time(nullptr));
        size_t gRandomPositionPlayer = rand() % gNumbersPlayer.size();
        size_t gRandomPositionRole = rand() % gNumbersRole.size();

        std::cout << "siz : " << gNumbersPlayer.size() << "\n\n";

        std::cout << "rand pos pl : " << gRandomPositionPlayer << " rand pos rol : " << gRandomPositionRole << "\n\n";

        size_t gRandomPlayer{ 0 };
        size_t gRandomRole{ 0 };

        if(gRandomPositionPlayer < gNumbersPlayer.size() && std::find(gNumbersPlayer.begin(), gNumbersPlayer.end(), gRandomPositionPlayer) != gNumbersPlayer.end())
        {
            gRandomPlayer = gNumbersPlayer[gRandomPositionPlayer -1];
            gNumbersPlayer.erase(gNumbersPlayer.begin() + gRandomPositionPlayer);
        }

        std::cout << "rand pl : " << gRandomPlayer;

        if (gRandomPositionRole < gNumbersRole.size() && std::find(gNumbersRole.begin(), gNumbersRole.end(), gRandomPositionRole) != gNumbersRole.end())
        {
            gRandomRole = gNumbersRole[gRandomPositionRole - 1];
            gNumbersRole.erase(gNumbersRole.begin() + gRandomPositionRole);
        }

        std::cout << " rand rol : " << gRandomRole << "\n\n";

        if (std::find(gUsed.begin(), gUsed.end(), gRandomPlayer) != gUsed.end())
            goto gLabel;

        if (std::find(gUsed.begin(), gUsed.end(), gRandomRole) != gUsed.end())
            goto gLabel;

        gUsed.push_back(gRandomPlayer);
        gUsed.push_back(gRandomRole);

        std::string gCombinedUn = gPlayers[gRandomPlayer].append(" is the ");
        std::string gCombined = gCombinedUn.append(gRoles[gRandomRole]);

        gMetaResidents.push_back(gCombined);

        gCombinedUn.clear();
        gCombined.clear();

        std::cout << gRandomPlayer << " - " << gRandomRole << "\n";
    }

    return gMetaResidents;
}

P.S。:cout来自我试图调试游戏(尽管能够从我的IDE中做到这一点,我只是因为某些奇怪的原因而不愿意这样做,所以,忽略它们。

0 个答案:

没有答案