Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "header.h"
- int efetuaLogin(char * fifoCliente){
- int fdLoginPedido, fdLoginResposta, pedServ, respServ;
- pedidoLogin p;
- servidor serv;
- while(access(FIFO_SERV_LOGIN,F_OK) != 0){
- printw("Nao existe ligacao ao servidor...\n");
- refresh();
- sleep(5);
- }
- fdLoginPedido = open(FIFO_SERV_LOGIN, O_WRONLY);
- if(fdLoginPedido == -1){
- printw("Erro no fifo do servidor!\n");
- close(fdLoginPedido);
- return 0;
- }
- //Cria fifo do cliente com identificação
- fdLoginResposta = open(fifoCliente,O_RDWR);
- if(fdLoginResposta == -1)
- printw("Erro no fifo do cliente!\n");
- printw("Introduza o seu username: ");
- scanw(" %49[^\n]", p.username);
- noecho();
- printw("Introduza a sua password: ");
- scanw(" %49[^\n]", p.password);
- echo();
- p.clientePid = getpid();
- //Manda a informaçao para o servidor
- pedServ = write(fdLoginPedido, &p, sizeof(p));
- //printf("%s\t%s\n", p.username, p.password);
- //Recebe resposta do servidor (0 ou 1)
- respServ = read(fdLoginResposta, &serv, sizeof(serv));
- //printf("Recebe ------> %d\t%d\n\n", serv.flagLogin, serv.servidorPid);
- pidServidor = serv.servidorPid;
- if(serv.flagLogin == 0)
- printw("Erro ao efetuar login, tente novamente!\n");
- else if(serv.flagLogin == 1)
- printw("Login efetuado com sucesso!\n");
- else if(serv.flagLogin == 2)
- printw("Utilizador ja efetuou login!\n");
- close(fdLoginPedido);
- close(fdLoginResposta);
- return serv.flagLogin;
- }
- void * ThreadDesenhaLabirinto(){
- int i, j, fdCliente, userPid, intRead, fim=0;
- char newFifo[TAM];
- labirinto l;
- WINDOW * janela;
- janela = newwin(25,55,1,1);
- init_pair(1, COLOR_WHITE, COLOR_WHITE); //parede inquebravel
- init_pair(2, COLOR_WHITE, COLOR_BLACK); //parede quebravel
- init_pair(3, COLOR_BLUE, COLOR_BLACK); //bomberman
- init_pair(4, COLOR_RED, COLOR_BLACK); //inimigos
- init_pair(5, COLOR_YELLOW, COLOR_WHITE); //objectos
- init_pair(6, COLOR_BLACK, COLOR_BLACK); //passagem
- userPid = getpid();
- sprintf(newFifo, "cliente%d", userPid);
- fdCliente = open(newFifo, O_RDWR );
- if(fdCliente == -1){
- printw("Erro ao abrir newFifo\n");
- refresh();
- }
- do{
- clear();
- //recebe campo
- intRead = read(fdCliente, &l, sizeof(l));
- mvprintw(2, 55, "Mega Bombas: \n");
- mvprintw(3, 55, "Bombinhas: \n");
- for(i = 0; i < 20; i++){
- for(j = 0; j < 50; j++){
- if(l.campo[i][j] == 0){
- wattron(janela, COLOR_PAIR(6));
- mvwaddch(janela, i+1, j+2, ACS_CKBOARD);
- }
- if(l.campo[i][j] == 1){
- wattron(janela, COLOR_PAIR(2));
- mvwaddch(janela, i+1, j+2, ACS_CKBOARD);
- }
- if(l.campo[i][j] == 2){
- wattron(janela, COLOR_PAIR(1));
- mvwaddch(janela, i+1, j+2, ACS_CKBOARD);
- }
- if(l.campo[i][j] == 4){
- wattron(janela, COLOR_PAIR(3));
- mvwaddch(janela, i+1, j+2, ACS_DIAMOND);
- }
- //printw("%d", l.campo[i][j]);
- }
- printw("\n");
- }
- wrefresh(janela);
- usleep(33);//30 tick por segundo
- }while(true);
- wattroff(janela, COLOR_PAIR(1));
- wattroff(janela, COLOR_PAIR(2));
- wattroff(janela, COLOR_PAIR(3));
- wattroff(janela, COLOR_PAIR(4));
- wattroff(janela, COLOR_PAIR(5));
- wattroff(janela, COLOR_PAIR(6));
- wrefresh(janela);
- wclear(janela);
- }
- void jogo(){
- int input, userPid, fdCliente, fdServidor, intRead, intWrite, fim=0;
- char fifoCliente[TAM];
- cliente Jogador;
- pthread_t desenhaLabirinto;
- curs_set(0);
- while(access(FIFO_SERV_JOGO, F_OK) != 0){
- printw("Nao existe ligacao ao servidor de jogo\n");
- refresh();
- sleep(2);
- }
- fdServidor = open(FIFO_SERV_JOGO, O_WRONLY);
- if(fdServidor == -1){
- printw("Erro ao abrir FIFO de jogo do servidor\n");
- refresh();
- }
- userPid = getpid();
- sprintf(fifoCliente,"cliente%d", userPid);
- fdCliente = open(fifoCliente, O_RDWR);
- if(fdCliente == -1){
- printw("Erro ao abrir fifo cliente\n");
- refresh();
- sleep(2);
- }
- intWrite = write(fdServidor, &userPid, sizeof(int));
- //printw("USERPID no cliente: %d\n", userPid);
- //lança thread do campo
- pthread_create(&desenhaLabirinto, NULL, ThreadDesenhaLabirinto, NULL);
- do{
- noecho();
- input = getch();
- refresh();
- if(input == KEY_UP)
- input = 1;
- else if(input == KEY_DOWN)
- input = 2;
- else if(input == KEY_LEFT)
- input = 3;
- else if(input == KEY_RIGHT)
- input = 4;
- else if(input == KEY_BACKSPACE){
- input = 0;
- clear();
- }
- else
- input = -1; //INVALIDO;
- if(input == 0){
- intWrite = write(fdServidor, &input, sizeof(int));
- break;
- }
- else
- intWrite = write(fdServidor, &input, sizeof(int));
- //printw("INPUT CLIENTE: %d\n", input);
- usleep(33); //30 tick por segundo
- }while(fim == 0);
- close(fdCliente);
- close(fdServidor);
- pthread_join(desenhaLabirinto, NULL);
- }
- void menu(char * fcliente){
- int op, returnLogin = 0;
- refresh();
- do{
- printw("\n***** MENU PRINCIPAL *****\n");
- if(returnLogin != 1)
- printw("1 - Login\n");
- printw("2 - Jogar\n");
- printw("3 - Sair\n");
- printw("Escolha uma opcao: ");
- scanw("%d", &op);
- clear();
- switch(op){
- case 1: if(returnLogin != 1)
- returnLogin = efetuaLogin(fcliente);
- else
- printw("opcao invalida!\n");
- break;
- case 2: //if(returnLogin == 1)
- jogo();
- //else
- // printw("Efetue login primeiro!\n");
- break;
- case 3: printw("A encerrar o jogo...\n");
- kill(pidServidor, SIGUSR1);
- unlink(fcliente);
- endwin();
- exit(0);
- default: printw("Opcao invalida!\n");
- }
- }while(op > 0 && op < 4);
- }
- void recebeSinal(int sig){
- if(sig == SIGUSR1){
- printw("\nO jogo vai encerrar...\n");
- refresh();
- sleep(2);
- endwin();
- char fifoClienteTmp[TAM];
- sprintf(fifoClienteTmp, "cliente%d", getpid());
- unlink(fifoClienteTmp);
- exit(0);
- }
- if(sig == SIGUSR2){
- printw("\nFoi kickado do jogo!\n");
- refresh();
- sleep(2);
- endwin();
- char fifoClienteTmp[TAM];
- sprintf(fifoClienteTmp, "cliente%d", getpid());
- unlink(fifoClienteTmp);
- exit(0);
- }
- }
- int main(void){
- int pid;
- char fifoCliente[TAM];
- initscr(); //inicializa as ncurses
- keypad(stdscr, TRUE); //teclas direcionais
- start_color();
- clear();
- signal(SIGUSR1, recebeSinal);
- signal(SIGUSR2, recebeSinal);
- pid = getpid();
- sprintf(fifoCliente, "cliente%d", pid);
- mkfifo(fifoCliente, 0600);
- menu(fifoCliente);
- endwin();
- return 0;
- }
- /*
- int tabuleiro(){
- int i,j,x=0, nInimigos = 0, nObjectos = 0;
- labirinto lab1;
- lab1.tamX = 20;
- lab1.tamY = 30;
- lab1.nObjectos = 50;
- lab1.nInimigos = 20;
- lab1.campo = (int **)malloc(lab1.tamX * sizeof(int *));
- if(lab1.campo == NULL){
- printf ("Erro: Memoria Insuficiente");
- return 0;
- }
- for(i=0;i<lab1.tamY;i++){
- lab1.campo[i] = (int *) malloc(lab1.tamY * sizeof(int));
- if (lab1.campo[i] == NULL) {
- printf ("Erro: Memoria Insuficiente");
- return 0;
- }
- }
- //Campo inicial
- for(i=0;i<lab1.tamX;i++){
- for(j=0;j<lab1.tamY;j++){
- if(i==(lab1.tamX-1) || j==(lab1.tamY-1) || i==0 || j==0){
- lab1.campo[i][j] = 2;
- }
- else if(i%2==0 && j%2==0){
- lab1.campo[i][j] = 2;
- }
- else{
- x = rand() % 101;
- //system("pause");
- if(x>=50)
- lab1.campo[i][j] = 0;
- else if(x<50)
- lab1.campo[i][j] = 1;
- }
- printf("%d", lab1.campo[i][j]);
- }
- printf("\n");
- }
- nInimigos = lab1.nInimigos;
- nObjectos = lab1.nObjectos;
- //campo com objectos e inimigos
- do{
- for(i=0;i<lab1.tamX;i++){
- for(j=0;j<lab1.tamY;j++){
- if(lab1.campo[i][j]==0){
- x = rand() % 101;
- if(x>=0 && x<=5 && nInimigos>0){
- lab1.campo[i][j] = 4;
- nInimigos--;
- }
- else if(x>5 && x<= 15 && nObjectos >0){
- lab1.campo[i][j] = 3;
- nObjectos--;
- }
- }
- }
- }
- }while(nObjectos>0 && nInimigos>0);
- printf("\n\n\n");
- //Imprime campo
- for(i=0;i<lab1.tamX;i++){
- for(j=0;j<lab1.tamY;j++){
- printf("%d", lab1.campo[i][j]);
- }
- printf("\n");
- }
- return 0;
- }
- */
Add Comment
Please, Sign In to add comment