The game allows you to choose one of the six categories, then it randomly chooses a word to be guessed. At the end, it displays the selected word, whether you lose the game or win it, as well as a option to start a new game.
The functions used for console graphics have been discussed in a previous article:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
#include<time.h>
#include"GRAPH_LIB.h"
#define MAX_WORD_LENGTH 255 //the maximum length of a word
/*---------------GLOBALS--------------*/
char categories[6][25]; //categories of words
FILE *file = NULL; //pointer to the file to be opened
char word[MAX_WORD_LENGTH]; //the selected word from the file
int newGame = 1; //variable to decide whether or not to start a new game
/*-------------PROTOTYPES-------------*/
/*
* Description:
* Displays the header
*/
void Header(void);
/*
* Description:
* Opens the file containing the words from a category based on the option parameter
* Parameters:
* option - the selected option from the menu of categories
*/
void DecideFile(int option);
/*
* Description:
* Displays the categories' menu and allows the user to select a category
*/
void Menu(void);
/*
* Description:
* Randomly selects a word from the opened file
*/
void DecideWord(void);
/*
* Description:
* Displays a menu allowing the player to decide whether or not to start a new game
* Returns:
* 1 - starting a new game
* 0 - not starting a new game
*/
int NewGame(void);
/*
* Description:
* Displays a message letting know that you lost the game as well as the word you had to guess.
*/
void LostGame(int wordLength);
/*
* Description:
* Displays the word you had to guess and a message letting you know that you won the game.
*/
void WonGame(int wordLength);
/*
* Description:
* Starts the game and contains the game's logic.
*/
int Gameplay(void);
/*-------------IMPLEMENTATION-------------*/
void Header(void)
{
ConsoleDimensions(120,50);
ConsoleColours("gray","white");
DrawRectangle(0,0,120,7,"dark blue");
GoTo(56,2);
Colour("dark blue","gray");
puts("HANGMAN");
GoTo(55,3);
puts("July 2012");
GoTo(49,4);
puts("Copyright@INFINITE LOOP");
}
void DecideFile(int option)
{
switch(option)
{
case 0:
file=fopen("actors.txt","rt");
case 1:
file=fopen("animals.txt","rt");
case 2:
file=fopen("bands.txt","rt");
case 3:
file=fopen("countries.txt","rt");
case 4:
file=fopen("films.txt","rt");
case 5:
file=fopen("sports.txt","rt");
default:
file=fopen("actors.txt","rt");
}
}
void Menu(void)
{
int i = 0, j = 0;
int option = 0;
char move = 32;
Header();
//rectangle at the bottom
StripesOutline(9,41,100,5,"gray","dark blue");
DrawRectangle(10,42,100,5,"dark gray");
GoTo(25,44);
Colour("dark gray","black");
printf("Use %c and %c to move through the menu. Press Enter to choose a category.",30,31);
//initialising the categories
strcpy(categories[0]," Actors ");
strcpy(categories[1]," Animals ");
strcpy(categories[2]," Bands ");
strcpy(categories[3],"Countries");
strcpy(categories[4]," Films ");
strcpy(categories[5]," Sports ");
//the menu
StripesOutline(44,17,31,15,"gray","cyan");
DrawRectangle(45,18,31,15,"cyan");
while(move != 13)
{
for(i=0; i<6; i++)
{
GoTo(51,20+i*2);
for(j=0; j<5; j++)//before printing the category
{
if(option == i)
{
Colour("magenta","magenta");
printf("*");
}
else
{
Colour("dark blue","dark blue");
printf("*");
}
}
if(option == i)
{
Colour("magenta","white");
}
else
{
Colour("dark blue","gray");
}
puts(categories[i]);
GoTo(56+strlen(categories[i]),20+i*2);
Colour("dark blue","dark blue");
for(j=0; j<5; j++)//after printing the category
{
if(option == i)
{
Colour("magenta","magenta");
printf("*");
}
else
{
printf("*");
}
}
}
move=getch();
if(move == 0x50)//down arrow
{
option++;
if(option == 6)
{
option = 0;
}
}
if(move == 0x48)//up arrow
{
option--;
if (option == -1)
{
option=5;
}
}
}
DecideFile(option);//opening the file corresponding to the chosen category
}
void DecideWord(void)
{
int wordsCount = 0;
int wordNumber = 0;
int i=0;
time_t seconds;
time(&seconds);
srand(seconds);
if(file != NULL)
{
while(feof(file) == 0)
{
fgets(word,255,file);
wordsCount++;
}
wordNumber = rand() % wordsCount;
rewind(file);
while(i <= wordNumber)
{
fgets(word,255,file);
i++;
}
}
if(wordNumber+1 != wordsCount)//otherwise it will contain the new line character - ??
{
word[strlen(word)-1] = '\0';
}
}
int NewGame(void)
{
int newGame = 0;
char move = 32;
StripesRectangle(40,42,40,7,"dark gray","gray");
GoTo(44,44);
Colour("neon green","black");
printf("Do you want to start a new game?");
while(move != 13)
{
GoTo(57,46);
if(newGame == 1)
{
Colour("white","black");
}
else
{
Colour("neon green","black");
}
printf(" YES ");
GoTo(57,47);
if(newGame == 0)
{
Colour("white","black");
}
else
{
Colour("neon green","black");
}
printf(" NO ");
move=getch();
if(move == 0x48)//down arrow
{
newGame = 1;
}
if(move == 0x50)//up arrow
{
newGame = 0;
}
}
return newGame;
}
void LostGame(int wordLength)
{
int i = 0;
system("cls");
Header();
StripesOutline(39,18,40,6,"gray","neon green");
DrawRectangle(40,19,40,6,"dark gray");
GoTo(55,21);
Colour("dark gray","black");
puts("GAME OVER");
GoTo(54,22);
puts("#You lost#");
DoubleBorderGrid((120-6*wordLength)/2,35,3,3,1,wordLength,"gray","white");
Colour("gray","cyan");
for(i=0; i<wordLength; i++)
{
GoTo((120-6*wordLength)/2+6*i+2,37);
printf("%c",word[i]);
}
}
void WonGame(int wordLength)
{
int i = 0;
system("cls");
Header();
StripesOutline(39,18,40,6,"gray","neon green");
DrawRectangle(40,19,40,6,"dark gray");
GoTo(55,21);
Colour("dark gray","black");
printf(" GAME OVER");
GoTo(55,22);
printf("#You won#");
DoubleBorderGrid((120-6*wordLength)/2,35,3,3,1,wordLength,"gray","white");
Colour("gray","cyan");
for(i=0; i<wordLength; i++)
{
GoTo((120-6*wordLength)/2+6*i+2,37);
printf("%c",word[i]);
}
}
int Gameplay(void)
{
char *constructing = NULL;
char alphabet[26];
char letter;
int missed=6;
int i=0;
int k=0;
int wordLength=0;
int letterCode = 0;
DecideWord();
wordLength=strlen(word);
constructing =(char*)malloc(sizeof(char)*wordLength);
memset(constructing,'*',wordLength);
memset(alphabet,'0',26);
constructing[wordLength]='\0';
Header();
while( missed != 0)
{
system("cls");
Header();
DoubleBorderGrid((120-6*wordLength)/2,35,3,3,1,wordLength,"gray","white");
Colour("gray","cyan");
for(i=0; i<wordLength; i++)
{
GoTo((120-6*wordLength)/2+6*i+2,37);
printf("%c",constructing[i]);
}
StripesOutline(39,18,40,6,"gray","white");
DrawRectangle(40,19,40,6,"cyan");
GoTo(47,21);
Colour("cyan","white");
printf("Remaining wrong guesses: %d",missed);
GoTo(51,22);
printf("Enter your guess: ");
fflush(stdin);
scanf("%c",&letter);
letter = toupper(letter);
letterCode = letter;
k=0;
for(i=0; i<wordLength; i++)
{
if(word[i] == letter)
{
constructing[i]=letter;
k++;
}
}
if(k == 0 && alphabet[letterCode - 65] == '0')
{
missed--;
alphabet[letterCode - 65] = '1';
}
if((strcmp(constructing,word) == 0) && (missed != 0))//the player has won the game
{
WonGame(wordLength);
newGame=NewGame();
break;
}
if(missed == 0)//the player has lost the game
{
LostGame(wordLength);
newGame=NewGame();
}
}
return newGame;
}
void Launcher(void)
{
system("title http://i-nfiniteloop.blogspot.com Hangman");
while(newGame != 0)
{
Menu();
system("cls");
newGame = Gameplay(newGame);
}
}
int main(void)
{
Launcher();
return 0;
}
Screenshots: