Ryoutt

BT

Jun 28th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <locale.h>
  6.  
  7. char navio(int tabuleiro){
  8.     if(tabuleiro == 1){
  9.         return '@';
  10.     }
  11.  
  12.     if(tabuleiro == 2){
  13.         return '#';
  14.     }
  15.  
  16.     if(tabuleiro == 3){
  17.         return '$';
  18.     }
  19.  
  20.     if(tabuleiro == 4){
  21.         return '*';
  22.     }
  23.  
  24.     if(tabuleiro == -5){
  25.         return '?';
  26.     }
  27.  
  28.     if(tabuleiro == -6){
  29.         return '!';
  30.     }
  31.  
  32.     if(tabuleiro < 0 && tabuleiro != -5 && tabuleiro != -6){
  33.         return 'x';
  34.     }
  35.  
  36.     return '~';
  37. }
  38.  
  39. void mostrarTabuleiroDoJogador(int jogador[10][10]){
  40.     int i, j;
  41.     printf("Seu Tabuleiro: \n");
  42.     printf("     1 2 3 4 5 6 7 8 9 10\n\n");
  43.     for(i = 0; i < 10; i++){
  44.         if(i < 9){
  45.             printf(" %d   ", i + 1);
  46.         } else printf("%d   ", i + 1);
  47.         for(j = 0; j < 10; j++){
  48.             printf("%c ", navio(jogador[i][j]));
  49.         }
  50.         printf("\n");
  51.     }
  52.     printf("\n");
  53. }
  54.  
  55. void mostrarTabuleiros(int tabuleiroJogador[10][10], int tabuleiroInimigo[10][10], int player, int player2){
  56.  
  57.     int i, j, k;
  58.  
  59.     //Imprime os tabuleiros
  60.     printf("Jogador %d                     O que sabe do jogador %d:\n", player, player2);
  61.     printf("     1 2 3 4 5 6 7 8 9 10          1 2 3 4 5 6 7 8 9 10\n\n");
  62.     for(i = 0; i < 10; i++){
  63.         if(i < 9){
  64.             printf(" %d   ", i + 1);
  65.         } else printf("%d   ", i + 1);
  66.  
  67.         for(j = 0; j < 10; j++){
  68.             printf("%c ", navio(tabuleiroJogador[i][j]));
  69.         }
  70.         if(i < 9){
  71.             printf("      %d   ", i + 1);
  72.         } else printf("     %d   ", i + 1);
  73.         for(k = 0; k < 10; k++){
  74.             printf("%c ", navio(tabuleiroInimigo[i][k]));
  75.         }
  76.         printf("\n");
  77.     }
  78.     printf("\n");
  79. }
  80.  
  81. void preencher(bool x[10][10], bool y){
  82.     int i, j;
  83.     for(i = 0; i < 10; i++){
  84.         for(j = 0; j < 10; j++){
  85.             x[i][j] = y;
  86.         }
  87.     }
  88. }
  89.  
  90. void preencherInt(int x[10][10], int y){
  91.     int i, j;
  92.     for(i = 0; i < 10; i++){
  93.         for(j = 0; j < 10; j++){
  94.             x[i][j] = y;
  95.         }
  96.     }
  97. }
  98.  
  99. bool pode(bool tab[10][10], int x, int y, int tamanho, int orientacao){
  100.     int i;
  101.     if(orientacao == 1){
  102.         for(i = 0; i < tamanho; i++){
  103.             if(!tab[x + i][y]){
  104.                 return false;
  105.             }
  106.         }
  107.     } else {
  108.             for(i = 0; i < tamanho; i++){
  109.                 if(!tab[x][y + i]){
  110.                     return false;
  111.                 }
  112.             }
  113.     }
  114.    
  115.     return true;
  116. }
  117.  
  118. void deixaFalse(int i, int j, bool x[10][10]){
  119.     if(i > 0 && i < 9){
  120.         if(j > 0 && j < 9){
  121.             x[i + 1][j + 1] = false;
  122.             x[i + 1][j - 1] = false;
  123.             x[i + 1][j] = false;
  124.             x[i - 1][j + 1] = false;
  125.             x[i - 1][j - 1] = false;
  126.             x[i - 1][j] = false;
  127.             x[i][j + 1] = false;
  128.             x[i][j - 1] = false;
  129.             x[i][j] = false;
  130.         } else {
  131.             x[i + 1][j + 1] = false;
  132.             x[i + 1][j] = false;
  133.             x[i - 1][j + 1] = false;
  134.             x[i - 1][j] = false;
  135.             x[i][j + 1] = false;
  136.             x[i][j] = false;
  137.         }
  138.     } else {
  139.         if(j > 0 && j < 9){
  140.             x[i + 1][j + 1] = false;
  141.             x[i + 1][j - 1] = false;
  142.             x[i + 1][j] = false;
  143.             x[i][j + 1] = false;
  144.             x[i][j - 1] = false;
  145.             x[i][j] = false;
  146.         } else{
  147.             x[i + 1][j + 1] = false;
  148.             x[i + 1][j] = false;
  149.             x[i][j + 1] = false;
  150.             x[i][j] = false;
  151.         }
  152.     }
  153. }
  154.  
  155. char navios[5][15] = {"Porta-Aviões","Encouraçado","Cruzador","Submarino"};
  156.  
  157. void preencheNavio(int tabuleiro[10][10], bool tabLogica[10][10], int numNavios, int tamNavios, int id){
  158.     int temp,i,j,x,y;
  159.     for(j = 0; j < numNavios; j++){
  160.         if(id < 3){
  161.             do{
  162.                 printf("Precione 1 para o %s estar na vertical e 2 para horizontal\n", navios[id]);
  163.                 scanf("%d",&temp);
  164.             } while(temp != 1 && temp != 2);
  165.  
  166.             if(temp == 1){
  167.                 do{
  168.                     printf("Insira a coordenada da primeira peça do %s\n", navios[id]);
  169.                     scanf("%d %d", &x, &y);
  170.                     x -= 1;
  171.                     y -= 1;
  172.                 } while(x > 11 - tamNavios || x < 0 || !pode(tabLogica,x, y, tamNavios, temp));
  173.  
  174.                 for(i = 0; i < tamNavios; i++){
  175.                     deixaFalse(x + i, y, tabLogica);
  176.                     tabuleiro[x + i][y] = id + 1;
  177.                 }
  178.                 mostrarTabuleiroDoJogador(tabuleiro);
  179.  
  180.             } else {
  181.                  do{
  182.                     printf("Insira a coordenada da primeira peça do %s\n", navios[id]);
  183.                     scanf("%d %d", &x, &y);
  184.                     x -= 1;
  185.                     y -= 1;
  186.                 } while(y > 11 - tamNavios || y < 0 || !pode(tabLogica,x, y, tamNavios, temp));
  187.                 for(i = 0; i < tamNavios; i++){
  188.                     deixaFalse(x, y + i,tabLogica);
  189.                     tabuleiro[x][y + i] = id + 1;
  190.                 }
  191.                 mostrarTabuleiroDoJogador(tabuleiro);
  192.             }
  193.         } else {
  194.             do{
  195.                 printf("Insira a coordenada do %s\n", navios[id]);
  196.                 scanf("%d %d", &x, &y);
  197.                 x -= 1;
  198.                 y -= 1;
  199.             } while(y > 11 - tamNavios || y < 0 || !tabLogica[x][y]);
  200.  
  201.             for(i = 0; i < tamNavios; i++){
  202.                 deixaFalse(x + i, y, tabLogica);
  203.                 tabuleiro[x + i][y] = id + 1;
  204.             }
  205.             mostrarTabuleiroDoJogador(tabuleiro);
  206.         }
  207.     }
  208. }
  209.  
  210. void preencheTabuleiroJogador(int tabuleiro[10][10], bool tabLogica[10][10], int player){
  211.     int i, j;
  212.  
  213.     //Porta-Aviões
  214.     preencheNavio(tabuleiro,tabLogica,1,5,0);
  215.  
  216.     //Encouraçado
  217.     preencheNavio(tabuleiro,tabLogica,2,4,1);
  218.  
  219.     //Cruzador
  220.     preencheNavio(tabuleiro,tabLogica,3,2,2);
  221.  
  222.     //Submarino
  223.     preencheNavio(tabuleiro,tabLogica,4,1,3);
  224.  
  225.     //Testa se é o tabuleiro do jogador 1 ou 2 e salva num arquivo
  226.     if(player == 1){
  227.         FILE *arq = fopen("Save1.txt","w");
  228.         if(arq == NULL){
  229.             exit(1);
  230.         }
  231.         for(i = 0; i < 10; i++){
  232.             for(j = 0; j < 10; j++){
  233.                 fprintf(arq,"%d",tabuleiro[i][j]);
  234.             }
  235.         }
  236.         fclose(arq);
  237.     } else {
  238.         FILE *arq = fopen("Save2.txt","w");
  239.         for(i = 0; i < 10; i++){
  240.             for(j = 0; j < 10; j++){
  241.                 fprintf(arq,"%d",tabuleiro[i][j]);
  242.             }
  243.         }
  244.         fclose(arq);
  245.     }
  246.  
  247.     printf("Tabuleiro Salvo com sucesso\n");
  248. }
  249.  
  250. void jogo(int tabuleiro[10][10], int tabuleiroInimigo[10][10], bool partida){
  251.     int numTiros, numTirosInimigo, x, y, qntNavios = 23, qntNaviosInimigo = 23, ptA = 5, enc = 4, cru = 2, sub = 1, ptAJ = 5, encJ = 4, cruJ = 2, subJ = 1;
  252.     bool tabLogica[10][10], tabLogicaInimigo[10][10];
  253.     preencher(tabLogicaInimigo,true);
  254.     preencher(tabLogica,true);
  255.     int tabuleiroInJogador[10][10];
  256.     preencherInt(tabuleiroInJogador,-5);
  257.     int tabuleiroJogInimigo[10][10];
  258.     preencherInt(tabuleiroJogInimigo,-5);
  259.     do{
  260.         numTiros = 3;
  261.         system("clear");
  262.         do{
  263.             do{
  264.                 mostrarTabuleiros(tabuleiro, tabuleiroInJogador, 1, 2);
  265.                 printf("Dê as coordenadas do tiro\n");
  266.                 scanf("%d %d", &x, &y);
  267.                 x -= 1;
  268.                 y -= 1;
  269.                 system("clear");
  270.                 if(!tabLogicaInimigo[x][y]){
  271.                     printf("Posição Invá¡lida\n");
  272.                 }
  273.             } while(x < 0 || x > 9 || y < 0 || y > 9 || !tabLogicaInimigo[x][y]);
  274.  
  275.             //Se acertar a Água
  276.             if(tabuleiroInimigo[x][y] == 0){
  277.                 printf("Água\n");
  278.                 tabLogicaInimigo[x][y] = false;
  279.                 tabuleiroInJogador[x][y] = 0;
  280.                 tabuleiroInimigo[x][y] = -6;
  281.             }
  282.  
  283.             //Se Acertar um porta-aviões
  284.             if(tabuleiroInimigo[x][y] == 1){
  285.                 printf("Acertou\n");
  286.                 tabLogicaInimigo[x][y] = false;
  287.                 tabuleiroInJogador[x][y] = 1;
  288.                 tabuleiroInimigo[x][y] *= -1;
  289.                 qntNavios--;
  290.                 ptA--;
  291.                 if(ptA == 0){
  292.                     printf("Porta-Aviões foi destruido\n");
  293.                 }
  294.             }
  295.  
  296.             //Se Acertar um encouraçado
  297.             if(tabuleiroInimigo[x][y] == 2){
  298.                 printf("Acertou\n");
  299.                 tabLogicaInimigo[x][y] = false;
  300.                 tabuleiroInJogador[x][y] = 2;
  301.                 tabuleiroInimigo[x][y] *= -1;
  302.                 qntNavios--;
  303.                 enc--;
  304.                 if(enc == 0){
  305.                     printf("Encouraçado foi destruido\n");
  306.                 }
  307.             }
  308.  
  309.             //Se Acertar um cruzador
  310.             if(tabuleiroInimigo[x][y] == 3){
  311.                 printf("Acertou\n");
  312.                 tabLogicaInimigo[x][y] = false;
  313.                 tabuleiroInJogador[x][y] = 3;
  314.                 tabuleiroInimigo[x][y] *= -1;
  315.                 qntNavios--;
  316.                 cru--;
  317.                 if(cru == 0){
  318.                     printf("Cruzador foi destruido\n");
  319.                 }
  320.             }
  321.  
  322.             //Se Acertar um submarino
  323.             if(tabuleiroInimigo[x][y] == 4){
  324.                 printf("Acertou\n");
  325.                 tabLogicaInimigo[x][y] = false;
  326.                 tabuleiroInJogador[x][y] = 4;
  327.                 tabuleiroInimigo[x][y] *= -1;
  328.                 qntNavios--;
  329.                 sub--;
  330.                 if(sub == 0){
  331.                     printf("Submarino foi destruido\n");
  332.                 }
  333.             }
  334.  
  335.             //Se a quatidade de Navios do Inimigo for reduzida à  zero
  336.             if(qntNavios == 0){
  337.                 partida = false;
  338.                 printf("Jogador 1 Venceu!\n");
  339.                 break;
  340.             }
  341.  
  342.             numTiros--;
  343.         }while(numTiros > 0);
  344.  
  345.         //Se a quatidade de Navios do Inimigo for reduzida à  zero
  346.         if(!partida){
  347.             break;
  348.         }
  349.  
  350.         system("clear");
  351.         numTirosInimigo = 3;
  352.         do{
  353.             do{
  354.                 mostrarTabuleiros(tabuleiroInimigo, tabuleiroJogInimigo, 2, 1);
  355.                 printf("Dê as coordenadas do tiro\n");
  356.                 scanf("%d %d", &x, &y);
  357.                 x -= 1;
  358.                 y -= 1;
  359.                 system("clear");
  360.                 if(!tabLogica[x][y]){
  361.                     printf("Posição Inválida\n");
  362.                 }
  363.             } while(x < 0 || x > 9 || y < 0 || y > 9 || !tabLogica[x][y]);
  364.             if(tabuleiro[x][y] == 0){
  365.                 printf("Água\n");
  366.                 tabLogica[x][y] = false;
  367.                 tabuleiroJogInimigo[x][y] = 0;
  368.                 tabuleiro[x][y] = -6;
  369.             }
  370.             if(tabuleiro[x][y] == 1){
  371.                 printf("Acertou\n");
  372.                 tabLogica[x][y] = false;
  373.                 tabuleiroJogInimigo[x][y] = 1;
  374.                 tabuleiro[x][y] *= -1;
  375.                 qntNaviosInimigo--;
  376.                 ptA--;
  377.                 if(ptAJ == 0){
  378.                     printf("Porta-Aviões foi destruido\n");
  379.                 }
  380.             }
  381.             if(tabuleiro[x][y] == 2){
  382.                 printf("Acertou\n");
  383.                 tabLogica[x][y] = false;
  384.                 tabuleiroJogInimigo[x][y] = 2;
  385.                 tabuleiro[x][y] *= -1;
  386.                 qntNaviosInimigo--;
  387.                 enc--;
  388.                 if(encJ == 0){
  389.                     printf("Encouraçado foi destruido\n");
  390.                 }
  391.             }
  392.             if(tabuleiro[x][y] == 3){
  393.                 printf("Acertou\n");
  394.                 tabLogica[x][y] = false;
  395.                 tabuleiroJogInimigo[x][y] = 3;
  396.                 tabuleiro[x][y] *= -1;
  397.                 qntNaviosInimigo--;
  398.                 cru--;
  399.                 if(cruJ == 0){
  400.                     printf("Cruzador foi destruido\n");
  401.                 }
  402.             }
  403.             if(tabuleiro[x][y] == 4){
  404.                 printf("Acertou\n");
  405.                 tabLogica[x][y] = false;
  406.                 tabuleiroJogInimigo[x][y] = 4;
  407.                 tabuleiro[x][y] *= -1;
  408.                 qntNaviosInimigo--;
  409.                 sub--;
  410.                 if(subJ == 0){
  411.                     printf("Submarino foi destruido\n");
  412.                 }
  413.             }
  414.  
  415.             //Se a quatidade de Navios do jogador for reduzida à  zero
  416.             if(qntNaviosInimigo == 0){
  417.                 partida = false;
  418.                 printf("Jogador 2 Venceu!\n");
  419.                 break;
  420.             }
  421.  
  422.             numTirosInimigo--;
  423.         } while(numTirosInimigo > 0);
  424.  
  425.         //Se a quatidade de Navios do jogador for reduzida à  zero
  426.         if(!partida){
  427.             break;
  428.         }
  429.  
  430.     } while(partida);
  431. }
  432.  
  433. void carregaJogo(int tabuleiro[10][10], int player){
  434.     int i,j;
  435.     if(player == 1){
  436.         FILE *arq = fopen("Save1.txt","r");
  437.         if(arq == NULL){
  438.             printf("ERRO AO LER O ARQUIVO");
  439.             exit(1);
  440.         }
  441.         char temp[101];
  442.         fscanf(arq,"%s",temp);
  443.  
  444.         for(i = 0; i < 10; i++){
  445.             for(j = 0; j < 10; j++){
  446.                 tabuleiro[i][j] = (int)temp[i * 10 + j] - 48;
  447.             }
  448.         }
  449.         fclose(arq);
  450.     } else {
  451.         FILE *arq = fopen("Save2.txt","r");
  452.         if(arq == NULL){
  453.             printf("ERRO AO LER O ARQUIVO");
  454.             exit(1);
  455.         }
  456.         char temp[101];
  457.         fscanf(arq,"%s",temp);
  458.  
  459.         for(i = 0; i < 10; i++){
  460.             for(j = 0; j < 10; j++){
  461.                 tabuleiro[i][j] = (int)temp[i * 10 + j] - 48;
  462.             }
  463.         }
  464.         fclose(arq);
  465.     }
  466. }
  467.  
  468. int main(){
  469.     setlocale(LC_ALL, "Portuguese");//habilita a acentuação para o português
  470.     int opcoesMenu, aux = NULL,temp;
  471.    
  472.     int tabuleiroJogador[10][10];
  473.     preencherInt(tabuleiroJogador, 0);
  474.     bool tabLogica[10][10];
  475.     preencher(tabLogica,true);
  476.    
  477.     int tabuleiroInimigo[10][10];
  478.     preencherInt(tabuleiroInimigo, 0);
  479.     bool tabLogicaInimigo[10][10];
  480.     preencher(tabLogicaInimigo,true);
  481.    
  482.     bool partida = true;
  483.     do{
  484.         do{
  485.             printf("[1] - Novo tabuleiro \n[2] - Novo jogo\n[3] - Carregar Jogo Salvo\n[4] - Ajuda\n[5] - Sair\n\n> ");
  486.             scanf("%d",&opcoesMenu);
  487.             switch(opcoesMenu){
  488.                 case 1:
  489.                     do{
  490.                         printf("[1] - Jogador 1\n[2] - Jogador 2\n[3] - Ambos os jogadores\n\n> ");
  491.                         scanf("%d",&temp);
  492.                     } while(temp < 0 || temp > 3);
  493.                     if(temp == 1){
  494.                         mostrarTabuleiroDoJogador(tabuleiroJogador);
  495.                         preencheTabuleiroJogador(tabuleiroJogador, tabLogica, 1);
  496.                     }
  497.                     if(temp == 2){
  498.                         mostrarTabuleiroDoJogador(tabuleiroInimigo);
  499.                         preencheTabuleiroJogador(tabuleiroInimigo, tabLogicaInimigo, 2);
  500.                     }
  501.                     if(temp == 3){
  502.                         mostrarTabuleiroDoJogador(tabuleiroJogador);
  503.                         preencheTabuleiroJogador(tabuleiroJogador, tabLogica, 1);
  504.                         preencheTabuleiroJogador(tabuleiroInimigo, tabLogicaInimigo, 2);
  505.                     }
  506.                     break;
  507.                 case 2:
  508.                     jogo(tabuleiroJogador,tabuleiroInimigo,partida);
  509.                     break;
  510.                 case 3:
  511.                     carregaJogo(tabuleiroJogador, 1);
  512.                     carregaJogo(tabuleiroInimigo, 2);
  513.                     break;
  514.                 case 4:
  515.                     printf("[~] - Água \n[@] - Porta-Aviões \n[#] - Encouraçado\n[$] - Cruzador\n[*] - Submarino\n[x] - Destroços\n[!] - Tiro na Água\n\n\n");
  516.                     opcoesMenu = 0;
  517.                     break;
  518.                 case 5:
  519.                     exit(1);
  520.                     break;
  521.                 default:
  522.                     aux = 0;
  523.             }
  524.         } while(aux == 0);
  525.  
  526.     } while(partida);
  527.     return 0;
  528. }
Add Comment
Please, Sign In to add comment