Игра в Крэпс пока цикл не соответствует условиям выхода - PullRequest
0 голосов
/ 29 октября 2019

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

Правила для каждогоигра:

Бросьте 2 кубика и суммируйте результат. 2, 3 или 12 = проигрыш (1 бросок), 7 или 11 = победа (1 бросок). Если ни один из них, суммированные кубики не бросаются снова, пока игрок не выбрасывает 7 (проигрыш) или снова не бросает свой первоначальный счет (победа).

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<vector>    // Allows use of vectors

double random();    // Returns random double between 0 and 1
int dice(double x); // Converts a double between 0 and 1 into an int between 1 and 6
int two_dice(int die_one, int die_two); // Sums 2 ints together, in this case dice rolls


int main()
{
    // Sets the seed for rand using the current time, i.e. rand() 
    // will now always generate from a different starting point 
    std::srand(std::time(nullptr));

    // Vectors to store the results of win/lose
    std::vector<int> won;
    std::vector<int> lose;

    for (int i = 0; i < 10; i++)
    {
        int num_throws = 1;

        // Roll two dice
        double x = random(), y = random();
        int die_one = dice(x);
        int die_two = dice(y);
        int roll = two_dice(die_one, die_two);

        std::cout << "\nRoll " << i + 1 << " = " << roll << "\n";

        if (roll < 4 || roll == 12)   // Instant loss
        {
            lose.push_back(num_throws);
        }
        else if (roll == 7 || roll == 11)     // Instant win
        {
            won.push_back(num_throws);
        }
        else     // Begin looping rolls until a 7 or original roll is rolled again
        {
            int point = roll;     // First roll 
            std::cout << "Point is " << point << "\n";

            do {
                num_throws++;     
                double x = random(), y = random();
                int die_one = dice(x);
                int die_two = dice(y);
                int roll = two_dice(die_one, die_two);     // Roll dice again
                std::cout << "Next roll = " << roll << "\n";
                std::cout << "Point is " << point << "\n";
            } while (roll != 7 || roll != point);

            if (roll == 7)
            {
                lose.push_back(num_throws);
                std::cout << "lose\n";
            }
            else if (roll == point)
            {
                won.push_back(num_throws);
                std::cout << "win\n";
            }
            else
            {
                std::cout << "\n\nERROR\n\n";
            }

            std::cout << "Number of throws was " << num_throws << "\n";
        }
    }

    std::cout << "Number of throws for each win:\n";
    for (auto i: won)
        std::cout << i << "\n";

    std::cout << "\nNumber of throws for each lose:\n";
    for (auto i : lose)
        std::cout << i << "\n";

    return 0;
}

double random() // Returns random double between 0 and 1
{
    double rand_num = rand() % 1000 + 1;
    return rand_num / 1000;
}

int dice(double x)  // Converts a double between 0 and 1 into an int between 1 and 6
{
    double dice_roll = (x * 6) + 1;
    return dice_roll;
}

int two_dice(int die_one, int die_two)  // Sums 2 ints together, in this case dice rolls
{
    return die_one + die_two;
}

При выполнении кода условие выхода из цикла do-while никогда не выполняется, даже если при броске фактически = 7 или точка. Это просто петли непрерывно. Я также попытался изменить int point на const int point, но ни одна из них не работает. Кто-нибудь знает, почему это может быть?

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

Редактировать: мой запрос был решен, спасибо за все ответы!

1 Ответ

3 голосов
/ 29 октября 2019

Проблема возникает из этой строки while (roll != 7 || roll != point);.

Предполагается, что points не равно 7;Если бросок равен 7, тогда roll != points оценивается как истина, и цикл продолжается. И наоборот, если roll == points, тогда roll != 7 истинно и цикл продолжается.

Поскольку вы все равно проверяете результат после цикла while, я бы предложил использовать оператор break:

do {
    num_throws++;     
    double x = random(), y = random();
    int die_one = dice(x);
    int die_two = dice(y);
    int roll = two_dice(die_one, die_two);     // Roll dice again
    std::cout << "Next roll = " << roll << "\n";
    std::cout << "Point is " << point << "\n";
    if (roll == 7)
    {
        lose.push_back(num_throws);
        std::cout << "lose\n";
        break;
    }
    else if (roll == point)
    {
        won.push_back(num_throws);
        std::cout << "win\n";
        break;
    }
} while (true);
...