jeudi 29 octobre 2015

C++ Bowling Simulator Program

I recently received an assignment to create a bowling program in C++ that simulates two people bowling and outputs the correct score for each frame. My program works by first generating all the throws for each frame and then accumulating the score afterwards in a separate method. I was able to get the program to work when the player bowls a non-perfect game and a perfect game, but I am having problems with when a player bowls all spares. I rigged the code to make it so I have 9 for a first throw and 1 for the second throw (this is in frame.cpp). The total should be 190, but I am getting 191 and I can't seem to find the error. Each bowling class contains an array of 11 frames. I know there are only 10 frames but this is to account for if the player gets a strike on the tenth frame. Any help would be appreciated, thanks.

Here is the frame. h file

#ifndef FRAME_H
#define FRAME_H
#include<iostream>
using namespace std;

class Frame
{
private: int throw1;
         int throw2;
         int score;
         bool spare;
         bool strike;

public: Frame();
        int genThrow(int size);
        int getFirstThrow();
        int getSecondThrow();
        int getScore();
        void setScore(int);
        void setFirstThrow(int value1);
        void setSecondThrow(int value2);
        void setStrike(bool value);
        void setSpare(bool value);
        bool getStrike();
        bool getSpare();
};
#endif

Here is the frame.cpp file

#include "Frame.h"
#include<iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

Frame::Frame()
{
    spare = false;
    strike = false;
    throw1 = 0;
    throw2 = 0;
    score = 0;
}

//generates a random throw
int Frame::genThrow(int size)
{
    int randomNumber = 0;

    if (size < 10 || throw1 != 10)
    {
        randomNumber = 0 + rand() % (11 - throw1); //generate a number between 0 and 10
    }
    else
    {
        randomNumber = 0 + rand() % (11);
    }

    //cout << randomNumber << endl;

    return randomNumber;
}

//get first throw
int Frame::getFirstThrow()
{
    return throw1;
}

//get second throw
int Frame::getSecondThrow()
{
    return throw2;
}

//get the score of both throws
int Frame::getScore()
{
    return score;
}

//set the score
void Frame::setScore(int value)
{
    score = value;
}

//set the first throw
void Frame::setFirstThrow(int value1)
{
    //throw1 = genThrow(value1); //normal generator
    //throw1 = 10; //strike game rigged
    throw1 = 9; //spare game rigged
}

//set the second throw
void Frame::setSecondThrow(int value2)
{

    //throw2 = genThrow(value2); //normal generator

    throw2 = 1; //spare game rigged
    //throw2 = 10; //strike game rigged
}

//set the strike
void Frame::setStrike(bool value)
{
    strike = value;
}

//set the spare
void Frame::setSpare(bool value)
{
    spare = value;
}

//get the strike
bool Frame::getStrike()
{
    return strike;
}


//get the spare
bool Frame::getSpare()
{
    return spare;
}

Here is the bowling.h file

#ifndef BOWLING_H
#define BOWLING_H
#include "Frame.h"
#include<iostream>
using namespace std;

class Bowling 
{
private: Frame a[11];

public: void accumulateScore();
        void bowl();
        void printData();
};
#endif

Here is the bowling.cpp file

#include "Bowling.h"
#include<iostream>
using namespace std;

//takes all of the throw values after bowling and accumulates the correct score
void Bowling::accumulateScore()
{
    int totalSum = 0;
    for (int x = 0; x < 10; x++)
    {
        if (a[x].getFirstThrow() + a[x].getSecondThrow() < 10) //not a strike or spare
        {
            totalSum += a[x].getFirstThrow() + a[x].getSecondThrow();
            a[x].setScore(totalSum);
        }
        else if (a[x].getFirstThrow() == 10) //throws a strike
        {
            if (x < 9)
            {
                totalSum += 10 + a[x + 1].getFirstThrow() + a[x + 1].getSecondThrow();
                if (a[x + 2].getStrike() == true)
                {
                    totalSum += 10;
                }
                a[x].setScore(totalSum);
            }
        }
        else if (a[x].getFirstThrow() + a[x].getSecondThrow() == 10) //throws a spare
        {
            if(x < 10)
            {
                totalSum += 10 + a[x + 1].getFirstThrow();
                a[x].setScore(totalSum);
            }
        }
    }

    //player got the 11th frame
    if (a[9].getStrike() == true)
    {
        totalSum += 10 + a[10].getFirstThrow() + a[10].getSecondThrow();
        a[9].setScore(totalSum);
    }
    else if (a[9].getSpare() == true)
    {
        totalSum += 10;
        a[9].setScore(totalSum);
    }
}

void Bowling::bowl()
{
    //generate all throws and store them in the frames
    for (int x = 0; x < 10; x++)
    {
        a[x].setFirstThrow(x);
        if (a[x].getFirstThrow() == 10)
        {
            a[x].setStrike(true);
        }
        if (a[x].getStrike() == false)
        {
            a[x].setSecondThrow(x);
            if (a[x].getFirstThrow() + a[x].getSecondThrow() == 10)
            {
                a[x].setSpare(true);
            }   
        }
        a[x].setScore(a[x].getFirstThrow() + a[x].getSecondThrow());
    }

    //play the 11th frame if they got a strike on the tenth frame

    if(a[9].getStrike() == true)
    {
        a[10].setFirstThrow(10);
        if (a[10].getFirstThrow() == 10)
        {
            a[10].setStrike(true);
        }
        a[10].setSecondThrow(10);
        cout << "The second throw is this value: " << a[10].getSecondThrow() << endl;
        if (a[10].getSecondThrow() == 10)
        {
            a[10].setStrike(true);
        }
        else if (a[10].getFirstThrow() + a[10].getSecondThrow() == 10)
        {
            a[10].setSpare(true);
        }
        a[9].setScore(a[10].getFirstThrow() + a[10].getSecondThrow());

    }
}

void Bowling::printData()
{
    for (int x = 0; x < 10; x++)
    {
        cout << "*****************************" << endl;
        cout << "Frame " << x + 1 << endl;
        cout << "First throw: ";
        if (a[x].getStrike() == true)
        {
            cout << "Strike!" << endl;
        }
        else
        {
            cout << a[x].getFirstThrow() << endl;
        }


        cout << "Second throw: ";
        if (a[x].getStrike() == false)
        {
            if (a[x].getSpare() == true)
            {
                cout << "Spare!" << endl;
            }
            else if(a[x].getSpare() == false)
            {
                cout << a[x].getSecondThrow() << endl;
            }
            else
            {
                cout << endl;
            }
        }
        cout << "Score: " << a[x].getScore();
        cout << endl;
    }

    if (a[9].getStrike() == true)
    {
        cout << "*****************" << endl;
        cout << "Frame 11" << endl;
        cout << "First throw: ";
        if (a[10].getStrike() == true)
        {
            cout << "Strike!" << endl;
        }
        else
        {
            cout << a[10].getFirstThrow() << endl;
        }
        cout << "Second throw: ";

        if (a[10].getStrike() == false)
        {
            if (a[10].getSpare() == true)
            {
                cout << "Spare!" << endl;
            }
            else
            {
                cout << a[10].getSecondThrow() << endl;
            }
        }
        else
        {
            cout << "Strike!" << endl;
        }
        //cout << "Score: " << a[10].getScore();
        cout << endl;
    }
}

Here is where I test it in main

#include "Bowling.h"
#include<iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand(time(0));
    int dummy = 0;

    //create two players that can bowl
    Bowling player1;
    Bowling player2;
    int player1Score = 0;
    int player2Score = 0;

    //have the players bowl their throws before accumulating score
    player1.bowl();
    player2.bowl();

    //accumulate the score after all of the throws have been done
    player1.accumulateScore();
    player2.accumulateScore();

    //print player 1 data
    cout << "Here are the throws and score for the first player: " << endl;
    player1.printData();

    //spacing
    cout << endl << endl;

    //print player 2 data
    cout << "Here are the throws and score for the second player: " << endl;
    player2.printData();

    cout << "Enter a dummy number:" << endl;
    cin >> dummy;
    return 0;
}




Aucun commentaire:

Enregistrer un commentaire