#include #include #include #include #define TAM_MATRIZ 7 char matriz[TAM_MATRIZ][TAM_MATRIZ]; pthread_mutex_t foo_mutex; time_t t; void printMatriz() { /*Imprime a matriz no terminal. */ int i,j; for(i = 0; i < TAM_MATRIZ; i++) { for(j = 0; j < TAM_MATRIZ; j++) { printf("%c", matriz[i][j]); } printf("\n"); } } void printMatrizFile(FILE *writer) { /*Imprime a matriz no arquivo de log de cada jogador. */ int i,j; for(i = 0; i < TAM_MATRIZ; i++) { for(j = 0; j < TAM_MATRIZ; j++) { fprintf(writer, "%c", matriz[i][j]); } fprintf(writer, "\n"); } } void getPosInicial(int id, int *posx, int *posy) { /*Busca a posição inicial de cada jogador. */ int i, j; for(i = 0; i < TAM_MATRIZ; i++) { for(j = 0; j < TAM_MATRIZ; j++) { if((int)matriz[i][j] -48 == id+1) { *posx = i; *posy = j; } } } } void *jogo(void *threadid) { /*Onde a lógica do jogo acontece. */ int id = (int)threadid; int endGame = 0; int movimento; int posx, posy; getPosInicial(id, &posx, &posy); FILE *writer; char file[17] = "log_jogador_1.txt"; file[12] = id + 1 + 48; writer = fopen(file, "w"); srand((unsigned) time(&t)); if(writer != NULL) { while(endGame == 0) { movimento = rand() % 4; movimento ++; movimento *= 2; if(movimento == 8 && posx > 0) { if(matriz[posx-1][posy] == 'F') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; pthread_mutex_unlock(&foo_mutex); fprintf(writer, "%d - Ganhou\n", movimento); endGame = 1; } else if(matriz[posx-1][posy] == '0') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; matriz[posx-1][posy] = id + 1 + 48; pthread_mutex_unlock(&foo_mutex); posx = posx-1; fprintf(writer, "%d\n", movimento); } else { fprintf(writer, "X\n"); } } else if(movimento == 6 && posy < TAM_MATRIZ -1) { if(matriz[posx][posy+1] == 'F') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; pthread_mutex_unlock(&foo_mutex); fprintf(writer, "%d - Ganhou\n", movimento); endGame = 1; } else if(matriz[posx][posy+1] == '0') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; matriz[posx][posy+1] = id + 1 + 48; pthread_mutex_unlock(&foo_mutex); posy = posy + 1; fprintf(writer, "%d\n", movimento); } else { fprintf(writer, "X\n"); } } else if(movimento == 4 && posy > 0) { if(matriz[posx][posy-1] == 'F') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; fprintf(writer, "%d - Ganhou\n", movimento); pthread_mutex_unlock(&foo_mutex); endGame = 1; } else if(matriz[posx][posy-1] == '0') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; matriz[posx][posy-1] = id + 1 + 48; pthread_mutex_unlock(&foo_mutex); posy = posy - 1; fprintf(writer, "%d\n", movimento); } else { fprintf(writer, "X\n"); } } else if(movimento == 2 && posx < TAM_MATRIZ -1) { if(matriz[posx+1][posy] == 'F') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; pthread_mutex_unlock(&foo_mutex); fprintf(writer, "%d - Ganhou\n", movimento); endGame = 1; } else if(matriz[posx+1][posy] == '0') { pthread_mutex_lock(&foo_mutex); matriz[posx][posy] = '0'; matriz[posx+1][posy] = id + 1 + 48; pthread_mutex_unlock(&foo_mutex); posx = posx + 1; fprintf(writer, "%d\n", movimento); } else { fprintf(writer, "X\n"); } } else{ fprintf(writer, "Fora da Matriz\n"); } printMatrizFile(writer); //printMatriz(); } } fclose(writer); return 0; } void *inicializaConfig() { /* Ler o arquivo txt e preencher a matriz global. */ FILE *reader; reader = fopen("labirinto.txt", "r"); char caractere; if(reader != NULL) { int i, j; for(i = 0; i < TAM_MATRIZ; i++) { for(j = 0; j < TAM_MATRIZ; j++) { caractere = (char)fgetc(reader); matriz[i][j] = caractere; } caractere = (char)fgetc(reader); } } fclose(reader); return 0; } int main(int argc, char** argv) { pthread_mutex_init(&foo_mutex, NULL); int condicao1 = (int)argv[1][0] - 48; int condicao2 = (int)(TAM_MATRIZ * TAM_MATRIZ / 2); if(condicao1 < condicao2) { pthread_t threads[condicao1]; pthread_create(&threads[0], NULL, inicializaConfig, NULL); pthread_join(threads[0], NULL); int i; //printMatriz(); for(i = 0; i < condicao1; i++) { pthread_create(&threads[i], NULL, jogo, (void *)i); //(intptr_t) } for(i = 0; i < condicao1; i++) { pthread_join(threads[i], NULL); } pthread_mutex_destroy(&foo_mutex); } return 0; }