Advertisement
Es7evam

WumpusWorld Funcional

May 2nd, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. int l, c,luzfound = 0, score = 0, steps = 0, arrow = 1,sense = 0; // a luz nao foi encontrada ainda, vai ser mudado para 1 quando for.
  7.  
  8. typedef struct celula {
  9.     int tipo;
  10.     int cheiroFraco;
  11.     int cheiroMedio;
  12.     int cheiroForte;
  13.     int brisaFraca;
  14.     int brisaMedia;
  15.     int brisaForte;
  16. } celula;
  17.  
  18. int walk(char dir, int i, int j){ //passa a direcao para andar (w,a,s,d) , a posicao i (linhas) e j (colunas) e o numero de passos.
  19.     steps--;
  20.     score--;
  21.     if (dir == 'w'){
  22.         i--;
  23.     }
  24.     if (dir == 's'){
  25.         i++;
  26.     }
  27.     if (dir == 'a'){
  28.         j--;
  29.     }
  30.     if (dir == 'd'){
  31.         j++;
  32.     }
  33.     if(i < 0){
  34.         printf("Movimento invalido!\n");
  35.         i++;
  36.     }
  37.     if(j < 0){
  38.         printf("Movimento invalido!\n");
  39.         j++;
  40.     }
  41.     if(i > l-1){
  42.         printf("Movimento invalido!\n");
  43.         i--;
  44.     }
  45.     if(j > c-1){
  46.         printf("Movimento invalido!\n");
  47.         j--;
  48.     }
  49.     if(dir == 'w' || dir == 's') return i;
  50.     if(dir == 'a' || dir == 'd') return j;
  51. }
  52.  
  53.  
  54. int sensations(int i, int j, celula ** M){ //sensações no local
  55.     if (i == 0 && j == 0 && luzfound == 1){
  56.         printf("Voce saiu do mundo de Wumpus a salvo!\n +1000 Pontos!!!\n");
  57.         score += 1000;
  58.         steps = 0;
  59.         sense++;
  60.         return 0;
  61.     }
  62.     if (M[i][j].tipo == 1){
  63.         printf("Voce encontrou um abismo!\n");
  64.         printf(" -1000 Pontos!\n");
  65.         score -= 1000;
  66.         steps = 0;
  67.         i = j = 0; //volta para o inicio
  68.         sense++;
  69.         return 0;
  70.     }
  71.     if (M[i][j].tipo == 2){
  72.         printf("Voce encontrou um monstro!\n -10000 Pontos!\n");
  73.         score -=10000;
  74.         steps = 0;
  75.         i = j = 0; //volta para o inicio
  76.         sense++;
  77.         return 0;
  78.     }
  79.     if (M[i][j].tipo == 3){
  80.         printf("Parabens, voce encontrou a luz\n +1000 Pontos!!!\n");
  81.         score += 1000;
  82.         luzfound = 1;
  83.         M[i][j].tipo = 0;
  84.         sense++;
  85.         return 0;
  86.     }
  87.     //imprimindo as sensações
  88.     int k;
  89.     for(k = 0;k<M[i][j].cheiroFraco;k++){
  90.         printf("Você sente um cheiro fraco\n");
  91.         sense++;
  92.     }
  93.     for(k = 0;k<M[i][j].cheiroMedio;k++){
  94.         printf("Você sente um cheiro médio\n");
  95.         sense++;
  96.     }
  97.     for(k = 0;k<M[i][j].cheiroForte;k++){
  98.         printf("Você sente um cheiro forte\n");
  99.         sense++;
  100.     }
  101.     for(k = 0;k<M[i][j].brisaFraca;k++){
  102.         printf("Você sente uma brisa fraca\n");
  103.         sense++;
  104.     }
  105.     for(k = 0;k<M[i][j].brisaMedia;k++){
  106.         printf("Você sente uma brisa média\n");
  107.         sense++;
  108.     }
  109.     for(k = 0;k<M[i][j].brisaForte;k++){
  110.         printf("Você sente uma brisa forte\n");
  111.         sense++;
  112.     }
  113.     return 0;
  114. }
  115.  
  116. int shoot(int i, int j, celula ** M, char side){ //retorna 0 se errar ou for inválido, 1 se acertar. - Função flecha
  117.     if (arrow == 0){
  118.         printf("Você já gastou a sua flecha!\n");
  119.         return 0;
  120.     }
  121.     arrow--;
  122.     if (side == 'w'){
  123.         i--;
  124.     }
  125.     if (side == 's'){
  126.         i++;
  127.     }
  128.     if (side == 'a'){
  129.         j--;
  130.     }
  131.     if (side == 'd'){
  132.         j++;
  133.     }
  134.     if (i < 0 || j < 0 || i > l-1 || j > c-1) return 0;
  135.     if (M[i][j].tipo == 2){
  136.         printf("Você matou Wumpus!\n +10000 Pontos !!!\n");
  137.         M[i][j].tipo = 0;
  138.         return 1;
  139.     }else{
  140.         printf("Errou!\n");
  141.         return 0;
  142.     }
  143.  
  144. }
  145.  
  146. int askwhat(int i, int j, celula ** M, char side){ //função de pergunta
  147.     score--;
  148.     if (side == 'w'){
  149.         i--;
  150.     }
  151.     if (side == 's'){
  152.         i++;
  153.     }
  154.     if (side == 'a'){
  155.         j--;
  156.     }
  157.     if (side == 'd'){
  158.         j++;
  159.     }
  160.     if (i < 0 || j < 0 || i > l-1 || j > c-1){
  161.         printf("Você encontrou uma parede\n");
  162.         return 0;
  163.     }
  164.     sensations(i, j, M);
  165. }
  166.  
  167.  
  168. int main() {
  169.     int i, j, k = 0;
  170.     int begin, end;
  171.     char side, dir;
  172.  
  173.  //-----Função de leitura--------//
  174.     FILE* fp;
  175.     char* mat_content; //vetor que tem a leitura
  176.  
  177.     celula **M;
  178.  
  179.     fp = fopen("matriz.txt", "r");
  180.    
  181.     if (fp==NULL)
  182.         return -1;
  183.  
  184.     //----Fim leitura arquivo----//
  185.     //Próximas 2 linhas scanf do arquivo
  186.     fscanf(fp, "%d", &l);
  187.     fscanf(fp, "%d", &c);
  188.     steps = l*c;
  189.  
  190.     //-------Declaração da matriz ------//
  191.     M = (celula **)calloc((l), sizeof(celula*)); //declara setando como 0    
  192.  
  193.     for(i=0; i<l; i++)
  194.        M[i] = (celula *)calloc(c, sizeof(celula)); //declara setando como 0
  195.  
  196.     begin = ftell(fp); //começo após os números (é um \n)
  197.  
  198.     fseek(fp, 0, SEEK_END); //vai até o fim
  199.  
  200.     end = ftell(fp); //conta a posição do fim
  201.  
  202.     fseek(fp, begin+1, SEEK_SET); //começa a setar à partir do begin
  203.  
  204.     mat_content = (char*)malloc((end-begin)*sizeof(char)); //alocação
  205.  
  206.     fread(mat_content,sizeof(char), (end-begin), fp); //read
  207.  
  208.     //-------Fim Declaração da Matriz -------//
  209.     //------Atribuição de cada tipo à struct-------//
  210.  
  211.     for(i=0; i<l; i++){
  212.         for(j=0; j<c; j++){
  213.             while(k < (end - begin) && mat_content[k] != '\n'){
  214.                 if (mat_content[k] == 'A')
  215.                     M[i][j].tipo = 1; // Abismo é tipo 1
  216.                 if (mat_content[k] == 'M')
  217.                     M[i][j].tipo = 2; // Monstro é tipo 2
  218.                 if (mat_content[k] == 'L')
  219.                     M[i][j].tipo = 3; // Luz é tipo 3
  220.                 if (mat_content[k] == 'B')
  221.                     M[i][j].brisaForte++; //é B
  222.                 if (mat_content[k] == 'C')
  223.                     M[i][j].cheiroForte++; //é C
  224.                 if (mat_content[k] == 'b'){
  225.                         if(mat_content[k+1] == 'B'){
  226.                             M[i][j].brisaMedia++; //é bB
  227.                             k++;
  228.                         }else{
  229.                             M[i][j].brisaFraca++; //é b
  230.                         }
  231.                 }
  232.                 if (mat_content[k] == 'c'){
  233.                         if(mat_content[k+1] == 'C'){
  234.                             M[i][j].cheiroMedio++; //é cC
  235.                             k++;
  236.                         }else{
  237.                             M[i][j].cheiroFraco++; //é c
  238.                         }
  239.                 }
  240.                 k++;
  241.             }//Duas linhas  abaixo testando o scan
  242.             k++;
  243.             //printf("\ni = %d, j = %d k = %d - [%d %d %d %d %d %d %d]", i, j, k, M[i][j].tipo, M[i][j].brisaFraca, M[i][j].brisaMedia, M[i][j].brisaForte, M[i][j].cheiroFraco, M[i][j].cheiroMedio, M[i][j].cheiroForte);
  244.         }
  245.     }
  246.     //--------Fim da Atribuição-----------//
  247.  
  248.     i = 0;
  249.     j = 0;
  250.     system("clear");
  251.     printf("\nVocê se encontra no mundo de wumpus, o labirinto do terrível monstro!\n\n");
  252.     printf("O labirinto consiste de abismos, a luz e o monstro.\n\n\tO seu objetivo é desviar dos abismos");
  253.     printf(", matar o monstro, pegar a luz e voltar para a coordenada {0, 0} para sair à salvo, tudo isso enquanto toma cuidado para não se cansar!\n");
  254.     printf("\n\nControles:\n");
  255.     printf("w - Andar para cima\n");
  256.     printf("s - Andar para baixo\n");
  257.     printf("d - Andar para a direita\n");
  258.     printf("a - Andar para a esquerda\n");
  259.     printf("e - Atirar flecha\n");
  260.     printf("q - Perguntar\n");
  261.     printf("c - Acessar o menu de controles\n\n");
  262.     printf("Você está na coordenada {0, 0} e o tamanho do mapa é %d linhas x %d colunas\n", l, c);
  263.     printf("Ajuste o tamanho do terminal até que as linhas abaixo fiquem continuas\n");
  264. //---------------------Modo Human Player --------------------//
  265.     while (steps > 0){
  266.         sense = 0;
  267.         printf("--------------------------------------------------------------------------------");
  268.         printf("Para que lado quer andar? \n");
  269.         scanf("%c%*c",&dir);
  270.         system("clear");
  271.         if(dir == 'c'){
  272.             printf("\n\nControles:\n");
  273.             printf("w - Andar para cima\n");
  274.             printf("s - Andar para baixo\n");
  275.             printf("d - Andar para a direita\n");
  276.             printf("a - Andar para a esquerda\n");
  277.             printf("e - Atirar flecha\n");
  278.             printf("q - Perguntar\n");
  279.             printf("c - Acessa o menu de controles\n");
  280.         }
  281.         if(dir == 'q'){
  282.             printf("Para que lado você quer perguntar?\n");
  283.             scanf("%c%*c", &side);
  284.             printf("No quadrado perguntado ");
  285.             askwhat(i, j, M, side);
  286.         }
  287.         if(dir == 'e'){ //q é o modo shoot
  288.             printf("Digite o lado para qual quer atirar\n");
  289.             scanf("%c%*c", &side);
  290.             if(shoot(i, j, M, side) == 1){
  291.                 score += 10000;
  292.             }
  293.             printf("\nPara que lado quer andar? \n");
  294.             scanf("%c%*c", &dir);
  295.             system("clear");
  296.         }
  297.         if(dir == 'w' || dir == 's'){
  298.             i = walk(dir, i, j);
  299.         }
  300.         if(dir == 'a' || dir == 'd'){  
  301.             j = walk(dir, i, j);
  302.         }
  303.         printf("\nSua coordenada atual é {%d, %d}\n", i, j);
  304.         printf("Você tem %d passos restantes\n", steps);
  305.         printf("Sua pontuação atual é %d\n\n\n", score);
  306.         sensations(i, j, M);
  307.         if(sense == 0){
  308.             printf("Você experimenta um vazio de sensações...\n");
  309.         }
  310.         printf("--------------------------------------------------------------------------------");
  311.     }
  312.     printf("Você chegou ao fim do jogo, a sua pontuação é: %d\n\n\n", score);
  313.  
  314.  
  315.     //--------- Dando free no programa--------/
  316.  
  317.     fclose(fp);
  318.  
  319.     for(i=0; i<l; i++)
  320.         free(M[i]);
  321.  
  322.     free(M);
  323.  
  324.     free(mat_content);
  325.  
  326.     //--------- Fim do free ----------//
  327.  
  328.     return 0;
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement