Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
736
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.10 KB | None | 0 0
  1. #define author "Marek Bielik",
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <ctype.h>
  7. #include "hangman.h"
  8.  
  9. int is_word_guessed(const char secret[], const char letters_guessed[]){
  10.     int matched=0;
  11.     for (int i=0; i < strlen(letters_guessed); i++) {
  12.       for (int j=0; j < strlen(secret); j++) {
  13.           if (letters_guessed[i]==secret[j]) { matched++; }
  14.       }
  15.     }
  16.     if (matched == strlen(secret)) return 1;
  17.     return 0;
  18. }
  19.  
  20. void get_guessed_word(const char secret[], const char letters_guessed[], char guessed_word[]){
  21.   int i;
  22.   for (i = 0; i < strlen(secret); i++) {
  23.     if (strchr(letters_guessed, secret[i]) != NULL) guessed_word[i] = secret[i];
  24.     else guessed_word[i] = '_';
  25.   }
  26.   guessed_word[i] = '\0';
  27.   return;
  28. }
  29.  
  30. void get_available_letters(const char letters_guessed[], char available_letters[]){
  31.   char allLetters[] = "abcdefghijklmnopqrstuvwxyz";
  32.   int n = 0;
  33.   int matched = 0;
  34.   for (int i = 0; i < strlen(allLetters); i++) {
  35.     matched = 0;
  36.     for (int j = 0; j < strlen(letters_guessed); j++) {
  37.       if (allLetters[i] == letters_guessed[j]) { matched = 1; break; }
  38.     }
  39.     if (!matched) {
  40.       available_letters[n] = allLetters[i];
  41.       n++;
  42.     }
  43.   }
  44.   available_letters[n] = '\0';
  45. }
  46.  
  47. void hangman(const char secret[]){
  48.   if (secret == NULL) { printf("Error: secret is NULL\n"); return; }
  49.   char available_letters[] = "abcdefghijklmnopqrstuvwxyz";
  50.   char guessed_word[24] = "";
  51.   char guessed[24] = "";
  52.   char letters_guessed[26] = "";
  53.   int word_length = strlen(secret);
  54.   int number_of_guesses = 8;
  55.  
  56.   printf("Welcome to the game, Hangman!\n");
  57.   printf("I am thinking of a word that is %d letters long.\n", word_length);
  58.   while (number_of_guesses > 0) {
  59.     printf("-------------\n");
  60.     if (is_word_guessed(secret, letters_guessed)) {
  61.       printf("Congratulations, you won!\n");
  62.       return;
  63.     }
  64.     printf("You have %d guesses left.\n", number_of_guesses);
  65.     get_available_letters(letters_guessed, available_letters);
  66.     printf("Available letters: %s\n", available_letters);
  67.     printf("Please guess a letter: ");
  68.     scanf("%s", guessed);
  69.     guessed[0] = tolower(guessed[0]);
  70.     if (strlen(guessed) > 1) { //slovo
  71.       if (strcmp(guessed, secret) == 0) {
  72.         printf("Congratulations, you won!\n");
  73.         return;
  74.       } else {
  75.         printf("Sorry, bad guess. The word was %s.\n", secret);
  76.         return;
  77.       }
  78.     } else { //pismeno
  79.       if (strpbrk(available_letters, guessed) != NULL) {
  80.         // printf("letters_guessed before: %s\n", letters_guessed);
  81.         letters_guessed[strlen(letters_guessed)] = guessed[0];
  82.         letters_guessed[strlen(letters_guessed)+1] = '\0';
  83.         // printf("letters_guessed after : %s\n", letters_guessed);
  84.         if (strpbrk(secret, guessed) != NULL) {
  85.           printf("Good guess:");
  86.         } else {
  87.           number_of_guesses--;
  88.           printf("Oops! That letter is not in my word:");
  89.         }
  90.       } else {
  91.         printf("Oops! You've already guessed that letter:");
  92.       }
  93.       get_guessed_word(secret, letters_guessed, guessed_word);
  94.       for (int i = 0; i < strlen(guessed_word); i++) printf(" %c", guessed_word[i]);
  95.       printf("\n");
  96.     }
  97.   }
  98.   printf("-------------\nSorry, you ran out of guesses. The word was %s.\n", secret);
  99.   return;
  100. }
  101.  
  102. int get_word(char secret[]){
  103.     // check if file exists first and is readable
  104.     FILE *fp = fopen(WORDLIST_FILENAME, "rb");
  105.     if( fp == NULL ){
  106.  
  107.         fprintf(stderr, "No such file or directory: %s\n", WORDLIST_FILENAME);
  108.         return 1;
  109.     }
  110.  
  111.     // get the filesize first
  112.     struct stat st;
  113.     stat(WORDLIST_FILENAME, &st);
  114.     long int size = st.st_size;
  115.  
  116.     do{
  117.         // generate random number between 0 and filesize
  118.         long int random = (rand() % size) + 1;
  119.         // seek to the random position of file
  120.         fseek(fp, random, SEEK_SET);
  121.         // get next word in row ;)
  122.         int result = fscanf(fp, "%*s %20s", secret);
  123.         if( result != EOF )
  124.             break;
  125.     }while(1);
  126.  
  127.  
  128.     fclose(fp);
  129.  
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement