Batalha naval em C++

Publicado por Vitor Augusto M. Pio (última atualização em 29/09/2014)

[ Hits: 20.057 ]

Download batalha_naval.cxx




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.

  



Esconder código-fonte

#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;
}

Scripts recomendados

A - Comando strcmp

Balanceamento de parênteses utilizando Pilha

Utilizando acentuação na linguagem C

Calcular dia da semana a partir de uma data sugerida

Frases


  

Comentários
[1] Comentário enviado por Thihup em 01/10/2014 - 15:40h

Amigo , eu posso tentar implementar o SDL nesse jogo , se permitir

Bom script

T+

[2] Comentário enviado por Thihup em 01/10/2014 - 15:42h

Uma coisa importante , em C++, nao utilize o stdio.h nem o stdlib.h , utilize o cstdio e cstdlib.

Uma outra coisinha , o .cxx é experimental , se puder , troque p/ .cpp

T+

[3] Comentário enviado por removido em 05/10/2014 - 12:28h

Como se joga isso!Nao consigo abrir de jeito nenhum ¬¬


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts