```// Racquetball Simulation

// Programmer:	Gregory A. Perkins
// Class:		CS 66
// Due:			20 February 1997

// This program accepts the probabilities that a person serving will win the
// serve for two players and the number of games to play.  It then simulates
// the number of games played and outputs the results.  The program is used to
// determine whether a player should work on offense or on defense.

// File: rball.cc -- Group code for a raquetball simulation (CS 66/ Spring 97).
// Collated and slightly edited by JMZ.
// Date: 2/16/97

//========================>  MODIFICATIONS TO CODE <=============================
//  Boolean declaration - removed (commented out) to prevent declaration errors
//	getInputs - 1> changed formatting of output, included some "\n"
//              2> two nested while loops changed from "&&" to "||" to correct logic
//				3> external while loops changed from "=" to "==" to correct logic
//  printSummary - 1> add if statement to prevent printing if no games were played
//                 2> add if statements to adjust for error in printing percentage
//						of shutouts if player did not win ANY games
//===============================================================================

#include
#include
#include
#include
#include
#include "Racquetball.h"

//===============================> MAIN <========================================
int
main()
{
srand(clock());		// seed the random number generator

float probA;
float probB;
int numGames;

getInputs(probA, probB, numGames);

int scoreA;
int scoreB;
int winsA = 0;
int winsB = 0;
int shutsA = 0;
int shutsB = 0;

for (int i = 1; i <= numGames; i++)
{
playGame(probA, probB, scoreA, scoreB);
updateStats(scoreA, scoreB, winsA, winsB, shutsA, shutsB);
}

printSummary(shutsA, shutsB, winsA, winsB, probA, probB);

return (0);
}

//===============================> FUNCTION DEFINITIONS <=========================

void getInputs(/*out*/ float& aProb,
float& bProb,
int& num_of_games)
{
cout<<"You will now be prompted for the probabilities and number of\n"
<<"games to be played. Please enter probabilities as decimals\n"
<<"between 0 and 1, inclusive. Note that only one probability\n"
<<"can be 0, not both. Please enter the number of games to be\n"
<<"played as an integer greater or equal to zero."
<> aProb;
cout<1));

do
{
cout<<"Enter the probability for Player B.\n"
<<"Please remeber that it must be between 0 and 1\n"
<<"inclusive and that only one probability can be 0\n"
<<"Enter probability: ";
cin>> bProb;
cout<1));

}
while((aProb==0)&&(bProb==0));

do
{
cout<<"Please enter the number of games to play: ";
cin>>num_of_games;
cout< doRally <=============================
// DoRally Function
// Group 6
// Mike Schumacher, Mike Kramer, Yasima Said, Sreshta W., Han Nguyen

void doRally(float serverProb,
int& serverScore,
Boolean& aServing)
{
if (serverWins(serverProb))
serverScore++;        		//Server's score incremented if they win
else
aServing = !aServing;    	//To change server if server loses
}

Boolean serverWins(/* in */ float prob)
{
return Boolean(rand() <= prob * RAND_MAX);
}

Boolean gameOver(/* in */ int aScore, int bScore)
{
Boolean temp;
temp = ((aScore > 20) || (bScore > 20)) || ((aScore == 11) &&
(bScore ==0)) || ((bScore == 11) && (aScore == 0));
return temp;
}

void
int aScore,
int bScore,
/* inout */
int& aWins,
int& bWins,
int& aShuts,
int& bShuts)
// This function accepts both players' scores and updates the
// appropriate stats for the winner of the game.  Any questions
// related to logic or any errors in the function should be
{
if (aScore > bScore)    	// if player A wins
{
aWins++;    			// increment # of wins by one

if (bScore == 0)  	// if it was a shutout
aShuts++; 			// increment # of shutouts by one
}
else        				// if player B wins
{
bWins++;    			// increment # of wins by one

if (aScore == 0)  	// if it was a shutout
bShuts++; 			// increment # of shutouts by one
}

return;
}

void printSummary (/* in */
int aShutout,
int bShutout,
int aWin,
int bWin,
float aProb,
float bProb)
{
if (aWin + bWin > 0)			//only print summary if some games were actually played
{
cout  << "A won "      	//output num of a wins
<< aWin
<< " game";

if (aWin != 1)      		//output an 's' only if != 1
cout  << "s";

cout  << "."
<< endl;

cout  << "B won "      	// output num of b wins
<< bWin
<< " game";

if (bWin != 1)         	//output an 's' only if != 1
cout << "s";

cout  << "."
<< endl;
cout  << "A had "   		//output num of a shutouts
<< aShutout
<< " shutout";

if (aShutout != 1)
cout  << "s";         	//output an 's' only if != 1

cout  << "."
<< endl;

cout  << "B had "        	//output num of b shutouts
<< bShutout
<< " shutout";

if (bShutout != 1)
cout  << "s";        	//output an 's' only if != 1

cout  << "."
<< endl;

cout  << "______________________________________________________________________"
<< endl;
cout  << endl;

cout  << "A's probability of winning was "  //output a percentages
<< aProb * 100
<< "%."
<< endl
<< "Player A actually won "
<< setprecision (3)
<< float (aWin) / (aWin + bWin) * 100
<< "% of games played.  "
<< endl;

if (aWin > 0)								 // if player actually won some games
cout  << setprecision (3)				 // print player's percentage of shutouts
<< float (aShutout) / (aWin) * 100
<< "% of A's wins were shutouts."
<< endl;

cout  << endl;

cout  << "B's probability of winning was "  //output b percentages
<< bProb * 100
<< "%."
<< endl
<< "Player B actually won "
<< setprecision (3)
<< float (bWin) / (aWin + bWin) * 100
<< "% of games played."
<< endl;

if (bWin > 0)								 // if player actually won some games
cout  << setprecision (3)				 // print player's percentage of shutouts
<< float (bShutout) / (bWin) * 100
<< "% of B's wins were shutouts."
<< endl;

cout  << endl;
}
else
cout  << "______________________________________________________________________"
<< endl
<< "************************ NO GAMES WERE PLAYED ************************"
<< endl;
}
```