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:
/** 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.
_________________ 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.
Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 0 hostia
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