// 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 <========================================
// Your main goes here.
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
updateStats ( /* in */
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
// e-mailed to gp7621s@acad.drake.edu.
{
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;
}