amykp
amykp

Reputation: 45

C++ Problems generating new random numbers within loop/when prompted

I am almost finished with this basic dice program, but having trouble finding out what I did wrong for srand. It is supposed to randomly roll 2 dice for the user, and they have the option to keep what they rolled (K) or roll again (R). I would like the program to output new "random" numbers for the dice roll each time the user enters "R" when asked if they want to roll again, but the same numbers keep displaying.

The rest of the program seems to work well -- user plays against the computer. How do I generate new numbers for roll1 and roll2 when user inputs "R" when asked to keep or re-roll?

#include <stdlib.h> /// need this for srand() -- for random numbers
#include <time.h> /// need this for time() -- time
#include <iostream>  /// need this for cout<< and cin>>
using namespace std; /// need this for cout<< and cin>>

int main()
{
    int iseed = (int)time(0);
    srand(iseed);

    cout << "Beat the computer! \n";

    int roll1 = 1+rand()%6; /// make a random number for die # 1 for user
    int roll2 = 1+rand()%6; /// make a random number for die # 2 for user
    int UserRoll = roll1 + roll2; /// totals the sum of die 1 and die 2 for the user
    char keep;

    do
    {
    cout << "You rolled a " << roll1 << " and a " << roll2 << " for a total of: " << UserRoll << "\n";
    cout << "\n";

        do
        {
        cout << "Would you like to keep this total, or roll again? \n";
        cout << "\n";
        cout << "Enter \"K\" for keep and \"R\" for roll again: \n";
        cin >> keep;

            if (keep != 'K' && keep != 'R')

            {
                cout << "That is not a valid choice. Please choose Y to keep your total or N to roll again. " << endl;
                cout << "\n";
            }

            } while(keep != 'K' && keep != 'R');



            if (keep == 'R')
            {
                cout << "You chose R--let's roll again. \n";
            }


            else
            {
            cout << "Great! Your total is " << UserRoll << "\n";
            }
        } while (keep == 'R');

    int roll3 = 1+rand()%6; /// make a random number for die # 1 for computer
    int roll4 = 1+rand()%6; /// make a random number for die # 2 for computer
    int ComputerRoll = roll3 + roll4; /// totals the sum of die 1 and die 2 for the computer


    cout << "The computer rolled a " << roll3 << " and a " << roll4 << " for a total of: " << ComputerRoll << "\n";
    cout << "\n";

    if (ComputerRoll < UserRoll)
    {
        cout << "Congratulations! You won! \n";
    }

    if (ComputerRoll > UserRoll)
    {
        cout << "Sorry. You lose. \n";
    }

    if (ComputerRoll == UserRoll)
    {
        cout << "It's a tie. \n";
    }

return 0;
}

/*
SAMPLE RUNS:
------------
Beat the computer!
You rolled a 4 and a 6 for a total of: 10

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 4 and a 6 for a total of: 10

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
K
Great! Your total is 10
The computer rolled a 4 and a 6 for a total of: 10

It's a tie.

Process returned 0 (0x0)   execution time : 8.763 s
Press any key to continue.

*/

Upvotes: 2

Views: 312

Answers (2)

amykp
amykp

Reputation: 45

Great! I finally have a working program! Anyone let me know if you think there is a way I can make this neater and easier to read:

#include <stdlib.h> /// need this for srand() -- for random numbers
#include <time.h> /// need this for time() -- time
#include <iostream>  /// need this for cout<< and cin>>
using namespace std; /// need this for cout<< and cin>>


int roll1,roll2,UserRoll;
char keep;

void roll()
    {
        roll1 = 1+rand()%6; /// make a random number for die # 1 for user
        roll2 = 1+rand()%6; /// make a random number for die # 2 for user
        UserRoll = roll1 + roll2; /// totals the sum of die 1 and die 2 for the user
    }

int main()
{
    int iseed = (int)time(0);
    srand(iseed);

    cout << "Beat the computer! \n";

    roll();

    do
    {
    cout << "You rolled a " << roll1 << " and a " << roll2 << " for a total of: " << UserRoll << "\n";
    cout << "\n";

        do
        {
        cout << "Would you like to keep this total, or roll again? \n";
        cout << "\n";
        cout << "Enter \"K\" for keep and \"R\" for roll again: \n";
        cin >> keep;

            if (keep != 'K' && keep != 'R')

            {
                cout << "That is not a valid choice. Please choose Y to keep your total or N to roll again. " << endl;
                cout << "\n";
            }

            } while(keep != 'K' && keep != 'R');



            if (keep == 'R')
            {
                cout << "You chose R--let's roll again. \n";
                roll();
            }


            else
            {
            cout << "Great! Your total is " << UserRoll << "\n";
            }
        } while (keep == 'R');

    int roll3 = 1+rand()%6; /// make a random number for die # 1 for computer
    int roll4 = 1+rand()%6; /// make a random number for die # 2 for computer
    int ComputerRoll = roll3 + roll4; /// totals the sum of die 1 and die 2 for the computer


    cout << "The computer rolled a " << roll3 << " and a " << roll4 << " for a total of: " << ComputerRoll << "\n";
    cout << "\n";

    if (ComputerRoll < UserRoll)
    {
        cout << "Congratulations! You won! \n";
    }

    if (ComputerRoll > UserRoll)
    {
        cout << "Sorry. You lose. \n";
    }

    if (ComputerRoll == UserRoll)
    {
        cout << "It's a tie. \n";
    }

return 0;
}

/*
SAMPLE RUNS:
------------
Beat the computer!
You rolled a 2 and a 4 for a total of: 6

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 4 and a 4 for a total of: 8

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 4 and a 1 for a total of: 5

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 5 and a 5 for a total of: 10

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 6 and a 1 for a total of: 7

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 5 and a 2 for a total of: 7

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
R
You chose R--let's roll again.
You rolled a 6 and a 6 for a total of: 12

Would you like to keep this total, or roll again?

Enter "K" for keep and "R" for roll again:
K
Great! Your total is 12
The computer rolled a 3 and a 1 for a total of: 4

Congratulations! You won!

Process returned 0 (0x0)   execution time : 19.487 s
Press any key to continue.
*/

Upvotes: 0

JAMSHAID
JAMSHAID

Reputation: 1357

You are Rolling just Once and using the result of that roll again. if user press R again. it should roll again to update new numbers. for the sake of that simply add

void roll(){
    roll1 = 1+rand()%6; /// make a random number for die # 1 for user
   roll2 = 1+rand()%6; /// make a random number for die # 2 for user
UserRoll = roll1 + roll2; /// totals the sum of die 1 and die 2 for the user

}

Remember: roll1,roll2 and UserRoll should declared globally before roll() function

just before the main() method and call it when user press R as well as after

cout << "Beat the computer! \n";

and remove it from the main method. That's all what you need to do

Upvotes: 3

Related Questions