Batalha naval em C++
Publicado por Vitor Augusto M. Pio (última atualização em 29/09/2014)
[ Hits: 20.613 ]
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;
}
Pedindo uma senha ao usuário!!!
Distribuição Eletronica de Elementos Químicos em C++
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Instalação dualboot Windows 11 e Debian 13 (0)
Programa fora de escala na tela do pc (33)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









