Advertisement
Lauda

Untitled

Jun 4th, 2012
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.70 KB | None | 0 0
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <curses.h>
  4.     #include <math.h>
  5.     #include <string.h>
  6.     #include <unistd.h>
  7.     #include <ctype.h>
  8.     #include "podesavanja.h"
  9.     #include "lan.h"
  10.     #include "hangman.h"
  11.     #include "globals.h"
  12.     #include "utils.h"
  13.     //#include "ai.h"
  14.  
  15. const char *err_msg     =   "Diskonektovan!";
  16. const char *quit_msg    =   "Igrac napustio igru!";
  17. const char *paused_msg  =   "Pauza!";
  18.  
  19.  
  20. void grafickiPrikaz(int pokusaja, int x, int y) // Preostalih pokusaja, X i Y koord.
  21. {
  22.     setColor(pokusaja > 3 ? HM_COLOR_DEFAULT : (pokusaja == 0 ? HM_COLOR_LOST : HM_COLOR_WARN));
  23.     mvprintw(y++, x, (pokusaja < 7    ? "+------ "    : " ") );
  24.     mvprintw(y++, x, (pokusaja < 6    ? "|/ | "       : (pokusaja < 8 ? "|/ "     : (pokusaja < 9 ? "| " : " "))) );
  25.     mvprintw(y++, x, (pokusaja < 5    ? "|  o "        : (pokusaja < 9 ? "| "      : " ")) );
  26.     mvprintw(y++, x, (pokusaja < 4    ? "| -+- "      : (pokusaja < 9 ? "| "      : " ")) );
  27.     mvprintw(y++, x, (pokusaja < 3    ? "|  ^ "        : (pokusaja < 9 ? "| "      : " ")) );
  28.     mvprintw(y++, x, (pokusaja < 1    ? "| / \\ "     : (pokusaja < 2 ? "| / "    : (pokusaja < 9 ? "| " : " "))) );
  29.     mvprintw(y++, x, (pokusaja < 9    ? "| "          : " ") );
  30.     mvprintw(y++, x, (pokusaja < 10 ? "========"      : " ") );
  31. }
  32.  
  33.  
  34. char fileLokacija[MAX_FILE_LOCATION_SIZE]; // backup lokacija fajla
  35. char *gRijec()
  36. {
  37.         char c[MAX_STR_SIZE]; // Niz karaktera, limit od 1000 bi trebao biti dovoljan...
  38.         int n = 0;
  39.         FILE *file;
  40.         int width, height;
  41.         clear();
  42.         getmaxyx(stdscr, height, width);
  43.  
  44.         int field_x=(width-FIELD_WIDTH)/2;
  45.         int field_y=((height-(FIELD_HEIGHT+4))/2)+3;
  46.  
  47.         // Otvaramo .txt fajl
  48.         if (strcmp(fileLokacija, "") != 1)
  49.         {
  50.         // Otvara se default lokacija fajla rijeci.txt, ovu lokaciju mozete promjeniti u sta god hocete...
  51.             file = fopen("rijeci.txt", "r");
  52.         }
  53.             else
  54.         {
  55.                 file = fopen(fileLokacija, "r");
  56.         }
  57.  
  58.         // U slucaju errora nekog...
  59.         if (file == NULL)
  60.         {
  61.             mvprintw(field_y+7, field_x+10,"Greska: Fajl nije pronadjen.\nMolimo Vas unesite putanju do fajla sa rijecima:\n");
  62.             scanf("%s", fileLokacija);
  63.             mvprintw(field_y+7, field_x+10,"Ucitavanje fajla '%s'.....\n\n", fileLokacija);
  64.             file = fopen(fileLokacija, "r");
  65.  
  66.             if (file == NULL)
  67.             {
  68.                 while (file==NULL)
  69.                 {
  70.                     mvprintw(field_y+7, field_x+10,"Error - Fajl ne postoji. Molimo Vas unesite tacnu putanju do fajla sa rijecima::\n");
  71.                     scanf("%s", fileLokacija);
  72.                     mvprintw(field_y+7, field_x+10,"Ucitavanje fajla '%s'.....\n\n", fileLokacija);
  73.                     file = fopen(fileLokacija, "r");
  74.                 }
  75.             }
  76.            mvprintw(field_y+7, field_x+10,"Fajl je uspjesno ucitan!\n\n");
  77.             n = fread(c, 1, MAX_STR_SIZE, file);
  78.             c[n] = '\0';
  79.         }
  80.         else
  81.         {
  82.         // Citanje sadrzaja fajla
  83.             n = fread(c, 1, MAX_STR_SIZE, file);
  84.             c[n] = '\0';
  85.         }
  86.  
  87.         // Rijeci su odvojene znakom , (zarez)
  88.         char *token = strtok(c, ",");
  89.         char *rijeci[MAX_WORD_SIZE] = {0};
  90.  
  91.         int f = 0;
  92.  
  93.         while(token != NULL)
  94.         {
  95.             // Alociranje memorije za pokazivac
  96.             rijeci[f] = malloc(strlen(token)+1);
  97.             // Kopiranje citavog stringa na pokazivac
  98.             strcpy(rijeci[f],token);
  99.             // Resetujemo pokazivac.
  100.             token = strtok(NULL, ",");
  101.             f++;
  102.         }
  103.  
  104.         fclose(file);
  105.  
  106.         // Slucajan broj:
  107.         int rijecX = randomBroj(f);
  108.  
  109.         // Oslobadjamo svu memoriju alociranu za string!
  110.         int q;
  111.         for(q = 0; q < MAX_WORD_SIZE; q++)
  112.         {
  113.             if( q != rijecX)
  114.             {
  115.                 free(rijeci[q]);
  116.             }
  117.         }
  118.         return rijeci[rijecX];
  119. }
  120.  
  121. void paint()
  122. {
  123.   //  int in_menu = TRUE;
  124.  
  125.     int i, width, height;
  126.         clear();
  127.         getmaxyx(stdscr, height, width);
  128.  
  129.        int field_x=(width-FIELD_WIDTH)/2;
  130.        int field_y=((height-(FIELD_HEIGHT+4))/2)+3;
  131.  
  132.         mvaddstr(field_y-4, field_x, "Rezultat: (Player 1)\t\t");
  133.         attron(A_BOLD | COLOR_PAIR(1));
  134.         printw("0");
  135.         attroff(A_BOLD | COLOR_PAIR(1));
  136.         addstr("\t:\t");
  137.         attron(A_BOLD | COLOR_PAIR(1));
  138.         printw("0");
  139.         attroff(A_BOLD | COLOR_PAIR(1));
  140.         printw("\t\t(Player 2)");
  141.         mvprintw(field_y+17, field_x+32, ":: HANGMAN v%.2f ::", VERSION);
  142.  
  143.       //  grafickiPrikaz(0,field_y+32, field_x+7);
  144.  
  145.  
  146.         // Debug:
  147.         addstr("\n\n");
  148.         for (i=0; i<FIELD_WIDTH; i++)
  149.             mvaddch(field_y-1, field_x+i, '-');
  150.  
  151.         if (ready_cnt)
  152.             mvaddstr(field_y+(FIELD_HEIGHT/2)+1, field_x+(FIELD_WIDTH-6)/2, "Spreman?");
  153.  
  154.         for (i=0; i<FIELD_WIDTH; i++)
  155.             mvaddch(field_y+FIELD_HEIGHT+3, field_x+i, '-');
  156.  
  157. refresh();
  158.   }
  159.  
  160. void pokreni_igru(int tip)
  161. {
  162.     int i, width, height;
  163.     clear();
  164.     getmaxyx(stdscr, height, width);
  165.  
  166.     int field_x=(width-FIELD_WIDTH)/2;
  167.     int field_y=((height-(FIELD_HEIGHT+4))/2)+3;
  168.  
  169.     char korisnicki_ulaz[] = " ";
  170.     paint();
  171.  
  172.     while ((strcmp(korisnicki_ulaz, "N") != 0) && ((strcmp(korisnicki_ulaz, "Y") == 0) || (strcmp(korisnicki_ulaz, " ") == 0)))
  173.     {
  174.         strcpy(korisnicki_ulaz, " ");
  175.  
  176.         /* Varijable:
  177.  
  178.         pogodiRijec je rijec koja treba da bude pogodjena!
  179.         trenutnaRijec je rijec koja je ispunjena tackicama i pogodjenim slovima.
  180.         */
  181.  
  182.         char *tempRijec = gRijec();
  183.         char pogodiRijec[strlen(tempRijec)+1];
  184.  
  185.         strcpy(pogodiRijec, tempRijec);
  186.         free(tempRijec);
  187.  
  188.         int duzina = strlen(pogodiRijec);
  189.  
  190.         // Kreiranje tackica:
  191.         char* trenutnaRijec = malloc(sizeof(duzina));
  192.         int t;
  193.         for (t = 0; t<=duzina; t++)
  194.         {
  195.         // Jednostavna iteracija kroz for petlju,
  196.         // sve dok je t = duzini rijeci stavljamo
  197.         //tackice, kad nije stavljamo \0 odnosno kraj stringa.
  198.             if (t == duzina)
  199.             {
  200.                 trenutnaRijec[t] = '\0';
  201.             }
  202.  
  203.             else
  204.             {
  205.                 trenutnaRijec[t] = MASK_CHAR;
  206.             }
  207.         }
  208.  
  209.         // Neke varijable
  210.         int kontrola = 0; // Broj gresaka, ako je vece od MAX_KONTROLA -> kraj
  211.         int pogodjenoSlovo = 0; // Ovo je kontrola za pogodjeno slovo tipa bool metodom true/false, kad C nema bool tip.
  212.         int n = 10;
  213.         char c = '\0';
  214.  
  215.         paint();
  216.         mvprintw(field_y, field_x+1, "%d. Unesite slovo koje zelite da pogodite: ", n);
  217.         while((strcmp(trenutnaRijec, pogodiRijec) != 0) && (kontrola < POKUSAJA))
  218.         {
  219.  
  220.           c = getch();
  221.             c = tolower(c);
  222.  
  223.             if (c == 27)
  224.                 break;
  225.  
  226.             if (c != '\n')
  227.             {
  228.                 // Alfanumericka kontrola
  229.                 if (isalpha(c) != 0)
  230.                 {
  231.                     // Provjera da li se slovo ponavlja u pogodiRijec
  232.                     for (i=0; i<duzina; i++)
  233.                     {
  234.                         if (pogodiRijec[i] == c)
  235.                         {
  236.                             trenutnaRijec[i] = c;
  237.                             pogodjenoSlovo = 1;
  238.                         }
  239.                     }
  240.  
  241.                     // U slucaju da se ne nalazi:
  242.                     if (pogodjenoSlovo == 0)
  243.                     {
  244.                         kontrola++;
  245.                         mvprintw(field_y, field_x+1, "Pogresno slovo!\n");
  246.                     }
  247.  
  248.                     else
  249.                     {
  250.                         pogodjenoSlovo = 0;
  251.                         mvprintw(field_y, field_x+1, "Tacno slovo!\n");
  252.                     }
  253.  
  254.                     // Graficki prikaz na osnovu gresaka
  255.                 //   mvprintw(field_y+2, field_x+1, "Rijec sa pogodjenim slovima: %s \n", trenutnaRijec);
  256.                         mvprintw(field_y+14, field_x, "Trazena rijec: %s (%d slova)", trenutnaRijec, duzina);
  257.                 // \tPogresna slova: (a,b,c,d,e,f,g,h,i,j)");
  258.                     grafickiPrikaz(n,field_y+32, field_x+7);
  259.  
  260.                     n--; // Broj pokusaja
  261.  
  262.                     // Ako rijec nije pogodjena i ako je kontrola i dalje manja od 10 prikazujemo ovo:
  263.                     if ((strcmp(trenutnaRijec, pogodiRijec) != 0) && (kontrola < POKUSAJA))
  264.                     {
  265.                             mvprintw(field_y, field_x+1, "%d. Unesite slovo koje zelite da pogodite: ", n);
  266.                      //       printf("\nDEBUG: kontrola = %d\n", kontrola);
  267.                     }
  268.  
  269.                 }
  270.                 else
  271.                 {
  272.                     mvprintw(field_y, field_x+1, "Samo slova su dozvoljena za unos!(a-z, A-Z), pokusajte ponovo:\n");
  273.                 }
  274.             }
  275.  
  276.         }
  277.  
  278.         if (kontrola < POKUSAJA)
  279.         {
  280.             if (strcmp(trenutnaRijec, pogodiRijec) == 0)
  281.             {
  282.                 mvprintw(field_y, field_x+1,"Cestitamo! Pogodili ste zadanu rijec!\n\n");
  283.                 grafickiPrikaz(10,field_y+32, field_x+7); // hax
  284.             }
  285.             else
  286.             {
  287.                 mvprintw(field_y, field_x+1,"Nije pogodili zadanu rijec :( \n");
  288.                 grafickiPrikaz(10,field_y+32, field_x+7);
  289.             }
  290.         }
  291.  
  292.         mvprintw(field_y, field_x+1,"\nPogresna slova: %d\nZadana rijec: %s\nRijec koju ste vi pogodili: %s\n", kontrola, pogodiRijec, trenutnaRijec);
  293.        mvprintw(field_y+1, field_x+1,"\nUnesite N za kraj programa ili unesite Y ako zelite da igrate opet:\n");
  294.  
  295.         // Samo Y i N su dozvoljeni za unos!
  296.         while ((strcmp(korisnicki_ulaz, "N") != 0) && (strcmp(korisnicki_ulaz, "Y") != 0))
  297.         {
  298.  
  299.             if (strcmp(korisnicki_ulaz, " ") != 0)
  300.             {
  301.                mvprintw(field_y, field_x+1,"\n\nDozvoljeni znakovi su Y i N, pokusajte ponovo:\n");
  302.             }
  303.             scanf("%s", korisnicki_ulaz);
  304.  
  305.         // korisnicki_ulaz -> velika slova
  306.             korisnicki_ulaz[0] = toupper(korisnicki_ulaz[0]);
  307.         }
  308.  
  309.         refresh();
  310.  
  311.         }
  312. //    refresh();
  313.  
  314. }
  315.  
  316.  
  317.  
  318. /*
  319.     void pokreni_igru(int tip)
  320.     {
  321.         int disconnected=FALSE;
  322.         char finalscore[64];
  323.         char victorymsg[64];
  324.         int i, width, height;
  325.         ucitaj_podesavanja(&conf);
  326.         remote_socket=-1;
  327.  
  328.         switch(tip)
  329.         {
  330.         case 0:
  331.             p1_tip = PLAYER_LOCAL;
  332.             p2_tip = PLAYER_NONE;
  333.             break;
  334.         case 1:
  335.             p1_tip = PLAYER_LOCAL;
  336.             p2_tip = PLAYER_CPU;
  337.             break;
  338.         case 2:
  339.         //    if (!network_setup(&p1_tip, &p2_tip, &remote_socket, &conf))
  340.                 return;
  341.         }
  342.  
  343.         paused = quit = gametime = p1_score = p2_score = 0;
  344.         ready_cnt = TICKS_PER_SECOND;
  345.         nodelay(stdscr, TRUE);
  346.  
  347.         while ((!quit) && (conf.max_time == 0 || gametime < (conf.max_time*TICKS_PER_SECOND)))
  348.         {
  349.             if (p1_tip == PLAYER_REMOTE)
  350.             {
  351.                 game_status_packet status;
  352.                 if (read(remote_socket, &status, sizeof(game_status_packet))>0)
  353.                 {
  354.                     gametime    =   status.gametime;
  355.                     ready_cnt   =   status.ready_cnt;
  356.                     paused      =   status.paused;
  357.                     p1_score    =   status.p1_score;
  358.                     p2_score    =   status.p2_score;
  359.                     paint();
  360.                 }
  361.                 else
  362.                 {
  363.                     disconnected=TRUE;
  364.                     break;
  365.                 }
  366.             }
  367.             else
  368.             {
  369.  
  370.                 if (p2_tip == PLAYER_REMOTE)
  371.                 {
  372.                     game_status_packet status;
  373.                     status.gametime     =   gametime;
  374.                     status.ready_cnt    =   ready_cnt;
  375.                     status.p1_score     =   p1_score;
  376.                     status.p2_score     =   p2_score;
  377.                     status.paused       =   paused;
  378.  
  379.                     if (write(remote_socket, &status, sizeof(game_status_packet)) < 0)
  380.                     {
  381.                         disconnected=TRUE;
  382.                         break;
  383.                     }
  384.                 }
  385.             }
  386.             if (ready_cnt>0)
  387.                 ready_cnt--;
  388.  
  389.             usleep(1000000/TICKS_PER_SECOND);
  390.  
  391.             if (!paused)
  392.                 gametime++;
  393.         }
  394.         nodelay(stdscr, FALSE);
  395.         if (remote_socket!=-1)
  396.             close(remote_socket);
  397.  
  398.         sprintf(finalscore, "Finalni rezultat: %d : %d!\n", p1_score, p2_score);
  399.  
  400.         if (p1_score!=p2_score)
  401.             sprintf(victorymsg, "Player %d je pobijedio!\n", p1_score>p2_score?1:2);
  402.  
  403.         else
  404.             sprintf(victorymsg, "Nerijeseno!");
  405.  
  406.         int wincolor=0;
  407.  
  408.         if (p1_score>p2_score)
  409.             wincolor=COLOR_PAIR(conf.p1_color);
  410.  
  411.         else if (p1_score<p2_score)
  412.             wincolor = COLOR_PAIR(conf.p2_color);
  413.  
  414.         clear();
  415.         getmaxyx(stdscr, height, width);
  416.  
  417.         if (disconnected)
  418.             mvaddstr((height/2)-1, (width-strlen(err_msg))/2, err_msg);
  419.         else if (quit)
  420.             mvaddstr((height/2)-1, (width-strlen(quit_msg))/2, quit_msg);
  421.  
  422.         mvaddstr(height/2, (width-strlen(finalscore))/2, finalscore);
  423.         attron(A_BOLD | wincolor);
  424.         mvaddstr(1+(height/2), (width-strlen(victorymsg))/2, victorymsg);
  425.         attroff(A_BOLD | wincolor);
  426.         refresh();
  427.  
  428.         while(getch()!='\n') continue;
  429. }
  430. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement