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);

}