0

I'm writing a program to simulate Left Right Center. If you're not familiar, the game involves 3 dice with 1 side "L", 1 side "R", 1 side "C", and 3 sides dots. Everyone starts with $3. If you roll an "L", you pass a dollar to the left. If you roll an "R", you pass a dollar to the right. If you roll a "C", you put a dollar in the center. If you roll a dot, you take no action. Play then passes to the left. Play continues until only 1 player has money remaining, and that player wins everything.

I got the program operating correctly, except for one strange thing. When I run it as below, it runs fine, usually taking 70-150 turns to complete. When I comment out the lines

 cout << "In gameOver(). Number of brokeJamokes: " << brokeJamokes;
 cin.ignore();

the program takes hundreds of thousands (or millions) of turns to complete. Why would a simple output change that?

Full code follows:

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int player[10] = {0};
int bank[10] = {0};


int rollDie() {

srand(time(NULL));

int randNum = rand()%6+1;

//cout << "In rollDie(), die roll is " << randNum << "\n";
//cin.ignore();

return randNum;
}

int distributeCash(int roll, int playerNum) {

if(roll == 1) { //pass left
    bank[playerNum]--;
    /* if active player is player 10 (player[9]), we need to pass to player 1 (player[0]) 
    instead of the nonexistant player 11, so we change the array value to -1 */
    if(playerNum == 9) {playerNum = -1; }

    bank[playerNum + 1]++;
    return 0;
}
 if(roll == 2) { //pass right
    bank[playerNum]--;
    /* if active player is player 1 (player[0]), we need to pass to player 10 (player[9]) 
    instead of the nonexistant player 0, so we change the array value to 11 */
    if(playerNum == 0) {playerNum = 10;}
    bank[playerNum - 1]++;
    return 0;
}
if(roll == 3) { //pass to center
    bank[playerNum]--;
    return 0;
}
else {
    return 0;
}
return 0;

}

int gameOver() {
int brokeJamokes = 0;

for(int i = 0; i < 10; i++) {
    if(bank[i] == 0) { brokeJamokes++; }
}

cout << "In gameOver(). Number of brokeJamokes: " << brokeJamokes;
cin.ignore();
if(brokeJamokes==9) {return 1;}
else return 0;

}

void showWinner() {
for(int i = 0; i < 10; i++) {
    if(bank[i] != 0) { 
        cout << "Player " << (i+1) << " is the winner!\n";
        cin.ignore();
        return;
    }
}
}
int main()
{

int roll[3] = {0};

for(int x = 1; x < 10; x++) { //initialize all banks to 3 except test player (player 1)
  bank[x] = 3;
}
bank[0] = 3;  //test player bank initialization
int turnCount = 0;

  while(!gameOver()){

  for(int i = 0; i < 10; i++) {
      if(gameOver()) {break;}
      for(int j = 0; j < 3; j++) {
         roll[j] = rollDie();
         if(bank[i] != 0) {
              distributeCash(roll[j], i);
          }
      }
     /* cout << "After player " << (i + 1) << "'s roll: \n";
      for(int l = 0; l < 10; l++) {
          cout << "Player " << (l + 1) << " $" << bank[l] << "\n";
      }
      cin.ignore();
  */

  turnCount++;}
  }
    showWinner();
    cout << "Number of turns: " << turnCount << "\n";

    cout << "Game over!\n";



}
Theo K
  • 9
  • 1

1 Answers1

1

As melpomene stated you repeatedly call srand, setting the same seed (as I think it uses time with a second resolution). Therefore you will get thousands or millions of 'random' numbers in a row of the same value until the time changes. Think what happens if everyone gets the same die roll, the game will never end.

When you have the cout line, it will slow the program considerably, so get less of the same roll in a row from setting srand to the same value.

To fix it move the call to srand to the main function so its only called once.

CraigR
  • 57
  • 4