Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAX_SIZE 30
#define MAXWORDS 1000
#define MAX_ATTEMPTS 5
void initialize_words(char *word, int word_length);
int load_game(char *game_word, char puzzle[][MAX_SIZE]);
void print_game_word(char guessed_word[], int word_length);
char get_user_guess();
int perform_guess(char game_word[], char *guessed_word, int word_length, char guess);
int game_solved(char game_word[], char guessed_word[]);
void read_words(char all_words[][MAX_SIZE], FILE *fin, int n);
int main(void)
{
char puzzle[MAXWORDS][MAX_SIZE];
char filename[MAX_SIZE];
char game_word[MAX_SIZE];
FILE *fin;
int word_length;
char guessed_word[MAX_SIZE];
char user_choice[6];
int chosen_letters[26];
char guess;
int correct_guess;
int i;
int num_words;
int user_attempts = 0;
srand(time(0));
// Ask the user for the input file.
printf("What file stores the puzzle words?\n");
scanf("%s", filename);
fin = fopen(filename, "r");
printf("\n");
// Read in all of the words into the array.
fscanf(fin, "%d", &num_words);
read_words(puzzle, fin, num_words);
fclose(fin);
do
{
printf("Would you like to play hangman (yes/no)?\n"); //Asks the user if they would like to play a game of
scanf("%s", user_choice); //hangman
if (!(strcmp(user_choice, "no") == 0 || strcmp(user_choice, "n") == 0 )) //If the user decides to play, their puzzle is loaded
{ //and printed. The user is than asked for their guess.
printf("Here is your puzzle:\n");
word_length = load_game(game_word, puzzle);
initialize_words(guessed_word, MAX_SIZE);
print_game_word(guessed_word, word_length);
printf("You currently have %d incorrect guesses\n", user_attempts); //Informs the user how man incorrect guesses they
} //have
else
{
printf("Thanks for playing!\n"); //Exits the loop if user does not want to play
system("PAUSE");
return 0;
}
for (i = 0; i < 26; i++) //For loop initializing letters that the user has chosen to zero before each new
{ //game is played
chosen_letters[i] = 0;
}
while (user_attempts != MAX_ATTEMPTS)
{
guess = get_user_guess();
correct_guess = perform_guess(game_word, guessed_word, guess, word_length);
if (guess == 1)
{
printf("Congratulations, you guessed a letter in the puzzle!\n");
}
else if (guess == 0)
{
printf("Sorry, that letter is NOT in the puzzle.\n");
user_attempts++;
}
else if (chosen_letters[i] > 2)
{
printf("Sorry, you guessed that letter already. Now it counts as a miss.\n");
user_attempts++;
chosen_letters[(int)(guess - 'A')]++;
}
else if (user_attempts == MAX_ATTEMPTS)
{
printf("Sorry, you have made 5 incorrect guesses, you lose.\n The correct word was %s.\n", game_word);
}
else if (game_solved(game_word, guessed_word))
{
printf("Congratulation! You got the correct word, %s.\n", game_word);
break;
}
}
} while (strcmp(user_choice, "no") != 0);
system("PAUSE");
return 0;
}
//Initializes all words to zero, indicating no letter has been guessed
void initialize_words(char *word, int word_length)
{
int i;
for (i = 0; i < word_length; i++)
{
word[i] = 0;
}
}
//Loads a random word in text file to be used for playing the game
int load_game(char *game_word, char puzzle[][MAX_SIZE])
{
int num_words;
int underscore_length = 0;
int puzzlenum;
puzzlenum = rand()%num_words; //Picks a random word in the file
strcpy(game_word, puzzle[puzzlenum]); //Copies randomly chosen word in file to "game_word"
underscore_length = strlen(game_word);
return underscore_length; //Returns length of "game_word"
}
//Prints out the word which was chosen from the file
void print_game_word(char guessed_word[], int word_length)
{
int i;
for (i = 0; i < word_length; i++)
{
if (guessed_word[i]==0)
{
printf("_ ");
}
else
{
printf("%c ", guessed_word[i]);
}
}
printf("\n");
}
//Prompts menu for user playing the game to guess letter, converts the guess to a Capital letter as specified,
//and returns the user's guess
char get_user_guess()
{
char guess;
printf("Please enter your guess\n");
scanf("%c", &guess);
guess = toupper(guess);
return(guess);
}
//Performs the user's guess. If the the guess is a letter in the word, the value is swapped with any "_" letters
int perform_guess(char game_word[], char *guessed_word, int word_length, char guess)
{
int i;
int guessed_right = 0;
int chosen_letters[26];
for (i = 0; i < word_length; i++)
{
if (guessed_word[i] != 0)
{
if (game_word[i] == guess)
{
guessed_word[i] = guess;
chosen_letters[guess - 'A']++;
return 1;
}
}
}
}
//Checks to see if word user has guessed is equal to underscore_word
int game_solved(char game_word[], char guessed_word[])
{
if (strcmp(guessed_word, game_word) == 0)
{
return 1;
}
else
{
return 0;
}
}
// Pre-conditions: allWords must be of size n, at least, fin must
// point to a file with n words, with only uppercase letters
// ready to read from the first word.
// Post-conditions: The n words stored in the file pointed to by fin will
// we stored in the array allWords.
void read_words(char all_words[][MAX_SIZE], FILE *fin, int n)
{
int i;
for (i=0; i<n; i++)
{
fscanf(fin, "%s", all_words[i]);
}
}