hw6_functs.cpp
/*
Programmer: Jennifer Leopold
Date: February 29, 2016
File: hw6_functs.cpp
Purpose: Function definitions used for simulating a
combination slot machine + ATM machine that
has a menu allowing the user to check their
bank balance, transfer funds to the game, play
the game, or quit the game.
*/
#include <iostream>
#include "hw6_functs.h"
using namespace std;
void outputGreeting()
{
cout << "\nWelcome to Cletus' ATM-Slot-o-Matic!\n";
return;
}
void outputSignOff(const int bankBalance,
const int gameBalance)
{
displayBalances(bankBalance, gameBalance);
cout << "Y'all come play again sometime!\n";
return;
}
int calculateInitialBankBalance()
{
return(MIN_INIT_BANK_BALANCE +
((rand() % ((MAX_INIT_BANK_BALANCE /
INIT_BANK_BALANCE_INCR) - 1)) *
INIT_BANK_BALANCE_INCR));
}
void displayMenu()
{
cout << "\nOptions:\n";
cout << "1. Check bank balance\n";
cout << "2. Transfer funds to game\n";
cout << "3. Play\n";
cout << "4. Leave (cash out)\n";
cout << "Enter your choice (1-4): ";
return;
}
void displayBalances(const int bankBalance,
const int gameBalance)
{
cout << "Current bank balance: $"
<< bankBalance << endl;
cout << "Current game balance: $"
<< gameBalance << endl;
return;
}
void transferFunds(int &bankBalance, int &gameBalance)
{
int transferAmount; // amt xfer'd from bank
// balance to game balance
cout << "How much do you want transfer? ";
cin >> transferAmount;
if (transferAmount > bankBalance)
cout << "No, that amount is more than your "
<< "bank balance of $"
<< bankBalance << "!\n";
else if (transferAmount <= 0)
cout << "No, amount must be > 0!\n";
else {
bankBalance -= transferAmount;
gameBalance += transferAmount;
cout << "Transfer completed.\n";
displayBalances(bankBalance, gameBalance);
}
return;
}
short getNumSpins()
{
short spins;
do
{
cout << "How many times do you want to spin? ";
cin >> spins;
if (spins <= 0)
cout << "Enter a positive number!\n";
} while (spins <= 0);
return(spins);
}
short determineNumMatches(const short tumbler1,
const short tumbler2,
const short tumbler3)
{
short numMatches = 0;
if ((tumbler1 == tumbler2) ||
(tumbler1 == tumbler3) ||
(tumbler2 == tumbler3))
numMatches = 2;
if ((tumbler1 == tumbler2) &&
(tumbler1 == tumbler3) &&
(tumbler2 == tumbler3))
numMatches = 3;
return(numMatches);
}
int determineWinnings(const short numMatches)
{
int winnings;
if (numMatches == 2)
winnings = WIN_IF_TWO_MATCH;
else if (numMatches == 3)
winnings = WIN_IF_THREE_MATCH;
else winnings = -LOSS_IF_NO_MATCH;
return(winnings);
}
char tumblerDisplayAsChar(const short tumblerDisplayAsShort)
{
return(static_cast<char>(tumblerDisplayAsShort + SYMBOL1));
}
void playGame(const int bankBalance, int &gameBalance)
{
short spins; // # games user plays
// at one time
short tumbler1, tumbler2, tumbler3; // slot machine
// tumblers
short numMatches; // # tumbler matches
int winnings; // 1 spin winnings
static int numTripleMatch = 0; // # 3-matches
static int numDoubleJackpotSymbol = 0; // # 2 jackpot
// symbol matches
// Get user input for # spins
spins = getNumSpins();
// Check to make sure user's funds can covern potential
// losses for # desired spins
if ((spins * LOSS_IF_NO_MATCH) > gameBalance)
cout << "You don't have enough funds "
<< "to cover that many losses!\n";
else
{
// Sufficient game funds, so play spin-many times
for (short i = 1; i <= spins; i++)
{
// Randomly generate values for tumblers
tumbler1 = rand() % NUM_DISPLAY_CHARS;
tumbler2 = rand() % NUM_DISPLAY_CHARS;
tumbler3 = rand() % NUM_DISPLAY_CHARS;
cout << "\nYour result is "
<< tumblerDisplayAsChar(tumbler1)
<< tumblerDisplayAsChar(tumbler2)
<< tumblerDisplayAsChar(tumbler3)
<< endl;
numMatches = determineNumMatches(tumbler1, tumbler2,
tumbler3);
cout << "That is " << numMatches << " matches\n";
// Keep track of jackpot determiners
if (numMatches == 3)
numTripleMatch++;
if (numMatches >= 2)
numDoubleJackpotSymbol +=
numDoubleJackpotSymbolMatches(tumbler1, tumbler2,
tumbler3);
// Post winnings or losses
if ((numTripleMatch + numDoubleJackpotSymbol) >=
JACKPOT_LEVEL)
{
winnings = JACKPOT;
cout << "$$$$$$$$$$ JACKPOT!!! $$$$$$$$$$\n";
soundTheAlarm();
numTripleMatch = 0; // reset determiner counts
numDoubleJackpotSymbol = 0;
}
else winnings = determineWinnings(numMatches);
gameBalance += winnings;
cout << "You " <<((winnings > 0)? "win" : "lose")
<< " $" << abs(winnings) << endl;
cout << "Current game balance: $"
<< gameBalance << endl;
}
}
return;
}
void soundTheAlarm()
{
for (int i = 1; i <= NUM_BELLS; i++)
{
cout << '\a';
cout.flush();
sleep(1); // otherwise, don't hear separate bells
}
return;
}
int numDoubleJackpotSymbolMatches(const short tumbler1,
const short tumbler2,
const short tumbler3)
{
int doubleMatches;
int numJackpotSymbol = 0;
if (tumbler1 == JACKPOT_CHAR_INDEX)
numJackpotSymbol++;
if (tumbler2 == JACKPOT_CHAR_INDEX)
numJackpotSymbol++;
if (tumbler3 == JACKPOT_CHAR_INDEX)
numJackpotSymbol++;
if (numJackpotSymbol == 3)
doubleMatches = 3;
else if (numJackpotSymbol == 2)
doubleMatches = 1;
else doubleMatches = 0;
return(doubleMatches);
}