Liba

ppd1Modificado

Jun 15th, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.83 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. #include <math.h>
  6.  
  7. #define TAM_MATRIZ 7
  8.  
  9. char matriz[TAM_MATRIZ][TAM_MATRIZ];
  10. pthread_mutex_t foo_mutex;
  11. time_t t;
  12.  
  13. void printMatriz() { /*Imprime a matriz no terminal. */
  14.     int i,j;
  15.     for(i = 0; i < TAM_MATRIZ; i++) {
  16.         for(j = 0; j < TAM_MATRIZ; j++) {
  17.             printf("%c", matriz[i][j]);        
  18.         }
  19.         printf("\n");
  20.     }
  21. }
  22.  
  23. void printMatrizFile(FILE *writer) { /*Imprime a matriz no arquivo de log de cada jogador. */
  24.     int i,j;
  25.     for(i = 0; i < TAM_MATRIZ; i++) {
  26.         for(j = 0; j < TAM_MATRIZ; j++) {
  27.             fprintf(writer, "%c", matriz[i][j]);           
  28.         }
  29.         fprintf(writer, "\n");
  30.     }
  31. }
  32.  
  33. void getPosInicial(int id, int *posx, int *posy) { /*Busca a posição inicial de cada jogador. */
  34.     int i, j;
  35.     for(i = 0; i < TAM_MATRIZ; i++) {
  36.         for(j = 0; j < TAM_MATRIZ; j++) {
  37.             if((int)matriz[i][j] -48 == id+1) {
  38.                 *posx = i;
  39.                 *posy = j;
  40.             }
  41.         }
  42.     }  
  43. }
  44.  
  45. void *jogo(void *threadid) { /*Onde a lógica do jogo acontece. */
  46.     int id = (int)threadid;
  47.    
  48.     int endGame = 0;
  49.     int movimento;
  50.     int posx, posy;
  51.     getPosInicial(id, &posx, &posy);
  52.    
  53.     FILE *writer;
  54.     char file[17] = "log_jogador_1.txt";
  55.     file[12] = id + 1 + 48;
  56.     writer = fopen(file, "w");
  57.     srand((unsigned) time(&t));
  58.     if(writer != NULL) {
  59.         while(endGame == 0) {
  60.             movimento = rand() % 4;
  61.             movimento ++;
  62.             movimento *= 2;
  63.             if(movimento == 8 && posx > 0) {
  64.                 if(matriz[posx-1][posy] == 'F') {
  65.                     pthread_mutex_lock(&foo_mutex);
  66.                     matriz[posx][posy] = '0';
  67.                     pthread_mutex_unlock(&foo_mutex);
  68.                     fprintf(writer, "%d - Ganhou\n", movimento);
  69.                     endGame = 1;
  70.                 }
  71.                 else if(matriz[posx-1][posy] == '0') {
  72.                     pthread_mutex_lock(&foo_mutex);
  73.                     matriz[posx][posy] = '0';
  74.                     matriz[posx-1][posy] = id + 1 + 48;
  75.                     pthread_mutex_unlock(&foo_mutex);
  76.                     posx = posx-1;
  77.                     fprintf(writer, "%d\n", movimento);
  78.                 }
  79.                 else {
  80.                     fprintf(writer, "X\n");
  81.                 }
  82.             }
  83.             else if(movimento == 6 && posy < TAM_MATRIZ -1) {
  84.                 if(matriz[posx][posy+1] == 'F') {
  85.                     pthread_mutex_lock(&foo_mutex);
  86.                     matriz[posx][posy] = '0';
  87.                     pthread_mutex_unlock(&foo_mutex);
  88.                     fprintf(writer, "%d - Ganhou\n", movimento);
  89.                     endGame = 1;
  90.                 }
  91.                 else if(matriz[posx][posy+1] == '0') {
  92.                     pthread_mutex_lock(&foo_mutex);
  93.                     matriz[posx][posy] = '0';
  94.                     matriz[posx][posy+1] = id + 1 + 48;
  95.                     pthread_mutex_unlock(&foo_mutex);
  96.                     posy = posy + 1;
  97.                     fprintf(writer, "%d\n", movimento);
  98.                 }
  99.                 else {
  100.                     fprintf(writer, "X\n");
  101.                 }
  102.             }
  103.             else if(movimento == 4 && posy > 0) {
  104.                 if(matriz[posx][posy-1] == 'F') {
  105.                     pthread_mutex_lock(&foo_mutex);
  106.                     matriz[posx][posy] = '0';
  107.                     fprintf(writer, "%d - Ganhou\n", movimento);
  108.                     pthread_mutex_unlock(&foo_mutex);
  109.                     endGame = 1;
  110.                 }
  111.                 else if(matriz[posx][posy-1] == '0') {
  112.                     pthread_mutex_lock(&foo_mutex);
  113.                     matriz[posx][posy] = '0';
  114.                     matriz[posx][posy-1] = id + 1 + 48;
  115.                     pthread_mutex_unlock(&foo_mutex);
  116.                     posy = posy - 1;
  117.                     fprintf(writer, "%d\n", movimento);
  118.                 }
  119.                 else {
  120.                     fprintf(writer, "X\n");
  121.                 }
  122.             }
  123.             else if(movimento == 2 && posx < TAM_MATRIZ -1) {
  124.                 if(matriz[posx+1][posy] == 'F') {
  125.                     pthread_mutex_lock(&foo_mutex);
  126.                     matriz[posx][posy] = '0';
  127.                     pthread_mutex_unlock(&foo_mutex);
  128.                     fprintf(writer, "%d - Ganhou\n", movimento);
  129.                     endGame = 1;
  130.                 }
  131.                 else if(matriz[posx+1][posy] == '0') {
  132.                     pthread_mutex_lock(&foo_mutex);
  133.                     matriz[posx][posy] = '0';
  134.                     matriz[posx+1][posy] = id + 1 + 48;
  135.                     pthread_mutex_unlock(&foo_mutex);
  136.                     posx = posx + 1;
  137.                     fprintf(writer, "%d\n", movimento);
  138.                 }
  139.                 else {
  140.                     fprintf(writer, "X\n");
  141.                 }
  142.             }
  143.             else{
  144.                 fprintf(writer, "Fora da Matriz\n");
  145.             }
  146.             printMatrizFile(writer);
  147.             //printMatriz();
  148.         }  
  149.     }  
  150.     fclose(writer);
  151.     return 0;
  152. }
  153.  
  154. void *inicializaConfig() { /* Ler o arquivo txt e preencher a matriz global. */
  155.     FILE *reader;
  156.     reader = fopen("labirinto.txt", "r");
  157.     char caractere;
  158.     if(reader != NULL) {
  159.         int i, j;
  160.         for(i = 0; i < TAM_MATRIZ; i++) {
  161.             for(j = 0; j < TAM_MATRIZ; j++) {
  162.                 caractere = (char)fgetc(reader);
  163.                 matriz[i][j] = caractere;
  164.             }
  165.             caractere = (char)fgetc(reader);
  166.         }
  167.     }
  168.     fclose(reader);
  169.     return 0;
  170. }
  171.  
  172. int main(int argc, char** argv)
  173. {
  174.     pthread_mutex_init(&foo_mutex, NULL);
  175.  
  176.     int condicao1 = (int)argv[1][0] - 48;
  177.     int condicao2 = (int)(TAM_MATRIZ * TAM_MATRIZ / 2);
  178.     if(condicao1 < condicao2) {
  179.         pthread_t threads[condicao1];
  180.         pthread_create(&threads[0], NULL, inicializaConfig, NULL);
  181.         pthread_join(threads[0], NULL);
  182.        
  183.         int i;
  184.         //printMatriz();
  185.         for(i = 0; i < condicao1; i++) {
  186.             pthread_create(&threads[i], NULL, jogo, (void *)i); //(intptr_t)
  187.         }
  188.         for(i = 0; i < condicao1; i++) {
  189.             pthread_join(threads[i], NULL);
  190.         }
  191.         pthread_mutex_destroy(&foo_mutex);
  192.     }
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment