Code:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
int func (void);
void wrong (void);
void hello (void);
#define MAX_WORDS 1024
struct _WORDS
{
char* m_Array [MAX_WORDS]; // Every entry is a pointer to string
int m_iCount; // How many filled in 'm_Array'
};
typedef struct _WORDS WORDS;
void
CreateWords (WORDS* pWords, char* pstrFileName)
{
FILE* pFile;
char strLine [32]; // Assume words are no longer than 31 chars
int iLastCharPos;
pFile = fopen (pstrFileName, "rt");
if (!pFile) {
fprintf (stderr, " Error: Couldn't open file `%s'!\n", pstrFileName);
}
else {
pWords->m_iCount = 0;
while (fgets (strLine, 31, pFile)) {
// Remove '\n', at the end, if any:
iLastCharPos = strlen (strLine) - 1;
if (strLine [iLastCharPos] == '\n')
strLine [iLastCharPos] = '\0';
pWords->m_Array [pWords->m_iCount] = strdup (strLine);
(pWords->m_iCount)++;
if (pWords->m_iCount == MAX_WORDS)
break; // Array is full
}
fclose (pFile);
}
}
char*
GetRandomWord (WORDS* pWords)
{
return pWords->m_Array [rand () % pWords->m_iCount];
}
void
DestroyWords (WORDS* pWords)
{
for (int i=0; i < pWords->m_iCount; i++)
free (pWords->m_Array [i]);
}
int
main (int argc, char *argv[])
{
/*
char words[10][10] = {"mythology", "astrology", "interface",
"programme", "schedules", "faithless",
"sandstorm", "bulgarian", "boulevard", "salvation"};*/
char *temp;
WORDS words;
int count;
int random;
int flag;
char *current;
char *inserted; // That's where the already inserted letters are
// stored
char *solution; // Give user a whole try -> premature end
char ch;
int i, t, q; // Why don't reduce them to one?
bool finished;
// count = 50; // Hell, how many letters do we have? Around 26 ...!?
count = 10; // It would be more logic, if we put down tries to 10
// Better: 7/8
finished = false;
flag = 2;
temp = (char*) malloc (sizeof (char) * 32);
current = (char*) malloc (sizeof (char) * 32);
inserted = (char*) malloc (sizeof (char) * count);
solution = (char*) malloc (sizeof (char) * 32);
if (argc < 2) {
fprintf (stderr, "Need filename as argument!\n");
return 0;
}
CreateWords (&words, argv[1]);
srand (time (0));
while (!finished) {
current = GetRandomWord (&words);
memset (temp, '_', strlen (current));
temp[strlen (current)] = '\0';
memset (inserted, 0, 32);
memset (solution, 0, 32);
/*
random = func();
for (q=0; q<strlen (words[random]); q++)
current[q] = words[random][q];
*/
while (true)
{
loop_begin:
clrscr ();
printf ("\n --- Hangman ---\n");
printf (" Tries left: %d\n\n", count);
printf (" Word: %s \n"
" Wrong Guessed:\n"
" --------------\n"
" %c %c %c %c %c\n"
" %c %c %c %c %c\n",
temp, inserted[0], inserted[1], inserted[2], inserted[3],
inserted[4], inserted[5], inserted[6], inserted[7],
inserted[8], inserted[9], inserted[9]);
if (strcmp (temp, current) == 0) {
printf("\nYou did it. \nPress any key to continue ...");
break;
}
ch = tolower (getch ());
if (ch == '?')
goto end;
else if (ch == '!') {
printf ("\n Solution: ");
scanf ("%s", solution);
if (strcmp (solution, current) == 0)
printf (" That's right!\n");
else {
printf (" That's wrong!\n");
printf (" Right answer was: %s\n", current);
}
break;
}
if (!isalpha (ch))
goto loop_begin;
// if already inserted, skip the following
for (t=0; t<strlen (inserted); t++)
if (ch == inserted[t])
goto loop_begin;
flag = 0;
for (t=0; t<strlen (current); t++)
if (ch == tolower (current[t])) {
temp[t] = current[t];
flag = 2;
}
if (flag < 2) {
count--;
inserted[strlen (inserted)] = ch;
}
if (count <= 1) {
wrong ();
return 0;
}
}
ch = getche();
}
end:
free (temp);
free (current);
free (inserted);
free (solution);
DestroyWords (&words);
return 0;
}
int
func (void)
{
return (int) rand() % 10;
}
void
wrong (void)
{
printf ("\n\nSorry, But You Have Run Out Of Your Tries. Please Retry The Program");
}