Batalha naval em C++
Publicado por Vitor Augusto M. Pio (última atualização em 29/09/2014)
[ Hits: 20.614 ]
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;
}
Programa para cálculo de números complexos
CalDOS - 60 funções em uma calculadora
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?
Programa fora de escala na tela do pc [RESOLVIDO] (43)
\Boot sem espaço em disco (Fedora KDE Plasma 42) (5)
Preciso recuperar videos *.mp4 corrompidos (0)









