Baixe o app para aproveitar ainda mais
Prévia do material em texto
08/03/2018 Jogo: Batalha Naval em C - C Progressivo.net http://www.cprogressivo.net/2012/09/batalha-naval-em-c.html 1/5 Apostila de C online e gratuita C Progressivo.net Pesquisa personalizada Pes Criar logo 2 jogo CurAnúncios Google Jogo: Batalha Naval em C Agora que aprendemos como passar vetores/arrays (de qualquer dimensão) para funções, já podemos fazer algo mais útil. Vamos fazer o famoso batalha naval, no modo texto. Usaremos tudo que aprendemos até o momento em nosso curso de C: if else, laço do while, laço for, funções números aleatórios, arrays, arrays multidimensionais e muita criatividade. Há um tabuleiro de 5x5, ou seja, 25 blocos. Há 3 navios escondidos (um em cada bloco). O objetivo do jogar é descobrir onde estão estes navios e acertá-los. A cada tiro dado é dito se você acertou algum navio. Caso tenha errado, é dito quantos navios existem naquela linha e naquela coluna. O jogo só acaba quando você descobrir e afundar os 3 navios. Legenda pro usuário: ~ : água no bloco. Ainda não foi dado tiro. * : tiro dado, não há nada ali. X : tiro dado, havia um navio ali. A cada rodada, entre com dois números: o número da linha e o número da coluna onde quer dar o tiro. Depois é só esperar pra ver se acertou, ou a dica. O tabuleiro 5x5 é de inteiros. Ele é inicializado com valores '-1'. A cada tiro ele é atualizado, dependendo se o usuário acertou ou errou. Esses números servirão para exibir '~', '*' ou 'X' para o usuário. Também servirão para exibir as dicas. -1 : nenhum tiro foi dado naquele bloco (~) 0 : o tiro foi dado e não havia nada (*) 1 : o usuário atirou e tinha um navio lá (X) Regras: Como jogar: Para os programadores C: Legenda do tabuleiro: Linguagem C (Review) Livro Recomendado Gostou dos tutoriais? Ajude a divulgar! Seja o primeiro de seus amigos a curtir isso. C Prog… 5,7 mil curtidas Curtir Página Conteúdo original - Todos os direitos reservados Política de Privacidade Índice Básico Teste e Laços Função Vetores Ponteiros Strings Structs Alocação Arquivos Fórum Contato Sumário do Curso Gostou do conteúdo? Que tal nos ajudar? Q manter o projeto e co PagS Pa Ajude nosso projet 08/03/2018 Jogo: Batalha Naval em C - C Progressivo.net http://www.cprogressivo.net/2012/09/batalha-naval-em-c.html 2/5 void inicializaTabuleiro() - inicialmente coloca o valor -1 em todas as partes do tabuleiro void mostraTabuleiro() - recebe o tabuleiro de inteiros e os exibe void iniciaNavios() - esse função sorteia 3 pares de inteiros, que são a localização dos 3 navios void darTiro() - recebe um tiro (linha e coluna) do usuário, e armazena na variável tiro[] boolean acertou() - checa se o tiro dado acertou um navio void dica() - dá a dica de quantos navios existem naquela linha e naquela coluna onde o tiro foi dado void alteraTabuleiro() - após o tiro ser dado, o tabuleiro é alterado, mostrando o tiro que foi dado(se acertou ou errou) Inicialmente, são criadas as variáveis 'tabuleiro[5][5]', que vai armazenar o tabuleiro do jogo, a variável 'navios[3][2]', que vai armazenar a posição (linha e coluna) dos 3 navios que estão escondidos no tabuleiro, a variável 'tiro[2]' que vai armazenar a posição (linha e coluna) do tiro que o jogador vai dar a cada rodada, além da variável 'tentativa', que vai armazenar o número de tentativas que o jogador fez até acertar os 3 navios e, por fim, a variável 'acertos' que contabiliza o número de navios que você acertou. A função 'inicializaTabuleiro()' é acionado, pra criar o tabuleiro com o número '-1' em todas as posições. Depois é a função 'iniciaNavios()', que vai sortear a posição de 3 navios (linha e coluna). Essa função sorteia dois números, entre 0 e 4. Depois ele checa se esse número já saiu, pois não podem existir dois barcos na mesma posição. Caso já tenha saído, entra num laço do...while que fica sorteando números, e só sai quando sorteia outro par de números que ainda não é a localização de um navio. Após isso, na main(), vamos iniciar o jogo. Os jogos geralmente se iniciam através de um laço do...while. No caso, a condição do while é 'acertos!=3'. Ou seja, enquanto você não acertar os 3 navios, o jogo não para. A primeira coisa que ocorre no laço é mostrar o tabuleiro, através do laço 'mostraTabuleiro()'. Essa função checa cada posição o 'tabuleiro'. Se for -1 ele exibe água, '~'. Se for 0, ele exibe o tiro que foi dado e errou '*', e se for 1, ele exibe 'X' que indica que você acertou um navio naquela posição. Após mostrar o tabuleiro, você vai dar seu tiro, através da função 'darTiro()', que recebe dois inteiros. Note que, o usuário vai digitar números de 1 até 5, pois ele conta de 1 até 5. Você, como programador C é que conta de 0 até 4. Portanto, quando o usuário entrar com a linha e com a coluna, SUBTRAIA 1 de cada valor desses. Ou seja, se usuário entrou com (1,1), no seu tabuleiro C 5x5 isso representa a posição (0,0). Após o tiro ser dado, nosso jogo em C vai checar se esse tiro acertou algum navio. Isso é feito com a função 'acertou()', que retorna 'true' caso acerte e 'false' caso erre. Na função, ele simplesmente checa se esse par de valores - 'tiro[2]' - que definem seu tiro, batem com algum dos valores que definem a posição dos navios - navios[3][2]. Caso acerte, o valor de 'acertos' aumenta. Acertando ou errando, 'tentativas' aumenta, pois uma tentativa foi feita. Acertando ou errando, uma dica também é exibida. Essa dica é exibida através da função 'dica()', que vai olhar o seu 'tiro[2]', e olha se na linha e na coluna que você tentou existe mais algum navio, catando na 'navios[3][2]'. Note que, a linha do seu tiro é 'tiro[0]' e a coluna é 'tiro[1]'. A linha de cada navio é 'navios[x][0]' e a coluna de cada navio é 'navios[x][1]', onde 'x' é o número dos navios. No nosso caso, são 3 navios, ou seja, vai de 0 até 2. Acertando ou errando, o tabuleiro vai ser alterado. O tiro que você deu vai alterar aquele local do tabuleiro, vai aparecer tiro dado '*' ou tiro que acertou 'X'. Vamos fazer isso através da função 'alteraTabuleiro()'. Aqui, usamos uma função dentro do outro. Coisa que já explicamos em nosso curso de C. Checamos se o tiro dado 'tiro[2]' acertou através da função, que já usamos e explicamos, 'acertou'. Caso acerte, a posição do tabuleiro referente ao tiro que você deu vai mudar de '-1' para '1'. Caso erre, a posição do tabuleiro referente ao tiro que você deu vai mudar de '-1' para '0'. Assim, quando o tabuleiro for exibido, já vai exibir com '*' ou 'X' no lugar desse antigo '~'. #include <stdio.h> #include <stdlib.h> void inicializaTabuleiro(int tabuleiro[][5]) { int linha, coluna; for(linha=0 ; linha < 5 ; linha++ ) for(coluna=0 ; coluna < 5 ; coluna++ ) tabuleiro[linha][coluna]=-1; } void mostraTabuleiro(int tabuleiro[][5]) { int linha, coluna; printf("\t1 \t2 \t3 \t4 \t5"); Funções: Lógica do problema Gerando números ale srand e seed Você pode nunca ter f isso, mas números ale praticamente todos os computação; Em jogo Os tipos float e double (ou reais) em C No artigo passado de estudamos sobre o tip declarar, imprimir e in dado. Agor... O que são vetores, co usar Dando início a mais u unidade em nosso cu C, vamos iniciar noss estruturas de dados... Lendo arquivos em C fscanf e fgets Agora que já aprende arquivos em C , vamo nossa apostila de C a como ler informaç... Lendo e Escrevendo S Que 99,99% dos aplic qualquer outra linguag caracteres para mostr convencemos você. .. A função scanf - rece usuário Até o momento, os ar C Progressivo tem mo programas, porém tod controle e sem interaç O tipo ch linguage Agora qu lidar comna lingua de estudarmos como Operaçõ - Soma, multiplic módulo precedê Operações matemátic Por exemplo, quanto 3: 1 + (1x2) = 1 + 2 = (1+1)x2 =... Criando e com programa na L No artigo pass Progressivo você baix Clode::Blocks, que é o (mais recomendado e Questões resolvidas s C Vamos agora resolver laço WHILE , que hav artigo anterior de noss conseguiu, lei... Artigos populares 08/03/2018 Jogo: Batalha Naval em C - C Progressivo.net http://www.cprogressivo.net/2012/09/batalha-naval-em-c.html 3/5 printf("\n"); for(linha=0 ; linha < 5 ; linha++ ){ printf("%d",linha+1); for(coluna=0 ; coluna < 5 ; coluna++ ){ if(tabuleiro[linha][coluna]==-1){ printf("\t~"); }else if(tabuleiro[linha][coluna]==0){ printf("\t*"); }else if(tabuleiro[linha][coluna]==1){ printf("\tX"); } } printf("\n"); } } void iniciaNavios(int navios[][2]){ srand(time(NULL)); int navio, anterior; for(navio=0 ; navio < 3 ; navio++){ navios[navio][0]= rand()%5; navios[navio][1]= rand()%5; //agora vamos checar se esse par não foi sorteado //se foi, so sai do do...while enquanto sortear um diferente for(anterior=0 ; anterior < navio ; anterior++){ if( (navios[navio][0] == navios[anterior][0])&&(navios[navio][1] == navios[ante do{ navios[navio][0]= rand()%5; navios[navio][1]= rand()%5; }while( (navios[navio][0] == navios[anterior][0])&&(navios[navio][1] == nav } } } void darTiro(int tiro[2]) { printf("Linha: "); scanf("%d",&tiro[0]); tiro[0]--; printf("Coluna: "); scanf("%d",&tiro[1]); tiro[1]--; } int acertou(int tiro[2], int navios[][2]) { int navio; for(navio=0 ; navio < 3 ; navio++){ if( tiro[0]==navios[navio][0] && tiro[1]==navios[navio][1]){ printf("Você acertou o tiro (%d,%d)\n",tiro[0]+1,tiro[1]+1); return 1; } } return 0; } void dica(int tiro[2], int navios[][2], int tentativa) { int linha=0, coluna=0, fila; //conta quantos navios há na linha tiro[0] for(fila=0 ; fila < 3 ; fila++){ if(navios[fila][0]==tiro[0]) linha++; if(navios[fila][1]==tiro[1]) coluna++; } printf("\nDica %d: \nlinha %d -> %d navios\ncoluna %d -> %d navios\n",tentativa,tiro[0 } void alteraTabuleiro(int tiro[2], int navios[][2], int tabuleiro[][5]){ if(acertou(tiro,navios)) tabuleiro[tiro[0]][tiro[1]]=1; else tabuleiro[tiro[0]][tiro[1]]=0; } int main() { int tabuleiro[5][5]; int navios[3][2]; int tiro[2]; int tentativas=0, acertos=0; inicializaTabuleiro(tabuleiro); iniciaNavios(navios); printf("\n"); do{ mostraTabuleiro(tabuleiro); 08/03/2018 Jogo: Batalha Naval em C - C Progressivo.net http://www.cprogressivo.net/2012/09/batalha-naval-em-c.html 4/5 Postagem mais recente Postagem mais antigaPágina inicial Assinar: Postar comentários (Atom) Tags: Como programar em C, Jogos darTiro(tiro); tentativas++; if(acertou(tiro,navios)){ dica(tiro,navios,tentativas); acertos++; } else dica(tiro,navios,tentativas); alteraTabuleiro(tiro,navios,tabuleiro); }while(acertos!=3); printf("\n\n\nJogo terminado. Você acertou os 3 navios em %d tentativas", tentativas); mostraTabuleiro(tabuleiro); } Postar um comentário 5 comentários: Protasio Junior disse... Gostei! Na linha 28, ao invés do printf("\tX"); eu mudei para printf("\t\2"); Achei que fica mais divertido. Parabéns pelo curso... Eu estou gostando muito! 15 de junho de 2014 07:48 Mowload disse... E no caso se fossem 2 tabuleiros...tipo usuário vs computador?...estou tendo um pouco de dificuldade para desenvolver o algoritmo para esta maneira...tem alguma dica?...vlw.. E parabéns pelo site...está me ajudando mesmo. 2 de julho de 2014 09:24 Anônimo disse... esta dando um erro da hora de compilar 38 24 C:\Users\user\Documents\Projetos C\batalhanaval\main.cpp [Error] 'time' was not declared in this scope estou tentando compilar com dev-c++ 29 de maio de 2015 12:13 Mateus Souza disse... Eu estou fazendo ainda melhor. Agora o computador também sorteia números e tenta acertar os navios do usuário, além de permitir o usuário de escolher os próprios navios. Depois que conseguir, eu comento aqui, junto com o código C. 14 de junho de 2015 14:23 Joao Paulo Nunes disse... para alguns que estao dando erro de time , acrescentem a biblioteca time.h. 22 de junho de 2017 11:55 Gostou desse tutorial de C? Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial? E o melhor: totalmente gratuito. Mas para nosso projeto se manter é preciso divulgação. Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google. Contamos e precisamos de seu apoio. Melhor visualizado com Google Chrome e Mozilla Firefox 08/03/2018 Jogo: Batalha Naval em C - C Progressivo.net http://www.cprogressivo.net/2012/09/batalha-naval-em-c.html 5/5
Compartilhar