Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <curses.h>
- #include <math.h>
- #include <string.h>
- #include <unistd.h>
- #include <ctype.h>
- #include "podesavanja.h"
- #include "lan.h"
- #include "hangman.h"
- #include "globals.h"
- #include "utils.h"
- //#include "ai.h"
- const char *err_msg = "Diskonektovan!";
- const char *quit_msg = "Igrac napustio igru!";
- const char *paused_msg = "Pauza!";
- void grafickiPrikaz(int pokusaja, int x, int y) // Preostalih pokusaja, X i Y koord.
- {
- setColor(pokusaja > 3 ? HM_COLOR_DEFAULT : (pokusaja == 0 ? HM_COLOR_LOST : HM_COLOR_WARN));
- mvprintw(y++, x, (pokusaja < 7 ? "+------ " : " ") );
- mvprintw(y++, x, (pokusaja < 6 ? "|/ | " : (pokusaja < 8 ? "|/ " : (pokusaja < 9 ? "| " : " "))) );
- mvprintw(y++, x, (pokusaja < 5 ? "| o " : (pokusaja < 9 ? "| " : " ")) );
- mvprintw(y++, x, (pokusaja < 4 ? "| -+- " : (pokusaja < 9 ? "| " : " ")) );
- mvprintw(y++, x, (pokusaja < 3 ? "| ^ " : (pokusaja < 9 ? "| " : " ")) );
- mvprintw(y++, x, (pokusaja < 1 ? "| / \\ " : (pokusaja < 2 ? "| / " : (pokusaja < 9 ? "| " : " "))) );
- mvprintw(y++, x, (pokusaja < 9 ? "| " : " ") );
- mvprintw(y++, x, (pokusaja < 10 ? "========" : " ") );
- }
- char fileLokacija[MAX_FILE_LOCATION_SIZE]; // backup lokacija fajla
- char *gRijec()
- {
- char c[MAX_STR_SIZE]; // Niz karaktera, limit od 1000 bi trebao biti dovoljan...
- int n = 0;
- FILE *file;
- int width, height;
- clear();
- getmaxyx(stdscr, height, width);
- int field_x=(width-FIELD_WIDTH)/2;
- int field_y=((height-(FIELD_HEIGHT+4))/2)+3;
- // Otvaramo .txt fajl
- if (strcmp(fileLokacija, "") != 1)
- {
- // Otvara se default lokacija fajla rijeci.txt, ovu lokaciju mozete promjeniti u sta god hocete...
- file = fopen("rijeci.txt", "r");
- }
- else
- {
- file = fopen(fileLokacija, "r");
- }
- // U slucaju errora nekog...
- if (file == NULL)
- {
- mvprintw(field_y+7, field_x+10,"Greska: Fajl nije pronadjen.\nMolimo Vas unesite putanju do fajla sa rijecima:\n");
- scanf("%s", fileLokacija);
- mvprintw(field_y+7, field_x+10,"Ucitavanje fajla '%s'.....\n\n", fileLokacija);
- file = fopen(fileLokacija, "r");
- if (file == NULL)
- {
- while (file==NULL)
- {
- mvprintw(field_y+7, field_x+10,"Error - Fajl ne postoji. Molimo Vas unesite tacnu putanju do fajla sa rijecima::\n");
- scanf("%s", fileLokacija);
- mvprintw(field_y+7, field_x+10,"Ucitavanje fajla '%s'.....\n\n", fileLokacija);
- file = fopen(fileLokacija, "r");
- }
- }
- mvprintw(field_y+7, field_x+10,"Fajl je uspjesno ucitan!\n\n");
- n = fread(c, 1, MAX_STR_SIZE, file);
- c[n] = '\0';
- }
- else
- {
- // Citanje sadrzaja fajla
- n = fread(c, 1, MAX_STR_SIZE, file);
- c[n] = '\0';
- }
- // Rijeci su odvojene znakom , (zarez)
- char *token = strtok(c, ",");
- char *rijeci[MAX_WORD_SIZE] = {0};
- int f = 0;
- while(token != NULL)
- {
- // Alociranje memorije za pokazivac
- rijeci[f] = malloc(strlen(token)+1);
- // Kopiranje citavog stringa na pokazivac
- strcpy(rijeci[f],token);
- // Resetujemo pokazivac.
- token = strtok(NULL, ",");
- f++;
- }
- fclose(file);
- // Slucajan broj:
- int rijecX = randomBroj(f);
- // Oslobadjamo svu memoriju alociranu za string!
- int q;
- for(q = 0; q < MAX_WORD_SIZE; q++)
- {
- if( q != rijecX)
- {
- free(rijeci[q]);
- }
- }
- return rijeci[rijecX];
- }
- void paint()
- {
- // int in_menu = TRUE;
- int i, width, height;
- clear();
- getmaxyx(stdscr, height, width);
- int field_x=(width-FIELD_WIDTH)/2;
- int field_y=((height-(FIELD_HEIGHT+4))/2)+3;
- mvaddstr(field_y-4, field_x, "Rezultat: (Player 1)\t\t");
- attron(A_BOLD | COLOR_PAIR(1));
- printw("0");
- attroff(A_BOLD | COLOR_PAIR(1));
- addstr("\t:\t");
- attron(A_BOLD | COLOR_PAIR(1));
- printw("0");
- attroff(A_BOLD | COLOR_PAIR(1));
- printw("\t\t(Player 2)");
- mvprintw(field_y+17, field_x+32, ":: HANGMAN v%.2f ::", VERSION);
- // grafickiPrikaz(0,field_y+32, field_x+7);
- // Debug:
- addstr("\n\n");
- for (i=0; i<FIELD_WIDTH; i++)
- mvaddch(field_y-1, field_x+i, '-');
- if (ready_cnt)
- mvaddstr(field_y+(FIELD_HEIGHT/2)+1, field_x+(FIELD_WIDTH-6)/2, "Spreman?");
- for (i=0; i<FIELD_WIDTH; i++)
- mvaddch(field_y+FIELD_HEIGHT+3, field_x+i, '-');
- refresh();
- }
- void pokreni_igru(int tip)
- {
- int i, width, height;
- clear();
- getmaxyx(stdscr, height, width);
- int field_x=(width-FIELD_WIDTH)/2;
- int field_y=((height-(FIELD_HEIGHT+4))/2)+3;
- char korisnicki_ulaz[] = " ";
- paint();
- while ((strcmp(korisnicki_ulaz, "N") != 0) && ((strcmp(korisnicki_ulaz, "Y") == 0) || (strcmp(korisnicki_ulaz, " ") == 0)))
- {
- strcpy(korisnicki_ulaz, " ");
- /* Varijable:
- pogodiRijec je rijec koja treba da bude pogodjena!
- trenutnaRijec je rijec koja je ispunjena tackicama i pogodjenim slovima.
- */
- char *tempRijec = gRijec();
- char pogodiRijec[strlen(tempRijec)+1];
- strcpy(pogodiRijec, tempRijec);
- free(tempRijec);
- int duzina = strlen(pogodiRijec);
- // Kreiranje tackica:
- char* trenutnaRijec = malloc(sizeof(duzina));
- int t;
- for (t = 0; t<=duzina; t++)
- {
- // Jednostavna iteracija kroz for petlju,
- // sve dok je t = duzini rijeci stavljamo
- //tackice, kad nije stavljamo \0 odnosno kraj stringa.
- if (t == duzina)
- {
- trenutnaRijec[t] = '\0';
- }
- else
- {
- trenutnaRijec[t] = MASK_CHAR;
- }
- }
- // Neke varijable
- int kontrola = 0; // Broj gresaka, ako je vece od MAX_KONTROLA -> kraj
- int pogodjenoSlovo = 0; // Ovo je kontrola za pogodjeno slovo tipa bool metodom true/false, kad C nema bool tip.
- int n = 10;
- char c = '\0';
- paint();
- mvprintw(field_y, field_x+1, "%d. Unesite slovo koje zelite da pogodite: ", n);
- while((strcmp(trenutnaRijec, pogodiRijec) != 0) && (kontrola < POKUSAJA))
- {
- c = getch();
- c = tolower(c);
- if (c == 27)
- break;
- if (c != '\n')
- {
- // Alfanumericka kontrola
- if (isalpha(c) != 0)
- {
- // Provjera da li se slovo ponavlja u pogodiRijec
- for (i=0; i<duzina; i++)
- {
- if (pogodiRijec[i] == c)
- {
- trenutnaRijec[i] = c;
- pogodjenoSlovo = 1;
- }
- }
- // U slucaju da se ne nalazi:
- if (pogodjenoSlovo == 0)
- {
- kontrola++;
- mvprintw(field_y, field_x+1, "Pogresno slovo!\n");
- }
- else
- {
- pogodjenoSlovo = 0;
- mvprintw(field_y, field_x+1, "Tacno slovo!\n");
- }
- // Graficki prikaz na osnovu gresaka
- // mvprintw(field_y+2, field_x+1, "Rijec sa pogodjenim slovima: %s \n", trenutnaRijec);
- mvprintw(field_y+14, field_x, "Trazena rijec: %s (%d slova)", trenutnaRijec, duzina);
- // \tPogresna slova: (a,b,c,d,e,f,g,h,i,j)");
- grafickiPrikaz(n,field_y+32, field_x+7);
- n--; // Broj pokusaja
- // Ako rijec nije pogodjena i ako je kontrola i dalje manja od 10 prikazujemo ovo:
- if ((strcmp(trenutnaRijec, pogodiRijec) != 0) && (kontrola < POKUSAJA))
- {
- mvprintw(field_y, field_x+1, "%d. Unesite slovo koje zelite da pogodite: ", n);
- // printf("\nDEBUG: kontrola = %d\n", kontrola);
- }
- }
- else
- {
- mvprintw(field_y, field_x+1, "Samo slova su dozvoljena za unos!(a-z, A-Z), pokusajte ponovo:\n");
- }
- }
- }
- if (kontrola < POKUSAJA)
- {
- if (strcmp(trenutnaRijec, pogodiRijec) == 0)
- {
- mvprintw(field_y, field_x+1,"Cestitamo! Pogodili ste zadanu rijec!\n\n");
- grafickiPrikaz(10,field_y+32, field_x+7); // hax
- }
- else
- {
- mvprintw(field_y, field_x+1,"Nije pogodili zadanu rijec :( \n");
- grafickiPrikaz(10,field_y+32, field_x+7);
- }
- }
- mvprintw(field_y, field_x+1,"\nPogresna slova: %d\nZadana rijec: %s\nRijec koju ste vi pogodili: %s\n", kontrola, pogodiRijec, trenutnaRijec);
- mvprintw(field_y+1, field_x+1,"\nUnesite N za kraj programa ili unesite Y ako zelite da igrate opet:\n");
- // Samo Y i N su dozvoljeni za unos!
- while ((strcmp(korisnicki_ulaz, "N") != 0) && (strcmp(korisnicki_ulaz, "Y") != 0))
- {
- if (strcmp(korisnicki_ulaz, " ") != 0)
- {
- mvprintw(field_y, field_x+1,"\n\nDozvoljeni znakovi su Y i N, pokusajte ponovo:\n");
- }
- scanf("%s", korisnicki_ulaz);
- // korisnicki_ulaz -> velika slova
- korisnicki_ulaz[0] = toupper(korisnicki_ulaz[0]);
- }
- refresh();
- }
- // refresh();
- }
- /*
- void pokreni_igru(int tip)
- {
- int disconnected=FALSE;
- char finalscore[64];
- char victorymsg[64];
- int i, width, height;
- ucitaj_podesavanja(&conf);
- remote_socket=-1;
- switch(tip)
- {
- case 0:
- p1_tip = PLAYER_LOCAL;
- p2_tip = PLAYER_NONE;
- break;
- case 1:
- p1_tip = PLAYER_LOCAL;
- p2_tip = PLAYER_CPU;
- break;
- case 2:
- // if (!network_setup(&p1_tip, &p2_tip, &remote_socket, &conf))
- return;
- }
- paused = quit = gametime = p1_score = p2_score = 0;
- ready_cnt = TICKS_PER_SECOND;
- nodelay(stdscr, TRUE);
- while ((!quit) && (conf.max_time == 0 || gametime < (conf.max_time*TICKS_PER_SECOND)))
- {
- if (p1_tip == PLAYER_REMOTE)
- {
- game_status_packet status;
- if (read(remote_socket, &status, sizeof(game_status_packet))>0)
- {
- gametime = status.gametime;
- ready_cnt = status.ready_cnt;
- paused = status.paused;
- p1_score = status.p1_score;
- p2_score = status.p2_score;
- paint();
- }
- else
- {
- disconnected=TRUE;
- break;
- }
- }
- else
- {
- if (p2_tip == PLAYER_REMOTE)
- {
- game_status_packet status;
- status.gametime = gametime;
- status.ready_cnt = ready_cnt;
- status.p1_score = p1_score;
- status.p2_score = p2_score;
- status.paused = paused;
- if (write(remote_socket, &status, sizeof(game_status_packet)) < 0)
- {
- disconnected=TRUE;
- break;
- }
- }
- }
- if (ready_cnt>0)
- ready_cnt--;
- usleep(1000000/TICKS_PER_SECOND);
- if (!paused)
- gametime++;
- }
- nodelay(stdscr, FALSE);
- if (remote_socket!=-1)
- close(remote_socket);
- sprintf(finalscore, "Finalni rezultat: %d : %d!\n", p1_score, p2_score);
- if (p1_score!=p2_score)
- sprintf(victorymsg, "Player %d je pobijedio!\n", p1_score>p2_score?1:2);
- else
- sprintf(victorymsg, "Nerijeseno!");
- int wincolor=0;
- if (p1_score>p2_score)
- wincolor=COLOR_PAIR(conf.p1_color);
- else if (p1_score<p2_score)
- wincolor = COLOR_PAIR(conf.p2_color);
- clear();
- getmaxyx(stdscr, height, width);
- if (disconnected)
- mvaddstr((height/2)-1, (width-strlen(err_msg))/2, err_msg);
- else if (quit)
- mvaddstr((height/2)-1, (width-strlen(quit_msg))/2, quit_msg);
- mvaddstr(height/2, (width-strlen(finalscore))/2, finalscore);
- attron(A_BOLD | wincolor);
- mvaddstr(1+(height/2), (width-strlen(victorymsg))/2, victorymsg);
- attroff(A_BOLD | wincolor);
- refresh();
- while(getch()!='\n') continue;
- }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement