Batalha naval em C++
Publicado por Vitor Augusto M. Pio (última atualização em 29/09/2014)
[ Hits: 20.016 ]
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; }
Criando usuários através de arquivo texto
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta