Author: Logie Language: cpp
Description: Hangman Game Timestamp: 2012-10-22 09:34:48 -0400
This paste is: private
View raw paste Reply
  1. /* Hangman Game
  2.  *
  3.  * Author : Liam Logue
  4.  * Date Started   : 10/10/2012
  5.  * Date Modified  : 11/10/2012
  6.  * Date Completed : 11/10/2012
  7.  */
  8.  
  9. //Includes
  10. #include <vector>
  11. #include <algorithm>
  12. #include <iostream>
  13. #include <cstdlib>
  14. #include <ctype.h>
  15. #include <cstdio>
  16. #include <string>
  17. #include <ctime>
  18.  
  19. //Standard namespace
  20. using namespace std;
  21.  
  22. //Method declaration
  23. void Win();
  24. void Lose();
  25. void ResetVariables();
  26. void PlayGameNormal();
  27. void PlayGameMaster();
  28. void DrawHangman(int phase);
  29.  
  30. //Constants
  31. const int ARRAY_SIZE = 10;
  32.  
  33. //Variables
  34. string  theWord;
  35. string  theHint;
  36. string  guessedWord;
  37. string  guessedLetters;
  38. char    guess;
  39. char    playAgain;
  40. int             letterUsedBefore;
  41. int             gameType;
  42. int             randNumber;
  43. int             foundLetter;
  44. int             wrongGuesses;
  45.  
  46. //Dictionary and hint array
  47. string dictionary[ARRAY_SIZE] = {"for", "bool", "while", "cout", "switch", "if", "case", "endl", "return", "char"};
  48. string hints[ARRAY_SIZE] = {"LOOP : This loop takes 3 arguments.", "TYPE : True or false?.", "LOOP : This loop", "STREAM : Used to print text to the console window.", "STATEMENT : An alternative to the 'if' statement.", "STATEMENT : The most basic of statements.", "RESULT : Result from a 'switch' statement.", "STREAM : How to end a line after using 'cout'.", "FUNCTION : When a function requires a value to be given back, you will use this word.", "TYPE : Holds a letter that also has a numeric value."};
  49.  
  50. //Main
  51. int main() {
  52.         //Clear screen
  53.         system("CLS");
  54.  
  55.         //Reset all variables (For when playing again)
  56.         ResetVariables();
  57.  
  58.         //Set tiel
  59.         system("TITLE Hangman Game");
  60.  
  61.         //Font color
  62.         system("COLOR 0B");
  63.  
  64.         //Welcome message
  65.         cout << "/**************************************************" << endl;
  66.         cout << "* COM316 - Week 3 - Lab Task 1                    *" << endl;
  67.         cout << "*                                                 *" << endl;
  68.         cout << "* Welcome to Hangman!                             *" << endl;
  69.         cout << "* In this game a word is randomly choosen from a  *" << endl;
  70.         cout << "* set dictionary and YOU must guess the word      *" << endl;
  71.         cout << "* before the poor stickman faces his death. It    *" << endl;
  72.         cout << "* actually seems pretty cruel.. I hope you're     *" << endl;
  73.         cout << "* good at guessing words! He has a wife and kids. *" << endl;
  74.         cout << "*                                                 *" << endl;
  75.         cout << "* GAME MODES                                      *" << endl;
  76.         cout << "* 1) Normal Mode (hint displayed).                *" << endl;
  77.         cout << "* 2) Master Mode (no hint displayed).             *" << endl;
  78.         cout << "*                                                 *" << endl;
  79.         cout << "**************************************************/" << endl << endl;
  80.  
  81.         //Get gametype
  82.         cout << "- Which game type would you like to play? (1/2)." << endl;
  83.         cin  >> gameType;
  84.  
  85.         //Determine and launch game type
  86.         switch(gameType) {
  87.                 //Normal mode
  88.                 case 1:
  89.                         PlayGameNormal();
  90.                         break;
  91.  
  92.                 //Master mode
  93.                 case 2:
  94.                         PlayGameMaster();
  95.                         break;
  96.  
  97.                 //Default
  98.                 default:
  99.                         main();
  100.         }
  101.  
  102.         //Final return
  103.         return 0;
  104. }
  105.  
  106. //Normal game (with hints)
  107. void PlayGameNormal() {
  108.         //Welcome message
  109.         cout << endl;
  110.         cout << "/**************************************************" << endl;
  111.         cout << "* GAME TYPE - Normal (with hints).                *" << endl;
  112.         cout << "**************************************************/" << endl << endl;
  113.  
  114.         //Generate a random number within the array size
  115.         srand((unsigned)time(0));
  116.         randNumber = (rand()%10);
  117.  
  118.         //Grab the word and the hint
  119.         theWord = dictionary[randNumber];
  120.         theHint = hints[randNumber];
  121.  
  122.         //Setup theWordMasked & guessedWord
  123.         string theWordMasked(theWord.length(), '*');
  124.         guessedWord = theWordMasked;
  125.  
  126.         //Output the masked word
  127.         cout << "- MASKED WORD" << endl;
  128.         cout << theWordMasked << " (Length : " << theWordMasked.length() << ")" << endl << endl;
  129.  
  130.         //Output the hint
  131.         cout << "- HINT" << endl;
  132.         cout << theHint << endl << endl;
  133.  
  134.         //While loop for the current word
  135.         while(1) {
  136.                 //Word guessed?
  137.                 if(guessedWord == theWord) {
  138.                         //Game over, you win!
  139.                         Win();
  140.                         break;
  141.                 }
  142.                 else if(wrongGuesses > 5) {
  143.                         Lose();
  144.                         break;
  145.                 }
  146.                 else {
  147.                         //Take a guess
  148.                         cout << "/**************************************************" << endl;
  149.                         cout << "* Guess a letter                                  *" << endl;
  150.                         cout << "**************************************************/" << endl;
  151.                         cin  >> guess;
  152.                         cout << endl;
  153.  
  154.                         //Is is a character?
  155.                         if (isalpha(guess)) {
  156.                                 //Letter used before?
  157.                                 letterUsedBefore = guessedLetters.find(guess);
  158.  
  159.                                 if(letterUsedBefore != string::npos) {
  160.                                         //Letter has been used before
  161.                                         cout << "- Letter used before!" << endl << endl;
  162.                                 }
  163.                                 else {
  164.                                         //Add guess to guessedLetters string
  165.                                         guessedLetters += guess;
  166.  
  167.                                         //Loop all characters in theWord for matches
  168.                                         for (size_t i=0; i<theWord.size(); i++) {
  169.                                                 if (guess == theWord[i]) {
  170.                                                         //Found it
  171.                                                         cout << "- Letter Found!" << endl;
  172.                                                         guessedWord[i] = guess;
  173.                                                         cout << "- Word so far : " << guessedWord << endl;
  174.                                                         cout << "- Letters guessed : " << guessedLetters << endl << endl;
  175.                                                 }
  176.                                         }
  177.  
  178.                                         //Check for found letter (to use in a negative result)
  179.                                         foundLetter = theWord.find(guess);
  180.  
  181.                                         //Test for a NEGATIVE result
  182.                                         if(foundLetter == string::npos) {
  183.                                                 //Letter not found, increment wrongGuesses
  184.                                                 wrongGuesses++;
  185.                                                 cout << "- Letter not found :(." << endl << endl;
  186.                                                 DrawHangman(wrongGuesses);
  187.                                                 cout << 6-wrongGuesses << " guesses left!" << endl;
  188.                                                 cout << "- Letters guessed : " << guessedLetters << endl << endl;
  189.                                         }
  190.                                 }
  191.                         }
  192.                         else {
  193.                                 //Not an alphabetical character
  194.                                 cout << "ERROR - Guess must be an alphabetical character" << endl << endl;
  195.                         }
  196.                 }
  197.         }
  198.  
  199.         //Pause for input
  200.         system("PAUSE");
  201. }
  202.  
  203. //Master game (without hints)
  204. void PlayGameMaster() {
  205.         //Welcome message
  206.         cout << endl;
  207.         cout << "/**************************************************" << endl;
  208.         cout << "* GAME TYPE - Master (with NO hints).             *" << endl;
  209.         cout << "**************************************************/" << endl << endl;
  210.  
  211.         //Generate a random number within the array size
  212.         srand((unsigned)time(0));
  213.         randNumber = (rand()%10);
  214.  
  215.         //Grab the word and the hint
  216.         theWord = dictionary[randNumber];
  217.  
  218.         //Setup theWordMasked & guessedWord
  219.         string theWordMasked(theWord.length(), '*');
  220.         guessedWord = theWordMasked;
  221.  
  222.         //Output the masked word
  223.         cout << "- MASKED WORD" << endl;
  224.         cout << theWordMasked << " (Length : " << theWordMasked.length() << ")" << endl << endl;
  225.  
  226.         //While loop for the current word
  227.         while(1) {
  228.                 //Word guessed?
  229.                 if(guessedWord == theWord) {
  230.                         //Game over, you win!
  231.                         Win();
  232.                         break;
  233.                 }
  234.                 else if(wrongGuesses > 5) {
  235.                         Lose();
  236.                         break;
  237.                 }
  238.                 else {
  239.                         //Take a guess
  240.                         cout << "/**************************************************" << endl;
  241.                         cout << "* Guess a letter                                  *" << endl;
  242.                         cout << "**************************************************/" << endl;
  243.                         cin  >> guess;
  244.                         cout << endl;
  245.  
  246.                         //Is is a character?
  247.                         if (isalpha(guess)) {
  248.                                 //Letter used before?
  249.                                 letterUsedBefore = guessedLetters.find(guess);
  250.  
  251.                                 if(letterUsedBefore != string::npos) {
  252.                                         //Letter has been used before
  253.                                         cout << "- Letter used before!" << endl << endl;
  254.                                 }
  255.                                 else {
  256.                                         //Add guess to guessedLetters string
  257.                                         guessedLetters += guess;
  258.  
  259.                                         //Loop all characters in theWord for matches
  260.                                         for (size_t i=0; i<theWord.size(); i++) {
  261.                                                 if (guess == theWord[i]) {
  262.                                                         //Found it
  263.                                                         cout << "- Letter Found!" << endl;
  264.                                                         guessedWord[i] = guess;
  265.                                                         cout << "- Word so far : " << guessedWord << endl;
  266.                                                         cout << "- Letters guessed : " << guessedLetters << endl << endl;
  267.                                                 }
  268.                                         }
  269.  
  270.                                         //Check for found letter (to use in a negative result)
  271.                                         foundLetter = theWord.find(guess);
  272.  
  273.                                         //Test for a NEGATIVE result
  274.                                         if(foundLetter == string::npos) {
  275.                                                 //Letter not found, increment wrongGuesses
  276.                                                 wrongGuesses++;
  277.                                                 cout << "- Letter not found :(." << endl << endl;
  278.                                                 DrawHangman(wrongGuesses);
  279.                                                 cout << 6-wrongGuesses << " guesses left!" << endl;
  280.                                                 cout << "- Letters guessed : " << guessedLetters << endl << endl;
  281.                                         }
  282.                                 }
  283.                         }
  284.                         else {
  285.                                 //Not an alphabetical character
  286.                                 cout << "ERROR - Guess must be an alphabetical character" << endl << endl;
  287.                         }
  288.                 }
  289.         }
  290.  
  291.         //Pause for input
  292.         system("PAUSE");
  293. }
  294.  
  295. //Reset variables
  296. void ResetVariables() {
  297.         //Reset all variables
  298.         theWord = "";
  299.         theHint = "";
  300.         guessedWord = "";
  301.         guessedLetters = "";
  302.         guess = NULL;
  303.         playAgain = NULL;
  304.         letterUsedBefore = 0;
  305.         gameType = 0;
  306.         randNumber = 0;
  307.         foundLetter = 0;
  308.         wrongGuesses = 0;
  309. }
  310.  
  311. //Draw hangman with specific phase
  312. void DrawHangman(int phase) {
  313.         //Draw a specific hangman based on error count
  314.         switch(phase) {
  315.                 //First wrong guess
  316.                 case 1:
  317.                         cout << endl;
  318.                         cout << " ________ " << endl;
  319.                         cout << "|        |" << endl;
  320.                         cout << "|        |" << endl;
  321.                         cout << "|        O" << endl;
  322.                         cout << "|         " << endl;
  323.                         cout << "|         " << endl;
  324.                         cout << "|         " << endl;
  325.                         cout << "|" << endl;
  326.                         cout << "|___________" << endl << endl;
  327.                 break;
  328.  
  329.                 //Second wrong guess
  330.                 case 2:
  331.                         cout << endl;
  332.                         cout << " ________ " << endl;
  333.                         cout << "|        |" << endl;
  334.                         cout << "|        |" << endl;
  335.                         cout << "|        O" << endl;
  336.                         cout << "|        |" << endl;
  337.                         cout << "|         " << endl;
  338.                         cout << "|         " << endl;
  339.                         cout << "|" << endl;
  340.                         cout << "|___________" << endl << endl;
  341.                 break;
  342.  
  343.                 //Third wrong guess
  344.                 case 3:
  345.                         cout << endl;
  346.                         cout << " ________ " << endl;
  347.                         cout << "|        |" << endl;
  348.                         cout << "|        |" << endl;
  349.                         cout << "|        O" << endl;
  350.                         cout << "|       /|" << endl;
  351.                         cout << "|         " << endl;
  352.                         cout << "|         " << endl;
  353.                         cout << "|" << endl;
  354.                         cout << "|___________" << endl << endl;
  355.                 break;
  356.  
  357.                 //Fourth wrong guess
  358.                 case 4:
  359.                         cout << endl;
  360.                         cout << " ________ " << endl;
  361.                         cout << "|        |" << endl;
  362.                         cout << "|        |" << endl;
  363.                         cout << "|        O" << endl;
  364.                         cout << "|       /|\\" << endl;
  365.                         cout << "|         " << endl;
  366.                         cout << "|         " << endl;
  367.                         cout << "|" << endl;
  368.                         cout << "|___________" << endl << endl;
  369.                 break;
  370.  
  371.                 //Fifth wrong guess
  372.                 case 5:
  373.                         cout << endl;
  374.                         cout << " ________ " << endl;
  375.                         cout << "|        |" << endl;
  376.                         cout << "|        |" << endl;
  377.                         cout << "|        O" << endl;
  378.                         cout << "|       /|\\" << endl;
  379.                         cout << "|       / " << endl;
  380.                         cout << "|         " << endl;
  381.                         cout << "|" << endl;
  382.                         cout << "|___________" << endl << endl;
  383.                 break;
  384.  
  385.                 //Sixth and final wrong guess
  386.                 case 6:
  387.                         cout << endl;
  388.                         cout << " ________ " << endl;
  389.                         cout << "|        |" << endl;
  390.                         cout << "|        |" << endl;
  391.                         cout << "|        O" << endl;
  392.                         cout << "|       /|\\" << endl;
  393.                         cout << "|       / \\" << endl;
  394.                         cout << "|         " << endl;
  395.                         cout << "|" << endl;
  396.                         cout << "|___________" << endl << endl;
  397.                 break;
  398.         }
  399. }
  400.  
  401. //Winning!
  402. void Win() {
  403.         //Print out winners message!
  404.         cout << "/**************************************************" << endl;
  405.         cout << "* CONGRATULATIONS :D                              *" << endl;
  406.         cout << "*                                                 *" << endl;
  407.         cout << "* You won!                                        *" << endl;
  408.         cout << "**************************************************/" << endl;
  409.         cout << "- STATS" << endl;
  410.         cout << "Wrong Guesses - " << wrongGuesses << endl;
  411.         cout << "Guessed Word - " << theWord << endl << endl;
  412.  
  413.         //Play again?
  414.         cout << "- Play again? (y/n)" << endl;
  415.         cin  >> playAgain;
  416.  
  417.         //Check answer
  418.         if (playAgain == 'y' || playAgain == 'Y') {
  419.                 //Play again
  420.                 main();
  421.         }
  422.         else if (playAgain == 'n' || playAgain == 'N') {
  423.                 //Exit
  424.                 exit(1);
  425.         }
  426.         else {
  427.                 //Error - Relaunch main
  428.                 cout << "- ERROR : Illegal character entered. Launching the game again" << endl;
  429.                 main();
  430.         }
  431. }
  432.  
  433. //Lost :(!
  434. void Lose() {
  435.         //Print out the message for losing
  436.         cout << "/**************************************************" << endl;
  437.         cout << "* Oh no :(                                        *" << endl;
  438.         cout << "*                                                 *" << endl;
  439.         cout << "* You lost!                                       *" << endl;
  440.         cout << "**************************************************/" << endl;
  441.         cout << "- STATS" << endl;
  442.         cout << "Wrong Guesses - " << wrongGuesses << endl;
  443.         cout << "Guessed Word - " << theWord << endl << endl;
  444.  
  445.         //Play again?
  446.         cout << "- Play again? (y/n)" << endl;
  447.         cin  >> playAgain;
  448.  
  449.         //Check answer
  450.         if (playAgain == 'y' || playAgain == 'Y') {
  451.                 //Play again
  452.                 main();
  453.         }
  454.         else if (playAgain == 'n' || playAgain == 'N') {
  455.                 //Exit
  456.                 exit(1);
  457.         }
  458.         else {
  459.                 //Error - Relaunch main
  460.                 cout << "- ERROR : Illegal character entered. Launching the game again" << endl;
  461.                 main();
  462.         }
  463. }
  464.  
View raw paste Reply