samedi 16 septembre 2017

Trying to pair 2 items from a vector but use them only once

I'm not sure how descriptive my title is but hopefully some clicked and will better understand what I mean here.

I am making a simple game and the function that I want to create should take an item from an array (name) and one from the other (role) and pair them together to form "name-role" which will be added in the other vector.

My first version had me trying to use rand() with all numbers under 13 but I found myself having to wait around 30 minutes after the first 6 items because, obviously, it would take some time until it would get another index that wasn't already used. I tried to use some vectors with items, extract random number from them and then delete that number so it will be much faster but it's stuck in a loop and I'm not really sure why. I worked on this for a long time and started getting very confused and tired from my own code, so if someone could help me that'd be great.

My current un-working code:

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.: The couts are from me trying to debug the game (despite being able to do it from my IDE, I just preffer doing this for some odd reason, so, ignore them.




Aucun commentaire:

Enregistrer un commentaire