From 322332fc3d94f5928c1a209229f153201a95a1de Mon Sep 17 00:00:00 2001 From: JirR02 Date: Fri, 27 Sep 2024 14:24:49 +0200 Subject: [PATCH] Initial Commit Project 2 --- Projekt_2/hangman.cpp | 69 +++++++++++++++++++++++++++++ Projekt_2/hangman.h | 97 ++++++++++++++++++++++++++++++++++++++++ Projekt_2/main.cpp | 49 +++++++++++++++++++++ Projekt_2/termcolor.h | 20 +++++++++ Projekt_2/words.csv | 100 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 335 insertions(+) create mode 100644 Projekt_2/hangman.cpp create mode 100644 Projekt_2/hangman.h create mode 100644 Projekt_2/main.cpp create mode 100644 Projekt_2/termcolor.h create mode 100644 Projekt_2/words.csv diff --git a/Projekt_2/hangman.cpp b/Projekt_2/hangman.cpp new file mode 100644 index 0000000..eec1e37 --- /dev/null +++ b/Projekt_2/hangman.cpp @@ -0,0 +1,69 @@ +#include "hangman.h" +#include "termcolor.h" + + +// NOTE: You cannot change this file, and you don't need to understand its +// content in order to solve your task. Feel free to look around, however, +// in case you're interested. + + +const string action = std::getenv("ACTION"); +const string words[] = { + #include "words.csv" + "sentinel" +}; + +string color(string c) { + return action == "run" ? c : ""; +} + +string chooseWord() { + string word; + if (action == "test" || action == "submit") { + std::cin >> word; + } else { + int i = rand() % (sizeof(words)/sizeof(*words) - 1); // don't take the last word (which is 'sentinel') + word = words[i]; + std::cout << "A random (english) word with " << word.length() << " characters has been chosen." << std::endl; + return word; + } + return word; +} + +string createWorkingCopy(string word){ + string result = word; + for (unsigned int i = 0; i < result.length(); ++i) { + result.at(i) = '_'; + } + return result; +} + +void showHangman(int wrongGuesses) { + std::cout + << "\n" +// << "

Attempts left: " << maxWrongGuesses - wrongGuesses << "

\n" + << "\n" + << "
" << std::endl; +} + +void printGameState(int maxWrongGuesses, int wrongGuesses){ + std::cout << color(gray) << "\nAttempts left: " << (maxWrongGuesses - wrongGuesses) << color(reset) << "\n"; +} + +void printWorkingCopy(string workingCopy){ + std::cout << color(blue) << "[ " ; + for (unsigned int i = 0; i < workingCopy.length(); ++i) { + std::cout << workingCopy.at(i) << " "; + } + std::cout << "]\n" << color(reset); +} + +void printYouLost(string word){ + std::cout << "The word was: " << color(white) << word << color(red) << "\nYou lost!\n" << color(reset); +} + +void printYouWon(string word){ + std::cout << "\n"; + printWorkingCopy(word); + std::cout << color(green) << "You won!\n" << color(reset); +} \ No newline at end of file diff --git a/Projekt_2/hangman.h b/Projekt_2/hangman.h new file mode 100644 index 0000000..a1d26cc --- /dev/null +++ b/Projekt_2/hangman.h @@ -0,0 +1,97 @@ +#ifndef HANGMAN_H +#define HANGMAN_H + +#include +#include + +using std::string; + +// NOTE: You cannot change this file. It "only" contains declarations and +// short descriptions of the functionality we provided to you. + + +/** + * This function returns a random english word. Use this to generate a new + * word to guess. It is imperative that you use this function to get a word, + * otherwise, the auto-grader will not work properly when testing or + * submitting your project. + */ +string chooseWord(); + +/** + * This function creates a "working copy" based on a given word. It returns a + * string with the same amount of characters than the word, but all of them + * are initially set to "_" (underscore) + */ +string createWorkingCopy(string word); + +/** + * You may call this function to render a little hangman figure in the HTML view. + * This is completely optional, the tests don't rely on this function being + * called. As argument, the function takes the number of wrong guesses and + * selects the correct hangman picture to show. + */ +void showHangman(int wrongGuesses); + +/** + * This function prints the number of remaining attempts (based on the provided + * number of wrong guesses. Call this method before each attempt. + * + * Example: The call 'printGameState(2)' will output: "Attempts left: 4" + * because MAX_WRONG_GUESSES is 6, and 6 - 2 = 4 + */ +void printGameState(int maxWrongGuesses, int wrongGuesses); + +/** + * This function prints the partly uncovered word (the working copy) in the + * desired format. + * + * Example: If workingCopy is "_xp_rt", a call to printWorkingCopy(workingCopy) + * will print "[ _ x p _ r t ]" - this is the format that is expected by the + * autograder. + */ +void printWorkingCopy(string workingCopy); + +/** + * This function must be called if the game was lost (that is, on the 6th + * wrong guess). + * + * Example: If the correct word was "expert", its outputs + * "The word was: expert + * You lost!" + */ +void printYouLost(string word); + +/** + * This function must be called if the game was won (that is, the word was + * guessed with less than 6 wrong guesses). + * + * Example: If the correct word was "expert", its outputs + * "[ e x p e r t ] + * You won!" + */ +void printYouWon(string word); + + +// THE FOLLOWING FUNCTIONS CAN BE USED INTERACTIVELY TO IMPLEMENT THE INDIVIDUAL +// PARTS, BUT THEY DONT'T WORK DURING SUBMISSION + +/** + * Part 1: Ask the user to enter a character and update parameter 'guess' + */ +void PART1_readCharacter(char& guess); + +/** + * Part 2: Set the guessed character in the working copy. Updates parameter + * 'workingCopy' and sets parameter 'found' to either true or false + */ +void PART2_updateWorkingCopy(string word, char guess, string& workingCopy, bool& found); + +/** + * Part 3: Check if game is finished and update wrongGuesses variable. + * Print the approriate messages in the console. Updates parameters 'done' and + * 'wrongGuesses' + */ +void PART3_updateGameState(string word, string workingCopy, bool found, int maxWrongGuesses, bool& done, int& wrongGuesses); + +#endif \ No newline at end of file diff --git a/Projekt_2/main.cpp b/Projekt_2/main.cpp new file mode 100644 index 0000000..9c95cbb --- /dev/null +++ b/Projekt_2/main.cpp @@ -0,0 +1,49 @@ +#include +#include +#include "hangman.h" + +using std::string; + +int main() { + // Word the player needs to guess (randomly selected) + string word = chooseWord(); + + // Initialise the "uncovered" word that is shown to the player: the uncovered + // word is obtained by replacing each letter from the original word (variable + // word) with an underscore (i.e. _). + string workingCopy = createWorkingCopy(word); + + // This variable indicates whether or not the game is over + bool done = false; + + int wrongGuesses = 0; // Number of wrong guesses + int maxWrongGuesses = 6; // Maximum number of wrong guesses (don't change) + + // Draw the empty gallow + showHangman(0); + + // Game loop (each iteration is a round of the game) + while (!done) { + printGameState(maxWrongGuesses, wrongGuesses); + printWorkingCopy(workingCopy); + + + /** Part 1: input next guess **********************************************/ + char guess = '\0'; + // TODO: replace the following line with your implementation + PART1_readCharacter(guess); + + + /** Part 2: update working copy *******************************************/ + bool found = false; + // TODO: replace the following line with your implementation + PART2_updateWorkingCopy(word, guess, workingCopy, found); + + + /** Part 3: update game state *********************************************/ + // TODO: replace the following line with your implementation + PART3_updateGameState(word, workingCopy, found, maxWrongGuesses, done, wrongGuesses); + } + + return 0; +} diff --git a/Projekt_2/termcolor.h b/Projekt_2/termcolor.h new file mode 100644 index 0000000..e77c713 --- /dev/null +++ b/Projekt_2/termcolor.h @@ -0,0 +1,20 @@ +#ifndef TERMCOLOR_H +#define TERMCOLOR_H + + +// NOTE: You cannot change this file, and you don't need to understand its +// content in order to solve your task. Feel free to look around, however, +// in case you're interested. + + +const auto red = "\033[31;1m"; +const auto green = "\033[32;1m"; +const auto yellow = "\033[33;1m"; +const auto blue = "\033[34;1m"; +const auto magenta = "\033[35;1m"; +const auto cyan = "\033[36;1m"; +const auto gray = "\033[39;2m"; +const auto white = "\033[39;1m"; +const auto reset = "\033[0m"; + +#endif \ No newline at end of file diff --git a/Projekt_2/words.csv b/Projekt_2/words.csv new file mode 100644 index 0000000..99ae514 --- /dev/null +++ b/Projekt_2/words.csv @@ -0,0 +1,100 @@ +"available", +"exaggerate", +"ancestor", +"architect", +"neighborhood", +"curriculum", +"promotion", +"opera", +"frequency", +"excavation", +"guarantee", +"reflection", +"benefit", +"development", +"average", +"ghostwriter", +"unlikely", +"disturbance", +"initiative", +"hospitality", +"mastermind", +"eyebrow", +"consciousness", +"operational", +"vehicle", +"housewife", +"capital", +"execution", +"terrify", +"disagree", +"exclusive", +"equinox", +"essential", +"imperial", +"publicity", +"secretary", +"nationalist", +"attention", +"established", +"magnitude", +"orientation", +"contraction", +"intention", +"seminar", +"forecast", +"manufacturer", +"reception", +"fabricate", +"mosquito", +"cooperative", +"parachute", +"exotic", +"demonstrate", +"production", +"spontaneous", +"minimum", +"abolish", +"holiday", +"formation", +"admission", +"handicap", +"continuous", +"presentation", +"constituency", +"unique", +"violation", +"radical", +"notebook", +"custody", +"dictionary", +"comprehensive", +"dominant", +"requirement", +"opponent", +"business", +"national", +"manufacture", +"nominate", +"liberal", +"continuation", +"galaxy", +"interest", +"ignorant", +"indirect", +"illustrate", +"proportion", +"projection", +"philosophy", +"acceptable", +"aluminium", +"continental", +"potential", +"vegetarian", +"elephant", +"advantage", +"recording", +"agenda", +"electronics", +"engagement", +"lonely", \ No newline at end of file