Úlohou je naprogramovať jednoduchú hru pomocou jazyka C, štandard C11, v ktorej sa hráč snaží uhádnuť náhodné číslo generované hrou tzv. tajomné číslo. Používateľ interaguje s hrou pomocou príkazového riadku / termínálu, t.j. štandardným vstupom a výstupom.

Na začiatku, hra vypýta od hráča interval v ktorom vygeneruje náhodné číslo. Rozdiel hraníc intervalu musí byť minimálne 10. Hráč následne môže napísať číslo, ktoré si myslí, že je tajomné číslo. Po zadaní čísla hra pokračuje nasledovne:

Hra končí ak hráč uhádne tajomné číslo ale sa dobrovoľne vzdá a ukončí hru tím, že napíše znak ‘Q' do vstupu pre odhad. Hra počíta koľko pokusov hráč zadal a pri ukončení hry ich vypíše hráčovi.

Ešte pred ukončením programu zapíšte záznam o hádaní do súboru hadaj_cislo.log. Záznam o hre má nasledujúci tvar:

tajomné_číslo počet_pokusov uhadol/neuhadol

Napríklad ak tajomné číslo bolo 8 a používateľ ho uhádol na 3 pokusy záznam v súbore by mal vyzerať nasledovne: 8 3 uhadol.

Program do súboru iba pridáva záznamy o hre nikdy nepremazáva existujúce dáta. Ak súbor neexistuje vytvorí ho. Súbor sa môže nachádzať v rovnakom priečinku ako zdrojový súbor main.c .

Dbajte na dodatočnú komunikáciu/výpisy hráčovi o priebehu hry, prípadne aký vstup očakávate od hráča.

Pri implementácii zadania musíte vytvoriť aspoň jednu vlastnú funkciu, ktorú následne použijete v inej časti programu. Pri implementácii môžte použiť všetky výrazy, techniky a funkcie, ktoré sme doteraz prebrali a samozrejme aj nejaká tvorivá práca navyše môže byť ocenená bonusovými bodmi.

Zadanie je ohodnotené 20 bodmi. Odovzdaný program musí byť skompilovateľný, inak je hodnotený 0 bodmi. Pri vypracovaní zadania sa kontroluje originalita zadaní, a všetky zadania so zhodou vyššou ako 85% sú hodnotené 0 bodmi. Pri hodnotení vypracovania sa bude prihliadať na nasledujúce:

Vypracovanie zadania odovzdajte do určeného miesta v MS Teams (Assignments > Zadanie 1 - Hádanie čísla). Odovzdávajte iba súbor main.c so zdrojovým kódom programu. Vypracovanie je nutné odovzdať do 31.10.2024 23:59. Neodovzdanie je hodnotené 0 bodmi. V prípade otázok, alebo technických problémov ma môžte kontaktovať na MS Teams alebo emailom.

Uvedené riešenie je len ilustratívne, samozrejme existuje mnoho možných riešení.

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int generate_number(int min, int max) {
    return rand() % (max - min + 1) + min;
}

void log_result(int secret, int guesses, char *result) {
    FILE *log = fopen("hadaj_cislo.log", "a+");
    if (log) {
        fprintf(log, "%d %d %s\n", secret, guesses, result);
        fclose(log);
    }
}

int main() {
    int lower_bound = 0;
    int upper_bound = 0;
    int secret_number;

    printf("Vitaj v hre 'Uhádni tajomné číslo'!\n");
    printf("Po zadaní hraníc intervalu bude vygenerované náhodné číslo v zadanom intervale, ktoré následne musíš uhádnuť.\n");
    printf("Skús minimalizovať počet pokusov na uhádnutie čísla. Ak ťa to už nebaví, namiesto zadania čísla zadaj znak 'Q'.\n\n");

    printf("Zadaj interval, v ktorom sa bude nachádzať tajomné číslo:\n");

    while (upper_bound - lower_bound < 10) {
        printf("Rozsah intervalu musí byť aspoň 10! Skús zadať hranice intervalu znovu\n");
        printf("Dolné ohraničenie intervalu: ");
        scanf("%d", &lower_bound);
        printf("Horné ohraničenie intervalu: ");
        scanf("%d", &upper_bound);
    }

    printf("\n");
    secret_number = generate_number(lower_bound, upper_bound);

    int number_of_guesses = 0;
    char *result;
    while (TRUE) {
        int guess;
        char input[25];
        printf("Aké je tajomné číslo? ");
        scanf("%s", input);
        if (input[0] == 'Q' || input[0] == 'q') {
            printf("\nVzdal si sa. Škoda kámo :/ \n");
            printf("Vydržal si %d pokusov\n", number_of_guesses);
            result = "neuhadol";
            break;
        }
        guess = atoi(input);
        if (secret_number == guess) {
            printf("\nGratulujem uhádol si tajomné číslo!!!\n");
            printf("Uhádnutie ti zabralo %d pokusy\n", number_of_guesses);
            result = "uhadol";
            break;
        } else if (guess < lower_bound || guess > upper_bound) {
            printf("Tvoj odhad musí spadať do zadaného intervalu %d - %d\n", lower_bound, upper_bound);
        } else if (secret_number > guess) {
            printf("Tajomné číslo je väčšie ako tvoj odhad.\n");
        } else if (secret_number < guess) {
            printf("Tajomné číslo je menšie ako tvoj odhad.\n");
        }
        number_of_guesses++;
    }

    log_result(secret_number, number_of_guesses, result);

    return 0;
}