C ++: как генерировать более одного набора случайных значений - PullRequest
0 голосов
/ 19 февраля 2019

Я написал код для генерации плеера, но застрял на том, как генерировать 2-й.В конечном итоге мне нужно будет поработать с целой кучей из них. / N Должно быть что-то чрезвычайно элементарное, чего мне не хватает ...

Определение класса

class Player
{
public:
    Player(personal_information pi, player_skill pskill, player_trait ptrait);
    void generatePlayer();

private:
    personal_information pinfo;
    player_skill pskill;
    player_trait ptrait;
};

Реализация класса

Player::Player(personal_information pi, player_skill psk, player_trait pt)
{
    this->pinfo = pi;
    this->pskill = psk;
    this->ptrait = pt;
}

Создание удовольствия игрока

void Player::generatePlayer()
{
    printf(" %s %s (%dyo, %dcm, %dkg)\n", this->pinfo.first_name, this->pinfo.last_name, this->pinfo.years, this->pinfo.height, this->pinfo.weight);
    printf("   Can play as (%s)\n", this->pskill.position);
    printf(" Player Skills:\n");
    printf("   Fitness (%d)\n", this->pskill.fitness);
    printf("   Strenght (%d)\n", this->pskill.strenght);
    printf("   Goalkeeping (%d)\n", this->pskill.goalkeeping);
    printf("   Passing (%d)\n", this->pskill.passing);
    printf("   Shooting (%d)\n", this->pskill.shooting);
    printf(" Traits:");
//  printf("\n");
//  printf(" Player is");
if (true == this->ptrait.tall) { printf(" Tall"); };
if (true == this->ptrait.raz) {printf(" Short");};
if (true == this->ptrait.fat) {printf(" Fat");};
if (true == this->ptrait.skinny) {printf(" Skinny");};
    printf(".\n");
    printf("\n");
}

Main

int main()
{
    initSystem();

    // Random player generator data
    personal_information pi = { 0 };
        pi.first_name = nameEng[rand() % ARR_SIZE(nameEng)];
        pi.last_name = nameEngSurname[rand() % ARR_SIZE(nameEngSurname)];
        pi.years = Min_Age_Player + random(Min_Age_Player - Max_Age_Player);
        pi.height = MIN_HEIGHT + random(MAX_HEIGHT - MIN_HEIGHT);
//      pi.height = 140;
        pi.weight = MIN_WEIGHT + random(MAX_WEIGHT - MIN_WEIGHT);
//      pi.weight = 120;
    player_skill psk = { 0 };
        psk.position = positionsList[rand() % ARR_SIZE(positionsList)];
        psk.fitness = random(10);
        psk.strenght = random(10);
        psk.goalkeeping = random(5);
        psk.passing = random(10);
        psk.shooting = random(10);
    player_trait pt = { 0 };
            //  tall/short
        if (pi.height > 186) {pt.tall = true;
            psk.goalkeeping = psk.goalkeeping + 2;
        };
        if (pi.height < 165) { pt.raz = true;
            psk.goalkeeping = psk.goalkeeping - 2;
        };
            //  fat/skinny
        if (pi.weight > 100) { pt.fat = true;
            psk.fitness = psk.fitness - 2;
            psk.strenght = psk.strenght + 2;
        };
        if (pi.weight < 85) { pt.skinny = true;
            psk.strenght = psk.strenght - 2;
        };
    Player P1genStats(pi, psk, pt);
    P1genStats.generatePlayer();

    Player P2genStats(pi, psk, pt);
    P2genStats.generatePlayer();

    return 0;
}

Я был достаточно наивен, чтобы думать, что это даст мне 2 отдельных набора значений, но когда я его запусту,это дает мне один и тот же набор значений дважды.

По сути, дает мне один и тот же игрок дважды.

В идеале я бы не хотел, чтобы это было даже в основном, что было бы самым элегантным способомнаписать одну функцию для генерации игрока с такой статистикой?

1 Ответ

0 голосов
/ 19 февраля 2019

Вам нужно запустить свой случайный генерирующий код дважды, если вам нужны два разных игрока.

Если вы подумаете об этом, ваша функция generatePlayer не сделает ничего подобного.Он печатает только статистику игроков.Лучшее имя для функции было бы printPlayer.

Реальный генерирующий код - это весь код, который вы имеете в main, который генерирует случайную информацию.Так что, возможно, ваш код будет лучше структурирован, как это (для краткости я сокращен).В этом коде конструктор Player вызывает случайный код, поэтому у всех игроков будет случайная статистика.

class Player
{
public:
    Player(); // generate player with random stats
    void printPlayer();

private:
    personal_information pinfo;
    player_skill pskill;
    player_trait ptrait;
};

Player::Player()
{
    pinfo.first_name = nameEng[rand() % ARR_SIZE(nameEng)];
    pinfo.last_name = nameEngSurname[rand() % ARR_SIZE(nameEngSurname)];
    ...
    pskill.position = positionsList[rand() % ARR_SIZE(positionsList)];
    pskill.fitness = random(10);
    ...
}

int main()
{
    Player P1genStats;
    P1genStats.printPlayer();

    Player P2genStats;
    P2genStats.printPlayer();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...