Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define author "Marek Bielik",
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <ctype.h>
- #include "hangman.h"
- int is_word_guessed(const char secret[], const char letters_guessed[]){
- int matched=0;
- for (int i=0; i < strlen(letters_guessed); i++) {
- for (int j=0; j < strlen(secret); j++) {
- if (letters_guessed[i]==secret[j]) { matched++; }
- }
- }
- if (matched == strlen(secret)) return 1;
- return 0;
- }
- void get_guessed_word(const char secret[], const char letters_guessed[], char guessed_word[]){
- int i;
- for (i = 0; i < strlen(secret); i++) {
- if (strchr(letters_guessed, secret[i]) != NULL) guessed_word[i] = secret[i];
- else guessed_word[i] = '_';
- }
- guessed_word[i] = '\0';
- return;
- }
- void get_available_letters(const char letters_guessed[], char available_letters[]){
- char allLetters[] = "abcdefghijklmnopqrstuvwxyz";
- int n = 0;
- int matched = 0;
- for (int i = 0; i < strlen(allLetters); i++) {
- matched = 0;
- for (int j = 0; j < strlen(letters_guessed); j++) {
- if (allLetters[i] == letters_guessed[j]) { matched = 1; break; }
- }
- if (!matched) {
- available_letters[n] = allLetters[i];
- n++;
- }
- }
- available_letters[n] = '\0';
- }
- void hangman(const char secret[]){
- if (secret == NULL) { printf("Error: secret is NULL\n"); return; }
- char available_letters[] = "abcdefghijklmnopqrstuvwxyz";
- char guessed_word[24] = "";
- char guessed[24] = "";
- char letters_guessed[26] = "";
- int word_length = strlen(secret);
- int number_of_guesses = 8;
- printf("Welcome to the game, Hangman!\n");
- printf("I am thinking of a word that is %d letters long.\n", word_length);
- while (number_of_guesses > 0) {
- printf("-------------\n");
- if (is_word_guessed(secret, letters_guessed)) {
- printf("Congratulations, you won!\n");
- return;
- }
- printf("You have %d guesses left.\n", number_of_guesses);
- get_available_letters(letters_guessed, available_letters);
- printf("Available letters: %s\n", available_letters);
- printf("Please guess a letter: ");
- scanf("%s", guessed);
- guessed[0] = tolower(guessed[0]);
- if (strlen(guessed) > 1) { //slovo
- if (strcmp(guessed, secret) == 0) {
- printf("Congratulations, you won!\n");
- return;
- } else {
- printf("Sorry, bad guess. The word was %s.\n", secret);
- return;
- }
- } else { //pismeno
- if (strpbrk(available_letters, guessed) != NULL) {
- // printf("letters_guessed before: %s\n", letters_guessed);
- letters_guessed[strlen(letters_guessed)] = guessed[0];
- letters_guessed[strlen(letters_guessed)+1] = '\0';
- // printf("letters_guessed after : %s\n", letters_guessed);
- if (strpbrk(secret, guessed) != NULL) {
- printf("Good guess:");
- } else {
- number_of_guesses--;
- printf("Oops! That letter is not in my word:");
- }
- } else {
- printf("Oops! You've already guessed that letter:");
- }
- get_guessed_word(secret, letters_guessed, guessed_word);
- for (int i = 0; i < strlen(guessed_word); i++) printf(" %c", guessed_word[i]);
- printf("\n");
- }
- }
- printf("-------------\nSorry, you ran out of guesses. The word was %s.\n", secret);
- return;
- }
- int get_word(char secret[]){
- // check if file exists first and is readable
- FILE *fp = fopen(WORDLIST_FILENAME, "rb");
- if( fp == NULL ){
- fprintf(stderr, "No such file or directory: %s\n", WORDLIST_FILENAME);
- return 1;
- }
- // get the filesize first
- struct stat st;
- stat(WORDLIST_FILENAME, &st);
- long int size = st.st_size;
- do{
- // generate random number between 0 and filesize
- long int random = (rand() % size) + 1;
- // seek to the random position of file
- fseek(fp, random, SEEK_SET);
- // get next word in row ;)
- int result = fscanf(fp, "%*s %20s", secret);
- if( result != EOF )
- break;
- }while(1);
- fclose(fp);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement