Batalha naval em C++
Publicado por Vitor Augusto M. Pio (última atualização em 29/09/2014)
[ Hits: 20.733 ]
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;
}
Angelinux Scripts - Palpite para Megasena em C
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como fazer a conversão binária e aplicar as restrições no Linux
Como quebrar a senha de um servidor Linux Debian
Como bloquear pendrive em uma rede Linux
Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual
Instalar GRUB sem archinstall no Arch Linux em UEFI Problemático









