Initial Commit Project 2
This commit is contained in:
parent
282bb86783
commit
322332fc3d
69
Projekt_2/hangman.cpp
Normal file
69
Projekt_2/hangman.cpp
Normal file
@ -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
|
||||
<< "<cx:html>\n"
|
||||
// << "<p>Attempts left: " << maxWrongGuesses - wrongGuesses << "</p>\n"
|
||||
<< "<img alt='' src='https://lec.inf.ethz.ch/mavt/et/2019/img/hangman/hang_" << wrongGuesses + 1 << ".gif'/>\n"
|
||||
<< "</cx:html>" << 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);
|
||||
}
|
97
Projekt_2/hangman.h
Normal file
97
Projekt_2/hangman.h
Normal file
@ -0,0 +1,97 @@
|
||||
#ifndef HANGMAN_H
|
||||
#define HANGMAN_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
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
|
49
Projekt_2/main.cpp
Normal file
49
Projekt_2/main.cpp
Normal file
@ -0,0 +1,49 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#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;
|
||||
}
|
20
Projekt_2/termcolor.h
Normal file
20
Projekt_2/termcolor.h
Normal file
@ -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
|
100
Projekt_2/words.csv
Normal file
100
Projekt_2/words.csv
Normal file
@ -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",
|
|
Loading…
x
Reference in New Issue
Block a user