I need to write the implementations for Card.cpp, Hand.cpp and Blackjack.cpp in
ID: 3801584 • Letter: I
Question
I need to write the implementations for Card.cpp, Hand.cpp and Blackjack.cpp in that order so I can implement a small blackjack game in c++ but I have been having trouble implementing Hand.cpp and Blackjack.cpp files. I think I manage to finish Card.cpp but I am not sure if the implementation is correct. Can you please show me a good approach for Hand.cpp and Blackjack.cpp. I provide here their h files as well. I do not need to care for the colors but I need strings for the type and I need to get the values for the cards and implement the class functions provided. Thank you!
//blackjack.h file
#ifndef BLACKJACK_H
#define BLACKJACK_H
#include "Hand.h"
#include <ctime>
#include <cstdlib>
enum Hit_or_Stand { HIT, STAND };
class Blackjack
{
private:
double playerMoney, playerBet;
// Objects of class Hand representing the player's hand and the dealer's hand.
Hand playerHand, dealerHand;
// An object of enumerated type Hit_or_Stand that holds the player's choice.
Hit_or_Stand playerChoice;
// Member function to obtain the player's choice.
Hit_or_Stand queryPlayer(); // Write an implementation of this function. It must
// keep querying the player until a valid choice is
// entered, then return that choice as a Hit_or_Stand.
public:
// Constructor. I have written this implementation for you.
Blackjack(double money)
:playerMoney(money), playerHand("Player"), dealerHand("Dealer")
{ }
// Member function 'play' should play a round of Blackjack according to the rules
// of the game, and return the updated playerMoney.
double play(double bet); // Write an implementation of this function.
};
#endif
//Card.h file
#ifndef CARD_H // include guard
#define CARD_H
#include <string>
class Card
{
private:
// Data members of class Card
std::string typeString; // this will store a string corresponding to the
// card type, e.g. "Ace", or "Two", or "Jack"
int initial_value; // this will hold an integer corresponding to the initial value
// of the card type. For an Ace initial_value = 11,
// a Two initial_value = 2, a Three initial_value = 3, etc.
// Jack, Queen, and King should each have initial_value = 10
// It is called 'initial value' because the value of an Ace
// will be effectively reduced to 1 if the Hand's value gets too big.
// But this will be handled in class Hand.
public:
Card(); // write an implementation for this constructor. It should call a random
// number generator to produce a random number between 1 - 13, and then
// assign the typeString accordingly, i.e. 1 becomes an "Ace", 2 becomes a "Two",
// 3 becomes a "Three", etc. 11 becomes a "Jack", 12 becomes a "Queen",
// 13 becomes a "King". Also set the initial_value of the card.
std::string getType() const; // write an implementation for this function. It should
// return the string typeString
int getValue() const; // write an implementation for this function. It should
// return the int initial_value
};
#endif
//Hand.h file
#ifndef HAND_H
#define HAND_H
// Definition of class Hand, but only function prototypes included
#include <iostream>
#include <string>
#include "Card.h"
class Hand
{
private:
int value; // This should hold the total value of the hand. Update every time you
// add a card
int number_of_aces; // this should hold the number of Aces in the hand, which is
// useful for calculating hand value. Update every time you
// add a card
int number_of_cards; // this should hold the total number of cards in the hand.
// Update every time you add a card.
Card * cards[11]; // an array of 11 Card pointers to point to the hand's cards.
std::string hand_holder; // Holds either "Player" or "Dealer"
void updateValue(); // Private member function that updates the hand's value.
// You must write an implementation for this function.
// It should be called every time you add a card.
public:
explicit Hand(std::string); // Constructor, sets hand_holder. Write an implementation.
~Hand(); // Destructor. Deallocates all cards. Write an implementation.
Hand & operator++(); // Adds a randomly chosen card to the hand. It must do so using
// a random number generator, and must use the command 'new'
// to dynamically allocate a new Card. Write an implementation.
// Below are a set of overloaded operators for comparing the value of a Hand to the
// value of another Hand, or to an int. You must write implementations for all of these.
bool operator>(const Hand & rhs) const;
bool operator>(int rhs) const;
bool operator<(const Hand & rhs) const;
bool operator<(int rhs) const;
bool operator==(const Hand & rhs) const;
bool operator==(int rhs) const;
void printHand(); // This function should print the cards in the hand, and the total
// value of the hand. Write an implementation.
void printFirstCard(); // This function should print only the first card in the hand
// (used for dealer). Write an implementation.
// Here I'm implementing a copy constructor and an assignment operator for you.
// It is necessary to write our own copy constructor because of the dynamically
// allocated memory in this class, see class notes.
// You shouldn't use these functions in your final code, but they may be useful for debugging
// purposes, or for the extra credit.
Hand (const Hand & hand_to_copy)
: hand_holder(hand_to_copy.hand_holder), number_of_aces(hand_to_copy.number_of_aces),
number_of_cards(hand_to_copy.number_of_cards), value(hand_to_copy.value)
{
for (int i = 0; i < number_of_cards; i++)
cards[i] = new Card(*(hand_to_copy.cards[i]));
std::cout << "Your code called the copy constructor for Hand." <<
" It shouldn't do that unless maybe you're doing the extra credit. FYI" << std::endl;
}
void operator= (const Hand & hand_to_copy)
{
for (int i = 0; i < number_of_cards; i++)
delete cards[i];
hand_holder = hand_to_copy.hand_holder;
number_of_aces = hand_to_copy.number_of_aces;
number_of_cards = hand_to_copy.number_of_cards;
value = hand_to_copy.value;
for (int i = 0; i < number_of_cards; i++)
cards[i] = new Card(*(hand_to_copy.cards[i]));
std::cout << "Your code called the assignment operator for Hand." <<
" It shouldn't do that unless maybe you're doing the extra credit. FYI" << std::endl;
}
};
#endif
//Card.cpp file
#include "Card.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
char const* mtypeString;
int getinit;
Card::Card(){
srand( static_cast<unsigned int>(time(0)));
getinit=rand()%13+1;
if (getinit==1){mtypeString="Ace";}
else if(getinit==2){mtypeString="Two";;}
else if(getinit==3){mtypeString="Three";}
else if(getinit==4){mtypeString="Four";}
else if(getinit==5){mtypeString="Five";}
else if(getinit==6){mtypeString="Six";}
else if(getinit==7){mtypeString="Seven";}
else if(getinit==8){mtypeString="Eight";}
else if(getinit==9){mtypeString="Nine";}
else if(getinit==10){mtypeString="Ten";}
else if(getinit==11){mtypeString="Jack";}
else if(getinit==12){mtypeString="Queen";}
else if(getinit==13){mtypeString="King";}
initial_value=getinit;
typeString=mtypeString;
//cout<<"This is the value: "<<initial_value<<" "<<"Now the string: "<<typeString<<" " ;
}
/*gettype::gettype(){
typeString=mtypeString;
return typeString; */
int Card::getValue() const {
//initial_value=getinit;
return initial_value;
}
std::string Card::getType() const{
return typeString;
}
//Hand.cpp file with implementations already but incomplete. I am unable to finish it because I do not // get how to apply some of the provided functions
#include "Card.h"
//#include "Card.cpp"
#include "Hand.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int myval;
//char const* mystring;
Hand::Hand(std::string){
value=0;
number_of_aces=0;
number_of_cards=0;
hand_holder="";
}
void Hand::updateValue(){
Card mycard;
myval=mycard.getValue();
value=value+myval;
}
~Hand()
Hand & operator++()
bool operator>(const Hand & rhs) const;
bool operator>(int rhs) const;
bool operator<(const Hand & rhs) const;
bool operator<(int rhs) const;
bool operator==(const Hand & rhs) const;
bool operator==(int rhs) const;
void printHand(); // This function should print the cards in the hand, and the total
// value of the hand. Write an implementation.
void printFirstCard();
//I also need to complete the blackjack.cpp file as well
//here is the main.cpp file
// Blackjack game code.
#include "Blackjack.h"
#include <iostream>
using namespace std;
// Function to take player's bet.
double takeBet(const double & playerMoney)
{
double bet;
do
{
cout << "Enter bet in dollars, 0 to quit: ";
cin >> bet;
if (bet > playerMoney)
cout << "You don't have that much money! Enter a lower bet." << endl;
} while (bet > playerMoney);
return bet;
}
// main function
int main()
{
// Seed the random number generator with current time
std::srand( static_cast<unsigned int>(time(0)));
// Player starts with 300 dollars
double playerMoney = 300.0, playerBet;
// integer to hold the round number
int roundNum = 1;
cout << "Player starts with " << playerMoney << " dollars" << endl;
cout << "Round " << roundNum << endl;
// Take bet
playerBet = takeBet(playerMoney);
// Keep playing Blackjack until the player bets 0 dollars, or they are broke.
while ((playerBet > 0.0) && (playerMoney > 0.0))
{
// Instantiate Blackjack object, which initializes round.
Blackjack myBlackjack(playerMoney);
// Play the round of Blackjack. Member function 'play' should return the updated
// playerMoney.
playerMoney = myBlackjack.play(playerBet);
// Take a new bet unless the player is broke.
if (playerMoney > 0.0)
{
cout << endl << endl << "Round " << ++roundNum << endl;
playerBet = takeBet(playerMoney);
}
}
}
Explanation / Answer
//Card.cpp file
#include "Card.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
char const* mtypeString;
int getinit;
Card::Card(){
srand( static_cast<unsigned int>(time(0)));
getinit=rand()%13+1;
if (getinit==1){mtypeString="Ace";}
else if(getinit==2){mtypeString="Two";;}
else if(getinit==3){mtypeString="Three";}
else if(getinit==4){mtypeString="Four";}
else if(getinit==5){mtypeString="Five";}
else if(getinit==6){mtypeString="Six";}
else if(getinit==7){mtypeString="Seven";}
else if(getinit==8){mtypeString="Eight";}
else if(getinit==9){mtypeString="Nine";}
else if(getinit==10){mtypeString="Ten";}
else if(getinit==11){mtypeString="Jack";}
else if(getinit==12){mtypeString="Queen";}
else if(getinit==13){mtypeString="King";}
initial_value=getinit;
typeString=mtypeString;
//cout<<"This is the value: "<<initial_value<<" "<<"Now the string: "<<typeString<<" " ;
}
/*gettype::gettype(){
typeString=mtypeString;
return typeString; */
int Card::getValue() const {
//initial_value=getinit;
return initial_value;
}
std::string Card::getType() const{
return typeString;
}
//Hand.cpp file with implementations already but incomplete. I am unable to finish it because I do not // get how to apply some of the provided functions
#include "Card.h"
//#include "Card.cpp"
#include "Hand.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int myval;
//char const* mystring;
Hand::Hand(std::string){
value=0;
number_of_aces=0;
number_of_cards=0;
hand_holder="";
}
void Hand::updateValue(){
Card mycard;
myval=mycard.getValue();
value=value+myval;
}
~Hand()
Hand & operator++()
bool operator>(const Hand & rhs) const;
bool operator>(int rhs) const;
bool operator<(const Hand & rhs) const;
bool operator<(int rhs) const;
bool operator==(const Hand & rhs) const;
bool operator==(int rhs) const;
void printHand(); // This function should print the cards in the hand, and the total
// value of the hand. Write an implementation.
void printFirstCard();
//I also need to complete the blackjack.cpp file as well
//here is the main.cpp file
// Blackjack game code.
#include "Blackjack.h"
#include <iostream>
using namespace std;
// Function to take player's bet.
double takeBet(const double & playerMoney)
{
double bet;
do
{
cout << "Enter bet in dollars, 0 to quit: ";
cin >> bet;
if (bet > playerMoney)
cout << "You don't have that much money! Enter a lower bet." << endl;
} while (bet > playerMoney);
return bet;
}
// main function
int main()
{
// Seed the random number generator with current time
std::srand( static_cast<unsigned int>(time(0)));
// Player starts with 300 dollars
double playerMoney = 300.0, playerBet;
// integer to hold the round number
int roundNum = 1;
cout << "Player starts with " << playerMoney << " dollars" << endl;
cout << "Round " << roundNum << endl;
// Take bet
playerBet = takeBet(playerMoney);
// Keep playing Blackjack until the player bets 0 dollars, or they are broke.
while ((playerBet > 0.0) && (playerMoney > 0.0))
{
// Instantiate Blackjack object, which initializes round.
Blackjack myBlackjack(playerMoney);
// Play the round of Blackjack. Member function 'play' should return the updated
// playerMoney.
playerMoney = myBlackjack.play(playerBet);
// Take a new bet unless the player is broke.
if (playerMoney > 0.0)
{
cout << endl << endl << "Round " << ++roundNum << endl;
playerBet = takeBet(playerMoney);
}
}
}