Hi I got a code that I would like someone to explain to me. Its a code for a word guessing game. If possible could you please point out the technical bits behind the code and also comment it out in the code itself. Many thanks. Here is the code:
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) { int i; for (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? char 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 = 0; 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); CreateWords (&words, "words.dat"); 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 (1) { 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"); }



LinkBack URL
About LinkBacks




