Batalha naval em C++
Publicado por Vitor Augusto M. Pio (última atualização em 29/09/2014)
[ Hits: 20.431 ]
Jogue batalha naval com seus amigos através desse simples arquivo em C++.
Ainda existem melhoras à serem feitas (muitas na verdade), a ideia de construir um jogo de batalha naval em C++ veio de um trabalho de faculdade de um amigo.
#include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; // Constantes nomeadas const int SIZE=15; const int BOAT_SIZE_1=2; const int BOAT_SIZE_2=4; const int TOTAL_POS=8; const int CARA=1; const int COROA=0; // Classe Jogador class Jogador { public: // Atributos publicos string nome; char tabuleiro[SIZE][SIZE]; char tabuleiro_visto[SIZE][SIZE]; int posicoes_restantes; // Construtor Jogador(){ posicoes_restantes=TOTAL_POS; for(int cont1=0;cont1<SIZE;cont1++){ for(int cont2=0;cont2<SIZE;cont2++){ tabuleiro[cont1][cont2]='~'; tabuleiro_visto[cont1][cont2]='~'; } } } // Exibir tabuleiro void exibir_tabuleiro(){ cout<<"Este é o tabuleiro de "<<nome<<"\n\n"; for(int cont1=0;cont1<SIZE;cont1++){ for(int cont2=0;cont2<SIZE;cont2++){ cout<<tabuleiro[cont1][cont2]<<" "; } cout<<"\n"; } cout<<"\n"; cout<<"Legnda:\n"; cout<<"~ [ÁGUA]\n"; cout<<"0 [Navio posicionado]\n"; cout<<"\n"; } // Exibir tabuleiro visto void exibir_tabuleiro_visto(){ cout<<nome<<" sua vez de jogar\n"; cout<<"Este é o tabuleiro do seu oponente\n\n"; for(int cont1=0;cont1<SIZE;cont1++){ for(int cont2=0;cont2<SIZE;cont2++){ cout<<tabuleiro_visto[cont1][cont2]<<" "; } cout<<"\n"; } cout<<"\n"; cout<<"Legnda:\n"; cout<<"~ [ÁGUA]\n"; cout<<"# [Errou]\n"; cout<<"X [Alvo abatido]\n"; cout<<"\n"; } // Posicionar barcos com 2 casas void posicionar_barco_2(){ // Variaveis locais int linha; int coluna; char pos; bool flag=false; // Posicionar barco do{ system("cls"); exibir_tabuleiro(); cout<<"------------------------\n"; cout<<"POSICIONAR BARCO 2 CASAS\n"; cout<<"------------------------\n"; cout<<"Posicao linha (0-14):"; cin>>linha; if(linha < SIZE && linha >=0){ cout<<"Posicao coluna (0-14):"; cin>>coluna; if(coluna < SIZE && coluna >=0){ cout<<"Deseja posicionar o barco na vertical ou horizontal(V/H) ?"; cin>>pos; if(pos == 'V'){ // Verificar se é possivel posicionar um barco if(SIZE-linha!=1){ // Verificar se não há outros barcos lá int times=0; for(int cont=linha;cont<linha+BOAT_SIZE_1;cont++){ if(tabuleiro[cont][coluna]=='~'){ times++; } } // Se o número de espaço com água for igual ao tamaho do barco, então é possivel posicionar o barco if(times==BOAT_SIZE_1){ // Posição legal for(int cont=linha;cont<linha+BOAT_SIZE_1;cont++){ tabuleiro[cont][coluna]='O'; } flag=true; } } }else{ if(pos == 'H'){ // Verificar se é possivel posicionar um barco if(SIZE-coluna!=1){ // Verificar se não há outros barcos lá int times=0; for(int cont=coluna;cont<coluna+BOAT_SIZE_1;cont++){ if(tabuleiro[linha][cont]=='~'){ times++; } } // Se o número de espaço com água for igual ao tamaho do barco, então é possivel posicionar o barco if(times==BOAT_SIZE_1){ // Posição legal for(int cont=coluna;cont<coluna+BOAT_SIZE_1;cont++){ tabuleiro[linha][cont]='O'; } flag=true; } } } } } } if(flag==false){ cout<<"BARCO NÃO PODE SER POSICIONADO, TENTE NOVAMENTE\n"; cout<<"Pressione enter para continuar..."; getch(); }else{ cout<<"BARCO POSICIONADO COM SUCESSO\n"; cout<<"Pressione enter para continuar..."; getch(); } }while(flag==false); } // Posicionar barcos com 4 casas void posicionar_barco_4(){ // Variaveis locais int linha; int coluna; char pos; bool flag=false; // Posicionar barco do{ system("cls"); exibir_tabuleiro(); cout<<"------------------------\n"; cout<<"POSICIONAR BARCO 4 CASAS\n"; cout<<"------------------------\n"; cout<<"Posicao linha (0-14):"; cin>>linha; if(linha < SIZE && linha >=0){ cout<<"Posicao coluna (0-14):"; cin>>coluna; if(coluna < SIZE && coluna >=0){ cout<<"Deseja posicionar o barco na vertical ou horizontal(V/H) ?"; cin>>pos; if(pos == 'V'){ // Verificar se é possivel posicionar um barco if(SIZE-linha>2){ // Verificar se não há outros barcos lá int times=0; for(int cont=linha;cont<linha+BOAT_SIZE_2;cont++){ if(tabuleiro[cont][coluna]=='~'){ times++; } } // Se o número de espaço com água for igual ao tamaho do barco, então é possivel posicionar o barco if(times==BOAT_SIZE_2){ // Posição legal for(int cont=linha;cont<linha+BOAT_SIZE_2;cont++){ tabuleiro[cont][coluna]='O'; } flag=true; } } }else{ if(pos == 'H'){ // Verificar se é possivel posicionar um barco if(SIZE-coluna>2){ // Verificar se não há outros barcos lá int times=0; for(int cont=coluna;cont<coluna+BOAT_SIZE_2;cont++){ if(tabuleiro[linha][cont]=='~'){ times++; } } // Se o número de espaço com água for igual ao tamaho do barco, então é possivel posicionar o barco if(times==BOAT_SIZE_2){ // Posição legal for(int cont=coluna;cont<coluna+BOAT_SIZE_2;cont++){ tabuleiro[linha][cont]='O'; } flag=true; } } } } } } if(flag==false){ cout<<"BARCO NÃO PODE SER POSICIONADO, TENTE NOVAMENTE\n"; cout<<"Pressione enter para continuar..."; getch(); }else{ cout<<"BARCO POSICIONADO COM SUCESSO\n"; cout<<"Pressione enter para continuar..."; getch(); } }while(flag==false); } // Verificar posições(quantas posições já foram destruídas) bool verificar_pos(){ if(posicoes_restantes==0){ return false; }else{ return true; } } // Jogar bool jogar(Jogador *atacado){ // Variávei locais int linha; int coluna; bool flag=false; do{ system("cls"); exibir_tabuleiro_visto(); cout<<"\n"; cout<<"---------------\n"; cout<<"ATACAR OPONENTE\n"; cout<<"---------------\n"; cout<<"Posicao linha (0-14):"; cin>>linha; if(linha < SIZE && linha >=0){ cout<<"Posicao coluna (0-14):"; cin>>coluna; if(coluna < SIZE && coluna >=0){ // Verificar se há um barco na posição if(atacado->tabuleiro[linha][coluna]=='O' && tabuleiro_visto[linha][coluna]=='~'){ tabuleiro_visto[linha][coluna]='X'; atacado->posicoes_restantes--; cout<<"ACERTOU\n"; cout<<"Pressione enter para continuar..."; getch(); return true; }else{ if(atacado->tabuleiro[linha][coluna]=='~' && tabuleiro_visto[linha][coluna]=='~'){ tabuleiro_visto[linha][coluna]='#'; cout<<"ERROU\n"; cout<<"Pressione enter para continuar..."; getch(); return false; } } } } cout<<"ATAQUE NÃO PODE SER EFETUADO, TENTE NOVAMENTE\n"; cout<<"Pressione enter para continuar\n"; getch(); }while(flag==false); return false; } }; int main(){ // Gerar número randicos srand(time(NULL)); // Variáveis string nome_1; string nome_2; int vez; int cont; int jogador_op; bool flag=false; bool fim=false; string op; // Criando jogadores cout<< "Nome do jogador 1:"; cin>>nome_1; cout<< "Nome do jogador 2:"; cin>>nome_2; Jogador *j1 = new Jogador(); j1->nome=nome_1; Jogador *j2 = new Jogador(); j2->nome=nome_2; // Jogador 1 posiciona as peças cout<<"Jogador 1 hora de posicionar os barcos\n"; cout<<"Pressione enter para começar..."; getch(); for(cont=0;cont<2;cont++){ j1->posicionar_barco_2(); } j1->posicionar_barco_4(); // Jogador 2 posiciona os barcos cout<<"Jogador 2 hora de posicionar os barcos\n"; cout<<"Pressione enter para começar..."; getch(); for(cont=0;cont<2;cont++){ j2->posicionar_barco_2(); } j2->posicionar_barco_4(); system("cls"); // Cara ou coroa para decidir quem começa do{ cout<<"Vamos decdir quem começa...\n"; cout<<"Jogador 1 cara ou coroa (cara/coroa)?"; cin>>op; if(op=="cara"){ jogador_op=CARA; flag=true; }else{ if(op=="coroa"){ jogador_op=COROA; flag=true; } } }while(flag==false); if(rand()%2==jogador_op){ vez=1; cout<<"O jogador 1("<<j1->nome<<") começa..."; }else{ vez=2; cout<<"O jogador 2("<<j2->nome<<") começa..."; } cout<<"Pressione enter para começar o jogo\n"; getch(); // Objetos Jogador *atacante = new Jogador(); Jogador *atacado = new Jogador(); Jogador *vencedor = new Jogador(); Jogador *perdedor = new Jogador(); // Jogar até atingir o fim, ou seja, fim=true do{ if(vez==1){ atacante=j1; atacado=j2; }else{ atacante=j2; atacado=j1; } while(atacante->jogar(atacado)){ if(!atacado->verificar_pos()){ vencedor=atacante; perdedor=atacado; fim=true; break; } } if(vez==1){ vez++; }else{ vez--; } }while(fim==false); // Exibir resultado final system("cls"); cout<<"-----------\n"; cout<<"FIM DE JOGO\n"; cout<<"-----------\n\n"; cout<<"O vencedor foi "<<vencedor->nome<<" e o perdedor foi "<<perdedor->nome; return 0; }
Teoria do Caos - (Equação Logística)
Função boa para ler string em C
Customizar a Instalação do Linux Debian com Preseed
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
Um modo leve de ouvir/ver áudio/vídeo da internet em máquinas pererecas
Resolver algumas mensagens de erro do SSH
Instalar módulo de segurança do Banco do Brasil Warsaw do tipo .run
Linux Debian 11 Bullseye Reiniciando Sozinho (2)
O que você está ouvindo agora? [2] (194)
Bora fazer um teste? mbti (12)
Possível Migração de windows para linux ???? (pc da empresa) (2)