CSCI 261 - Programming Concepts (C++)

Spring 2018 - Assignment 5 - War!

Quick Links: Canvas | CS @ Mines | Cloud9 | Piazza | zyBooks

|   Home |  Contact |  Syllabus |  Assignments |  Schedule |  Resources   |
This assignment is due by Thursday, March 15, 2018 11:59 PM.

In this homework, we will combine everything we've learned so far with a focus on vector, struct and string.


Overview



For this assignment, your job is to create a simple War game simulation.


The Specifics



You must first create a struct named Card to represent a playing card. It must have two attributes, a rank stored as an int and a suit stored as a string. Since this struct definition will be used in multiple files, you probably would want to create this in its own header file and then include this header in any other file that requires the use of the Card struct.

Before the gameplay portion of your program starts, create a vector of Cards called deck. This vector will hold the current cards to be drawn from. Populate the vector with all 52 card values (Ace of Hearts through King of Spades).

Create a function called printCard() that takes a Card parameter as input and has no output. The function must print "Ace", "Jack", "Queen", or "King" in place of 1, 11, 12, and 13 respectively. The function must print 2-10 for all other respective values.

At this point, print all cards in your vector to ensure you have all 52 cards represented. Once you are satisfied all 52 cards are there, comment out these print statements.

Now, for the most important part, create a function called shuffleDeck that takes a vector of Cards as input. This function randomly selects two cards from the deck and swaps them. This operation must be performed enough times to ensure the entire deck is thoroughly shuffled. To verify the cards have been shuffled, again print all cards in your array. If you are happy with the randomness of the card order, comment out these print statements as well.

Next, create a function called dealNextCard that takes the vector of cards passed by reference as input. The function must return a Card as output. The function must return the card at the back of the deck (i.e., the "top" card in the deck). The function then also needs to remove the last Card from the deck; that is, since we've now "dealt" this card, we don't want to deal it again! Hmm, why do we pass the deck parameter by reference to this function then?

To test our dealing function, create a loop that deals each card and then prints the size of the remaining deck. When you reach the end of the deck and all cards have successfully been dealt once, you can comment out these print statements and continue on.

Once the cards are shuffled and you can deal cards, create two new vectors called player and computer. Deal the deck into the player and computer vectors so that each holds 26 cards.

At this point, everything is in place to start our game. Follow this pseudocode to complete the remainder of the assignment:
  1. While the Player wants to play:
    1. Deal the top card from the player deck, print the card
    2. Deal the top card from the computer deck, print the card
    3. If the player has the higher ranked card
      1. Put both cards onto the bottom of the player's deck
    4. If the computer has the higher ranked card
      1. Put both cards onto the bottom of the computer's deck
    5. If both cards have equal rank:
      1. Deal three cards from both the player and the computer (these cards do not need to be printed to the terminal)
        1. If the player or computer does not have three cards to deal, then deal all but one card.
      2. Deal the next card and compare
      3. Return to step #4 and compare these two cards
    6. If the player has zero cards or the computer has zero cards, then jump to step 17.
    7. Ask Player if they want to play again, "Yes" or "No". The user must type in "Yes" or "No" and you must store their response as a string.
    8. If they entered "Yes", go back to Step #2.
    9. If they entered "No":
      1. If the player has more cards, print "Player wins!"
      2. If the computer has more cards, print "Computer wins!"
      3. If the player and computer have the same number of cards, print "Draw"
It looks like a lot of steps, but the majority of those steps are describing the rules of War! Once completed, hopefully you find this assignment enjoyable to play and try to beat the computer. Sample output and program flow should be as follows:

War! What is it good for, absolutely nothin.

Computer shows 5 of Spades
Player shows 8 of Diamonds
Player wins!
Do you want to "Play Again" or "Quit"?
> Play Again

Computer shows Jack of Hearts
Players shows Queen of Hearts
Player wins!
Do you want to "Play Again" or "Quit"?
> Play Again

Computer shows Ace of Diamonds
Player shows Ace of Hearts
War!!!!!
Computer deals 1, 2, 3...
Player deals 1, 2, 3...
Computer shows 7 of Clubs
Player shows 3 of Hearts
Computer wins!
Do you want to "Play Again" or "Quit"?
> Quit

Computer has 29 cards
Player has 23 cards
Computer wins!!

One issue you may have pondered ... what happens if you play many rounds and the deck runs out of cards? Well, when the player or computer wins a hand we need to insert the cards into the vector. Think about which end of the vector we are dealing from. Where should we then insert cards to correspond to the bottom of the deck?

Also note that you now have the starting point to create any card based game (blackjack, poker, go fish, etc.). Hmmm ... could be useful for your final project?


Functional Requirements



  • Do not use global variables! If you are using a global variable in multiple functions, then you should be passing that variable into the function. If you use global variables, you will lose points so get out of the global variable shorcut habit.
  • You must declare a Card struct and use Card variables throughout your program and functions.
  • The user must be inputting strings and you must be comparing string values.
  • You must use vectors (not arrays) for this assignment.
  • All functions must be placed in a separate file.
  • Despite the psuedocode stating "goto step X", your code must not include a literal goto command. You will lose points for using goto. You must structure your loops and conditionals properly to receive full credit.
  • Do not use the algorithm library for any vector functionality (sorting, shuffling, etc.)


Hints



  • You will need to use loops (perhaps while and/or do-while), branching, and functions to complete this assignment.
  • Write out pseudocode before starting.
  • Dealing a card is nothing more than returning the back of our deck vector and removing it from the vector.
  • While it is possible to copy and paste a few lines of code (over and over) to generate all 52 cards, it will become quite tedious and you won't enjoy making sure all 52 cards are represented. You will find it much easier to use two nested for loops to accomplish this task.
  • Write out pseudocode before starting.
  • This function will probably prove helpful to you:
    /*
    * Converts a number between 0 and 3 to a corresponding
    * playing card suit
    */
    string convertIntToSuit( int suitNum ) {
    	switch( suitNum ) {
    	case 0:
    			return "Hearts";
    	case 1:
    			return "Clubs";
    	case 2:
    			return "Diamonds";
    	case 3:
    	default:
    			return "Spades";
    	}
    }
  • Write out pseudocode before starting.
  • Do not wait until the day before this is due to begin.


Grading Rubric


Your submission will be graded according to the following rubric.

Points Requirement Description
2 All code submitted properly
4 Labs completed
12 Game is properly playable
6 Functional requirements met above
2 (1) Comments used (2) Coding style followed (3) Appropriate variable names, constants, and data types used (4) Instructions followed
26 Total Points


Submission


Always, always, ALWAYS update the header comments at the top of your main.cpp file. And if you ever get stuck, remember that there is LOTS of help available.

From your Cloud9 workspace, right click on the Set5 folder in your workspace tree. Select "Download" from the pop-up menu. This will download a file called Set5.zip to your computer. It contains all the files of your Set5 folder (therefore L5A, L5B, A5).

Now in Canvas, go to Assignments > Set5. Upload your Set5.zip file you just downloaded. And voila! Easy peasy.

In summary, follow these specific steps:
  • right click on the Set5 folder in Cloud9.
  • select "Download" from the pop-up menu.
  • upload the Set5.zip file to Canvas Set5.
  • after you submit, download the file and double check it contains all that you think it contains!


This assignment is due by Thursday, March 15, 2018 11:59 PM.
Last Updated: 03/01/18 21:52


Valid HTML 4.01 Strict Valid CSS! Level Triple-A conformance, W3C WAI Web Content Accessibility Guidelines 2.0