Browse Source
Merge branch 'Saba' into 'main'
Merge branch 'Saba' into 'main'
Hangman added to main See merge request pmuw_projekt/pmuw_projekt_notebinder!36remotes/origin/Saba
fdai8032
11 months ago
12 changed files with 405 additions and 3 deletions
-
89src/main/c/Hangman/drawHangman.c
-
6src/main/c/Hangman/drawHangman.h
-
44src/main/c/Hangman/initializeHangman.c
-
6src/main/c/Hangman/initializeHangman.h
-
89src/main/c/Hangman/playHangman.c
-
23src/main/c/Hangman/playHangman.h
-
33src/main/c/Hangman/word_selector.c
-
12src/main/c/Hangman/word_selector.h
-
6src/main/c/main.c
-
40test/Hangman/test_drawHangman.c
-
4test/Hangman/test_drawHangman.h
-
56test/Hangman/test_playHangman.c
@ -0,0 +1,89 @@ |
|||||
|
#include "drawHangman.h" |
||||
|
|
||||
|
void drawHangman(int incorrectGuesses) { |
||||
|
|
||||
|
if (incorrectGuesses == 0) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses == 1) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses == 2) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" O |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses == 3) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" O |\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses == 4) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" O |\n"); |
||||
|
printf(" /| |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses == 5) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" O |\n"); |
||||
|
printf(" /|\\ |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses == 6) { |
||||
|
printf(" +---+\n"); |
||||
|
printf(" | |\n"); |
||||
|
printf(" O |\n"); |
||||
|
printf(" /|\\ |\n"); |
||||
|
printf(" / \\ |\n"); |
||||
|
printf(" |\n"); |
||||
|
printf("=========\n"); |
||||
|
} |
||||
|
|
||||
|
if (incorrectGuesses >= 6) { |
||||
|
printf("\n" |
||||
|
" ___ ___ _ \n" |
||||
|
" / __|__ _ _ __ ___ / _ \\__ _____ _ _| |\n" |
||||
|
" | (_ / _` | ' \\/ -_) | (_) \\ V / -_) '_|_|\n" |
||||
|
" \\___\\__,_|_|_|_\\___| \\___/ \\_/\\___|_| (_)\n" |
||||
|
" \n"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void currentState(char *currentGuess, int mistakes) { |
||||
|
printf("Current Word: %s \n", currentGuess); |
||||
|
printf("Mistakes Made: %d/6 \n", mistakes); |
||||
|
drawHangman(mistakes); |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
#ifndef PMUW_PROJEKT_NOTEBINDER_DRAWHANGMAN_H |
||||
|
#define PMUW_PROJEKT_NOTEBINDER_DRAWHANGMAN_H |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
|
||||
|
#endif //PMUW_PROJEKT_NOTEBINDER_DRAWHANGMAN_H |
@ -0,0 +1,44 @@ |
|||||
|
#include "initializeHangman.h" |
||||
|
void initializeHangman(char *wordToGuess, char *currentGuess) { |
||||
|
int wordLength = strlen(wordToGuess); |
||||
|
|
||||
|
for (int i = 0; i < wordLength; ++i) { |
||||
|
if (isalpha(wordToGuess[i])) { |
||||
|
currentGuess[i] = '_'; |
||||
|
} else { |
||||
|
currentGuess[i] = wordToGuess[i]; |
||||
|
} |
||||
|
} |
||||
|
currentGuess[wordLength] = '\0'; |
||||
|
} |
||||
|
|
||||
|
void printRules(){ |
||||
|
printf("Welcome to hangman game!\n"); |
||||
|
printf("How to play: \n"); |
||||
|
printf(" - A word be randomly selected from the list of words.\n"); |
||||
|
printf(" - A series of dashes will be displayed, each representing a letter in the secret word.\n"); |
||||
|
printf(" - You are allowed a maximum of 6 mistakes.\n"); |
||||
|
printf(" - You will start guessing letters one at a time.\n"); |
||||
|
printf(" - Each guess should be a single letter of the alphabet, either uppercase or lowercase.\n"); |
||||
|
printf(" - After each guess, the computer will check if the letter you guessed is in the secret word.\n"); |
||||
|
printf(" - If the guessed letter is in the word, the computer will reveal all occurrences of that letter in the word.\n"); |
||||
|
printf(" - If the guessed letter is not in the word, the computer will count the incorrect guesses.\n"); |
||||
|
printf(" - Wrong guesses are represented by drawing parts of a hangman figure.\n"); |
||||
|
printf(" - You are allowed a maximum of 6 mistakes.\n"); |
||||
|
} |
||||
|
|
||||
|
void displayRules(){ |
||||
|
int readRules; |
||||
|
printf("Do you know how to play? (type number 1 or 2): \n"); |
||||
|
printf("1. YES \n"); |
||||
|
printf("2. NO \n"); |
||||
|
scanf("%d", &readRules); |
||||
|
if(readRules == 2){ |
||||
|
printRules(); |
||||
|
} else if (readRules == 1) { |
||||
|
printf("Let's get started!\n"); |
||||
|
} else { |
||||
|
printf("Please enter either 1 or 2 to continue: \n"); |
||||
|
displayRules(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
#ifndef PMUW_PROJEKT_NOTEBINDER_INITIALIZEHANGMAN_H |
||||
|
#define PMUW_PROJEKT_NOTEBINDER_INITIALIZEHANGMAN_H |
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <ctype.h> |
||||
|
#endif //PMUW_PROJEKT_NOTEBINDER_INITIALIZEHANGMAN_H |
@ -0,0 +1,89 @@ |
|||||
|
#include "playHangman.h" |
||||
|
|
||||
|
// Converts the letter to lower case |
||||
|
char toLower(char ch) { |
||||
|
// Convert uppercase letter to lowercase manually |
||||
|
if (ch >= 'A' && ch <= 'Z') { |
||||
|
return ch + ('a' - 'A'); |
||||
|
} |
||||
|
return ch; |
||||
|
} |
||||
|
|
||||
|
void playHangman(char *wordToGuess) { |
||||
|
int mistakes = 0; |
||||
|
char guessedLetters[30] = ""; //Guessed letters |
||||
|
char currentGuess[50]; //Current state of the guessed word |
||||
|
|
||||
|
displayRules(); |
||||
|
|
||||
|
// Initialize the current guess and print the rules |
||||
|
initializeHangman(wordToGuess, currentGuess); |
||||
|
currentState(currentGuess, mistakes); |
||||
|
|
||||
|
while (mistakes < MAX_MISTAKES) { |
||||
|
|
||||
|
// Get a letter from the user |
||||
|
char input[20]; |
||||
|
printf("Enter your guess: \n"); |
||||
|
scanf("%s", input); |
||||
|
|
||||
|
if(strlen(input) > 1) { |
||||
|
printf("Invalid input. Please enter a single letter.\n"); |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
char guess = input[0]; |
||||
|
if (!isalpha(guess)) { |
||||
|
printf("Please enter a valid alphabet.\n"); |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
// Convert uppercase letter to lowercase |
||||
|
guess = toLower(guess); |
||||
|
|
||||
|
// Check if the letter has already been guessed by the player |
||||
|
if (strchr(guessedLetters, guess) != NULL) { |
||||
|
printf("You already guessed that letter. Try another letter.\n"); |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
// Add the guessed letter to the list |
||||
|
guessedLetters[strlen(guessedLetters)] = guess; |
||||
|
|
||||
|
// Check if the guessed letter is in the word |
||||
|
int found = 0; |
||||
|
for (int i = 0; i < strlen(wordToGuess); ++i) { |
||||
|
if (wordToGuess[i] == guess) { |
||||
|
currentGuess[i] = guess; |
||||
|
found = 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Update mistakes (if the guess is wrong) |
||||
|
if (!found) { |
||||
|
mistakes++; |
||||
|
} |
||||
|
|
||||
|
// Win: Check if the player guessed all the letters |
||||
|
if (strcmp(currentGuess, wordToGuess) == 0) { |
||||
|
currentState(currentGuess, mistakes); |
||||
|
printf("Bravo! You guessed the word: %s \n", wordToGuess); |
||||
|
printf("\n" |
||||
|
" __ __ __ __ _ \n" |
||||
|
" \\ \\ / /__ _ _ \\ \\ / /__ _ _ | |\n" |
||||
|
" \\ V / _ \\ || | \\ \\/\\/ / _ \\ ' \\|_|\n" |
||||
|
" |_|\\___/\\_,_| \\_/\\_/\\___/_||_(_)\n" |
||||
|
" \n"); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
// Lose: Print the answer + game over |
||||
|
if (mistakes == MAX_MISTAKES) { |
||||
|
currentState(currentGuess, mistakes); |
||||
|
printf("Oops! You have no more guesses :( \n The answer was: %s \n", wordToGuess); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
currentState(currentGuess, mistakes); |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
#ifndef PMUW_PROJEKT_NOTEBINDER_PLAYHANGMAN_H |
||||
|
#define PMUW_PROJEKT_NOTEBINDER_PLAYHANGMAN_H |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
|
||||
|
// Include declarations from corresponding header files |
||||
|
#include "initializeHangman.h" |
||||
|
#include "drawHangman.h" |
||||
|
#include "word_selector.h" |
||||
|
|
||||
|
// Include function implementations directly from .c files |
||||
|
|
||||
|
void playHangman(char *wordToGuess); |
||||
|
void initializeHangman(char *wordToGuess, char *currentGuess); |
||||
|
void printRules(); |
||||
|
void drawHangman(int incorrectGuesses); |
||||
|
void currentState(char *currentGuess, int mistakes); |
||||
|
const char* selectRandomWord(); |
||||
|
const char wordsList[NUM_WORDS][MAX_WORD_LENGTH + 1]; |
||||
|
void displayRules(); |
||||
|
#define MAX_MISTAKES 6 |
||||
|
|
||||
|
#endif // PMUW_PROJEKT_NOTEBINDER_PLAYHANGMAN_H |
@ -0,0 +1,33 @@ |
|||||
|
#include "word_selector.h" |
||||
|
|
||||
|
const char wordsList[NUM_WORDS][MAX_WORD_LENGTH + 1] = { |
||||
|
"skill", |
||||
|
"world", |
||||
|
"difference", |
||||
|
"celebration", |
||||
|
"association", |
||||
|
"customer", |
||||
|
"mood", |
||||
|
"agreement", |
||||
|
"audience", |
||||
|
"professor", |
||||
|
"year", |
||||
|
"dealer", |
||||
|
"patience", |
||||
|
"table tennis", |
||||
|
"pollution", |
||||
|
"awareness", |
||||
|
"problem", |
||||
|
"vehicle", |
||||
|
"death", |
||||
|
"cousin" |
||||
|
}; |
||||
|
|
||||
|
const char* selectRandomWord() { |
||||
|
|
||||
|
// pick a random number and assign it to index of wordsList array |
||||
|
srand((unsigned int)time(NULL)); |
||||
|
int randomIndex = rand() % NUM_WORDS; |
||||
|
|
||||
|
return wordsList[randomIndex]; |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
#ifndef PMUW_PROJEKT_NOTEBINDER_WORD_SELECTOR_H |
||||
|
#define PMUW_PROJEKT_NOTEBINDER_WORD_SELECTOR_H |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <time.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#define MAX_WORD_LENGTH 20 |
||||
|
#define NUM_WORDS 20 |
||||
|
|
||||
|
#endif //PMUW_PROJEKT_NOTEBINDER_WORD_SELECTOR_H |
@ -0,0 +1,40 @@ |
|||||
|
#include <stdio.h> |
||||
|
#include <assert.h> |
||||
|
#include "drawHangman.h" |
||||
|
#include "playHangman.h" |
||||
|
|
||||
|
void test_drawHangman() { |
||||
|
// Test each case of incorrectGuesses |
||||
|
printf("Testing drawHangman(0):\n"); |
||||
|
drawHangman(0); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(1):\n"); |
||||
|
drawHangman(1); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(2):\n"); |
||||
|
drawHangman(2); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(3):\n"); |
||||
|
drawHangman(3); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(4):\n"); |
||||
|
drawHangman(4); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(5):\n"); |
||||
|
drawHangman(5); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(6):\n"); |
||||
|
drawHangman(6); |
||||
|
printf("\n"); |
||||
|
|
||||
|
printf("Testing drawHangman(7):\n"); |
||||
|
drawHangman(7); |
||||
|
printf("\n"); |
||||
|
|
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
#ifndef PMUW_PROJEKT_NOTEBINDER_TEST_DRAWHANGMAN_H |
||||
|
#define PMUW_PROJEKT_NOTEBINDER_TEST_DRAWHANGMAN_H |
||||
|
#include "drawHangman.c" |
||||
|
#endif //PMUW_PROJEKT_NOTEBINDER_TEST_DRAWHANGMAN_H |
@ -0,0 +1,56 @@ |
|||||
|
#include <stdio.h> |
||||
|
#include "playHangman.c" |
||||
|
#include <assert.h> |
||||
|
|
||||
|
void test_displayRules() { |
||||
|
// Simulate user input: 1, 2, and an invalid input |
||||
|
printf("Test Case 1: User enters '1' (YES)\n"); |
||||
|
printf("Expected Output: \"Let's get started!\"\n"); |
||||
|
printf("Actual Output: "); |
||||
|
displayRules(); // Call displayRules() with input 1 |
||||
|
|
||||
|
printf("\nTest Case 2: User enters '2' (NO)\n"); |
||||
|
printf("Expected Output: Output of printRules()\n"); |
||||
|
printf("Actual Output: "); |
||||
|
displayRules(); // Call displayRules() with input 2 |
||||
|
|
||||
|
printf("\nTest Case 3: User enters an invalid input\n"); |
||||
|
printf("Expected Output: \"Please enter either 1 or 2 to continue:\"\n"); |
||||
|
printf("Actual Output: "); |
||||
|
displayRules(); // Call displayRules() with invalid input |
||||
|
} |
||||
|
|
||||
|
void test_toLower() { |
||||
|
printf("Test Case 1: Lowercase letter 'a'\n"); |
||||
|
printf("Expected Output: 'a'\n"); |
||||
|
char result = toLower('a'); |
||||
|
printf("Actual Output: '%c'\n", result); |
||||
|
assert(result == 'a'); |
||||
|
|
||||
|
printf("\nTest Case 2: Uppercase letter 'B'\n"); |
||||
|
printf("Expected Output: 'b'\n"); |
||||
|
result = toLower('B'); |
||||
|
printf("Actual Output: '%c'\n", result); |
||||
|
assert(result == 'b'); |
||||
|
|
||||
|
printf("\nTest Case 3: Non-alphabetic character '#'\n"); |
||||
|
printf("Expected Output: '#'\n"); |
||||
|
result = toLower('?'); |
||||
|
printf("Actual Output: '%c'\n", result); |
||||
|
assert(result == '?'); |
||||
|
} |
||||
|
|
||||
|
void test_initializeHangman() { |
||||
|
// Test case 1: Word with alphabets only |
||||
|
char wordToGuess1[] = "hangman"; |
||||
|
char currentGuess1[8]; // Make sure this size is enough to accommodate the wordToGuess and the null terminator |
||||
|
initializeHangman(wordToGuess1, currentGuess1); |
||||
|
assert(strcmp(currentGuess1, "_______") == 0); |
||||
|
|
||||
|
// Test case 2: Word with spaces (e.g: table tennis) |
||||
|
char wordToGuess2[] = "hello world"; |
||||
|
char currentGuess2[12]; // Make sure this size is enough to accommodate the wordToGuess and the null terminator |
||||
|
initializeHangman(wordToGuess2, currentGuess2); |
||||
|
assert(strcmp(currentGuess2, "_____ _____") == 0); |
||||
|
printf("initializeHangman test passed!\n"); |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue