/*
* Exercise for Lesson 5 : Word Building Game
*
* This is a word guessing game. Words are read from a file and the player has to guess
* the correct word from the shuffled letters.
*/

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

const int true = 1;
const int false = 0;

// This structure stores one entry in the high score table
struct highscore {
    char name[20];
    int numofwords;
};

// This function reads the word list from the wordlist.txt file
int readwordlist(char wordlist[][20])
{


    // Task 1. Read the word list from the text file
    //
    // Open the word list file for reading
    // 
    // Read the words using a loop
    //
    // Close the word list file
    //
    FILE *fp;
    char word[849];
    int i;
    fp = fopen("wordlist.txt", "r");
    if (fp == NULL) {
        printf("Failed to open the file!");
        return false;
        fclose(fp); \
    }
    for (i = 0; i < 849; i++) {
        fscanf(fp, "%s", word);
        strcpy(wordlist[i], word);
     }
     fclose(fp);

     return true;
}

// This function takes the target word and then print the letters in
// a random order.
void printshuffleword(char word[])
{
    char wordcopy[20];
    int letternum;
    int index;

    // Copy the word into another variable
    strcpy(wordcopy, word);

    // Pick and print a letter from the copy randomly
    letternum = 0;
    while (letternum < strlen(word)) {
        // Pick a letter randomly
        index = rand() % strlen(word);

        // Print the letter if it has not been printed
        if (wordcopy[index] != '\0') {
            printf("%c", wordcopy[index]);
            wordcopy[index] = '\0';
            letternum++;
        }
    }
}

// This function reads the high score table from a text file into an array.
void readhighscoretable(struct highscore table[])
{


    // Task 2. Read the high score table from the text file
    //
    // Open the high score table file for reading
    // 
    // Read the high score entries using a while loop
    //
    // Close the word list file
    //
    FILE *fp;

    int i = 0;
    char name[20];
    int numofwords;

    fp = fopen("highscoretable.txt", "r");

    while (fscanf(fp, "%s %d", name, &numofwords) != EOF) {
        strcpy(table[i].name, name);
        table[i].numofwords = numofwords;
        i = i + 1;
    }
    while (i < 10) {
        strcpy(table[i].name, "");
        table[i].numofwords = 0;
        i = i + 1;
    }

    fclose(fp);
}



// This function inserts a new highscore entry into the table array.
void inserthighscoretable(struct highscore table[], int numofwords)
{
    int i, j;
    char name[20];

    // Ask for the player's name
    printf("Please enter your name: ");
    scanf("%s", name);

    // Find the position of the player in the table
    i = 0;
    while (table[i].numofwords > numofwords && i < 10) {
        i++;
    }

    // Update the table
    if (i < 10) {
        // Push down all the rest of the entries
        for (j = 9; j > i; j--) {
            strcpy(table[j].name, table[j - 1].name);
            table[j].numofwords = table[j - 1].numofwords;
        }

        // Insert the new entry at the ith position
        strcpy(table[i].name, name);
        table[i].numofwords = numofwords;
    }
}

// This function saves the highscore table to the text file.
void savehighscoretable(struct highscore table[])
{


    // Task 3. Save the high score table into the text file
    //
    // Open the high score table file for writing
    // 
    // Write the high score entries using a loop
    //
    // Close the word list file
    //
    FILE *fp;
    int i = 0;
    char name[20];
    int numofwords;

    fp = fopen("highscoretable.txt", "w");
    while (i < 10) {
        strcpy(name, table[i].name);
        numofwords = table[i].numofwords;
        fprintf(fp, "%s %d\n", name, numofwords);
        i = i + 1;
    }

    fclose(fp);

}

// This function prints the highscore table.
void printhighscoretable(struct highscore table[])
{
    int i;

    // Print the title if the highscore table contains at least one entry
    if (table[0].numofwords > 0) {
        printf("\nHighscore Table\n");
        printf("--------------------------\n");
    }

    // Print all valid entries of the highscore table
    i = 0;
    while (table[i].numofwords > 0 && i < 10) {
        printf("%-3d%-20s%3d\n", i + 1, table[i].name, table[i].numofwords);
        i++;
    }
    printf("\n");
}

int main()
{
    // This array stores the 849 words available in the game
    char wordlist[849][20];

    // This is the current number of words the player has guessed correctly
    int numofwords = 0;

    // This stores the target word index
    int targetwordindex;

    // This stores the guessed word
    char guess[20];

    // This stores the number of guesses the player has used for one word
    int numofguesses;

    // This is the high score table
    struct highscore table[10];

    // Read the word list file
    if (!readwordlist(wordlist)) {
        return 0;
    }

    // Randomize the random numbers
    srand(time(NULL));

    printf("Welcome to the word building game!\n");
    printf("----------------------------------\n\n");

    printf("In this game, you have to build a secret word using the letters given to you!\n\n");
    printf("You have got three chances for each word. If you use up your chances,\nthe game will be over.\n\n");

    do {
        // Pick a word randomly from the word list
        targetwordindex = rand() % 849;

        printf("Word %d - ", numofwords + 1);

        // Print the shuffled letters in the target word
        printshuffleword(wordlist[targetwordindex]);
        printf("\n\n");

        // Get the guess from the player
        numofguesses = 0;
        do {
            // Give hints for second and last chance
            if (numofguesses == 1) {
                printf("Hint: the word starts with '%c'.\n",
                       wordlist[targetwordindex][0]);
            }
            else if (numofguesses == 2) {
                printf("Hint: the word ends with '%c'.\n",
                       wordlist[targetwordindex][strlen(wordlist[targetwordindex]) - 1]);
            }

            printf("Please enter your guess: ");
            scanf("%s", guess);

            // Increase the number of guesses
            numofguesses++;

            // The loop stops if either the player guesses correctly or the
            // player guesses three times already
        } while (strcmp(wordlist[targetwordindex], guess) != 0 && numofguesses < 3);

        // Increase the number of words if the player guesses correctly
        if (strcmp(wordlist[targetwordindex], guess) == 0) {
            numofwords++;
        }

        printf("\n");
    } while (strcmp(wordlist[targetwordindex], guess) == 0);

    // Print the game over message
    printf("Game over! You have guessed %d word(s) correctly.\n\n", numofwords);

    // Read the high score table
    readhighscoretable(table);

    // If your score is higher than the minimum score in the table
    if (numofwords > 0 && numofwords >= table[9].numofwords) {
        // Insert your entry in the table
        inserthighscoretable(table, numofwords);

        // Save the high score table
        savehighscoretable(table);
    }

    // Print the high score table
    printhighscoretable(table);
}
 

C Language online compiler

Write, Run & Share C Language code online using OneCompiler's C online compiler for free. It's one of the robust, feature-rich online compilers for C language, running the latest C version which is C18. Getting started with the OneCompiler's C editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'C' and start coding!

Read inputs from stdin

OneCompiler's C online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample C program which takes name as input and print your name with hello.

#include <stdio.h>
int main()
{
    char name[50];
    printf("Enter name:");
    scanf("%s", name);
    printf("Hello %s \n" , name );
    return 0;
    
}

About C

C language is one of the most popular general-purpose programming language developed by Dennis Ritchie at Bell laboratories for UNIX operating system. The initial release of C Language was in the year 1972. Most of the desktop operating systems are written in C Language.

Key features:

  • Structured Programming
  • Popular system programming language
  • UNIX, MySQL and Oracle are completely written in C.
  • Supports variety of platforms
  • Efficient and also handle low-level activities.
  • As fast as assembly language and hence used as system development language.

Syntax help

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition if-else is used.

if(conditional-expression) {
   // code
} else {
   // code
}

You can also use if-else for nested Ifs and if-else-if ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to if-else-if ladder.

switch(conditional-expression) {    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
...    
    
default:     
 // code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  // code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while(condition) {  
 // code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {
  // code 
} while (condition); 

Arrays

Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.

Syntax

One dimentional Array:

data-type array-name[size];

Two dimensional array:

data-type array-name[size][size];

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity.

Two types of functions are present in C

  1. Library Functions:

Library functions are the in-built functions which are declared in header files like printf(),scanf(),puts(),gets() etc.,

  1. User defined functions:

User defined functions are the ones which are written by the programmer based on the requirement.

How to declare a Function

return_type function_name(parameters);

How to call a Function

function_name (parameters)

How to define a Function

return_type function_name(parameters) {  
  //code
}