Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 29 Mar 2024, 16:30

Všetky časy sú v GMT + 1 hodina




Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 
Autor Správa
 Predmet príspevku: Hra: Hadaj rovnake kocky
PoslaťNapísal: 15 Apr 2015, 09:36 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Na itnetwork.cz jeden člen potreboval pomoc s touto hrou, tak som ju nakódil. ;)
Samozrejme, že je to project zložený z niekoľkých header a source súborov:

grafika.h
Spoiler:
Kód:
#ifndef GRAFIKA_H_INCLUDED
#define GRAFIKA_H_INCLUDED

#include "cas.h"
#include <windows.h>

/** definicie vykreslenia kociek s hodnotou 1 az 6 */
#define JEDEN printf("\
***********\n\
*         *\n\
*         *\n\
*    O    *\n\
*         *\n\
*         *\n\
***********\n\n")

#define DVA printf("\
***********\n\
*         *\n\
*  O      *\n\
*         *\n\
*      O  *\n\
*         *\n\
***********\n\n")

#define TRI printf("\
***********\n\
*         *\n\
*  O      *\n\
*    O    *\n\
*      O  *\n\
*         *\n\
***********\n\n")

#define STYRI printf("\
***********\n\
*         *\n\
*  O   O  *\n\
*         *\n\
*  O   O  *\n\
*         *\n\
***********\n\n")

#define PAT printf("\
***********\n\
*         *\n\
*  O   O  *\n\
*    O    *\n\
*  O   O  *\n\
*         *\n\
***********\n\n")

#define SEST printf("\
***********\n\
*         *\n\
*  O O O  *\n\
*         *\n\
*  O O O  *\n\
*         *\n\
***********\n\n")


HANDLE wHnd;    // Riadit pisanie do konzoly
HANDLE rHnd;    // Riadit citanie z konzoly

/** Nastavi sirku, vysku a nazov konzoly
* @param int sirka
* @param int vyska
* @param retazec nazov konzoly
* @return void
*/
void konzola(const int sirka, const int vyska, char *nazov_okna);

/** Nahodne vyberie kocku, tu vykresli a vrati jej hodnotu
* @param void
* @return void
*/
int kocka(void);

/** Hadze tromi kockami, vykresluje 9 hodou v intervale 100 milisekund
* 10. hod necha viditelny
* @param  pointer na int prva kocka
* @param  pointer na int druha kocka
* @param  pointer na int tretia kocka
* @return void
*/
void hod_kockou(int *p_x, int *p_y, int *p_z);

#endif // GRAFIKA_H_INCLUDED

grafika.c
Spoiler:
Kód:
#include "grafika.h"

void konzola(const int sirka, const int vyska, char *nazov_okna)
{
    // Nastavi riadenie na citanie a zapis
    wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
    rHnd = GetStdHandle(STD_INPUT_HANDLE);
    // Nastavenie nazvu okna
    SetConsoleTitle(nazov_okna);
    // Nastavenie velkosti okna:
    SMALL_RECT windowSize = {0, 0, sirka, vyska};
    SetConsoleWindowInfo(wHnd, 1, &windowSize);
}

int kocka(void)
{
    int i;

    i = rand() % 6 + 1; // nahodne cislo v rozsahu 1 - 6
    switch (i) {
        case 1: // vykresli kocku s hodnotou 1
            JEDEN;
            break;
        case 2:
            DVA;
            break;
        case 3:
            TRI;
            break;
        case 4:
            STYRI;
            break;
        case 5:
            PAT;
            break;
        case 6:
            SEST;
            break;
    }

    return i;
}

void hod_kockou(int *p_x, int *p_y, int *p_z)
{
    int i;

    for (i = 0; i < 10; i++) { // 10 krat cyklus
        system("cls");
        *p_x = kocka(); // vykresli nahodnu kocku a do pointera ulozi hodnotu
        *p_y = kocka(); // -"-
        *p_z = kocka(); // -"-
        sleep(100); // zastavenie na 100 ms
    }
    // posledne kocky ostanu vykreslene
}

hra.h
Spoiler:
Kód:
#ifndef HRA_H_INCLUDED
#define HRA_H_INCLUDED

#include "grafika.h"
#include <math.h> // pouzitie funkcie abs() absolutna hodnota cisla

/** Vyhodnoti ci su po hode aspon dve kocky zhodne, ak su zhodne, ci je zadany
* medzernik v stanovenom case a vrati hodnotu vyhodnotenia
* @param int x, y, z su premenne ktorych adresy (&x, &y, &z) sa zadaju ako parametre
* do funkcie hod_kockou()
* @param char znak - medzernik alebo iny znak
* @param int prednastaveny cas ne hadanie po hode v milisekundach
* @param float cas trvania, kym hrac stlacil klavesu
* @return int poradove cislo vyhodnotenia
*/
int vyhodnotenie(const unsigned int x, const unsigned int y, const unsigned int z,
                 const unsigned char znak, const int nastaveny_cas, const float trvanie);

/** Samotny priebeh hry so zaverecnym vyhodnotenim
* @param void
* @return void
*/
void hrame(void);

#endif // HRA_H_INCLUDED

hra.c
Spoiler:
Kód:
#include "hra.h"

int vyhodnotenie(const unsigned int x, const unsigned int y, const unsigned int z,
                 const unsigned char znak, const int nastaveny_cas, const float trvanie)
{
    int vysledok;

    vysledok = ((x == y || x == z || y == z) && znak == ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ?
                1 : // 1-OK v termine
               ((x == y || x == z || y == z) && znak == ' ' && trvanie > (float)(nastaveny_cas / 1000.0)) ?
                2 : // 2-OK po termine
               ((x == y || x == z || y == z) && znak != ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ?
                3 : // 3-zhoda a znak nie je medzera v termine
               ((x == y || x == z || y == z) && znak != ' ' && trvanie > (float)(nastaveny_cas / 1000.0)) ?
                4 : // 4-zhoda a znak nie je medzera po termine
               (!(x == y || x == z || y == z) && znak == ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ?
                5 : // 5-nezhoda a znak je medzera v termine
               (!(x == y || x == z || y == z) && znak == ' ' && trvanie > (float)(nastaveny_cas / 1000.0)) ?
                6 : // 6-nezhoda a znak je medzera po termine
               (!(x == y || x == z || y == z) && znak != ' ' && trvanie <= (float)(nastaveny_cas / 1000.0)) ?
                7 : // 7-nezhoda a znak nie je medzera v termine
               0; // 0-nezhoda a znak nie je medzera po termine -> posledna moznost

    return vysledok;
}

void hrame(void)
{
    int i = 0, n = 15, a, b, c, nastaveny_cas, body_spolu = 0, vysledok, znamka = 5, chyba = 0;
    float trvanie;
    char typ;

    srand(time(0)); // potrebne pre generator nahodnych cisiel
    konzola(79, 40, "HRA KOCKY"); // nastavenie konzoly
    /** Uvodne informacie a zahajenie hry */
    printf("\n\n\t* * *   VITAJTE V HRE: HADAJ ROVNAKE KOCKY   * * *\n\n");
    printf("Ulohou hraca je po hode tromi kockami v stanovenom limite uhadnut, ci boli\n"
           "aspon dve kocky rovnake. "
           "Ak su rovnake, stlaci medzernik, ak nie stlaci klavesu ENTER.\n"
           "Na konci sa spocitaju chybne typy hraca, porovnaju sa\n"
           "so skutocnostou a hrac bude "
           "ohodnoteny znamkou 5 - 0. (za kazdu chybu sa znamka znizuje o jedna.\n\n"
           "Celkom bude %d hodov kockami.\n\n", n);
    printf("Za kolko milisekund uhadnete zhodne kocky (1 s = 1000 ms - [odporucane 1500]):\n");
    scanf("%d", &nastaveny_cas); // nastavenie casu za ktory sa ma stlacit spravna klavesa
    for (i = 0; i < n; i++) { // cyklus n krat
        hod_kockou(&a, &b, &c); // vykreslenie hodu kociek s hodnotami ulozenymi do pointerov
        clock_t start = clock(); // zaciatok merania casu do stlacenia klavesy
        fflush(stdin); // vyprazdnenie bufferu
        typ = getch(); // stlacenie medzernika alebo inej klavesy
        clock_t finish = clock(); // koniec merania
        trvanie = (float)((int)finish - (int)start) / CLOCKS_PER_SEC; // vypocet casu tvania do stlacenia klavesy
        vysledok = vyhodnotenie(a, b, c, typ, nastaveny_cas, trvanie); // vyhodnotenie hodu a vratenie hodnoty
        switch (vysledok) { // podla hodnoty sa body celkom a body hraca pripocitavaju
            case 1:
                //printf("1-OK v termine, cas: %.2f\n", trvanie); // test
                printf("OK\n");
                body_spolu++;
                break;
            case 2:
                //printf("2-OK po termine, cas: %.2f\n", trvanie); // test
                printf("Chyba! cas je po termine: %.3f sek.\n", trvanie);
                chyba++;
                body_spolu++;
                break;
            case 3:
                //printf("3-zhoda a znak nie je medzera v termine, cas: %.2f\n", trvanie); // test
                printf("Chyba! mala byt medzera!\n");
                chyba++;
                body_spolu++;
                break;
            case 4:
                //printf("4-zhoda a znak nie je medzera po termine, cas: %.2f\n", trvanie); // test
                printf("Chyba! mala byt medzera a cas je po termine: %.3f sek.\n", trvanie);
                chyba++;
                body_spolu++;
                break;
            case 5:
                //printf("5-nezhoda a znak je medzera v termine, cas: %.2f\n", trvanie); // test
                printf("Chyba! nemala byt medzera!\n");
                chyba++;
                break;
            case 6:
                //printf("6-nezhoda a znak je medzera po termine, cas: %.2f\n", trvanie); // test
                printf("Chyba! mala byt medzera a cas je po termine: %.3f sek.\n", trvanie);
                chyba++;
                break;
            case 7:
                //printf("7-nezhoda a znak nie je medzera v termine, cas: %.2f\n", trvanie); // test
                printf("OK\n");
                break;
            default:
                //printf("0-nezhoda a znak nie je medzera po termine, cas: %.2f\n", trvanie); // test
                printf("Chyba! cas je po termine: %.3f sek.\n", trvanie);
                chyba++;
                break;
        }
        sleep(3000);
        //getch(); // test
    }
    sleep(2000);
    system("cls");
    if (chyba > 5)
        chyba = 5;
    /** Vypis vysledkov hry */
    printf("\n\t* * *  VYHODNOTENIE  * * *\n\n"
           "Celkom bolo v hre %d zhodnych hodov.\n"
           "Pocet chyb hraca: %d.\n\n"
           "Vysledna znamka je %d.\n\n", body_spolu, chyba, znamka - chyba);
    system("pause");
}

main.c
Spoiler:
Kód:
#include "hra.h"

int main(void)
{
    hrame();

    return 0;
}

Prikladám aj zazipovaný exe súbor na vyskúšanie pre tých, ktorým sa nechce (alebo nevedia) prekopírovať kód do nejakého IDE a skompilovať si ho. ;)

PS.
Trochu som to opravil. :D
Príloha:
kocky.zip [11.06 KiB]
365 krát

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 0 hostia


Rýchla úprava:
Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre
Nemôžete zasielať súbory v tomto fóre

Hľadať:
Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK