Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema batalha naval


Rafael AB

Pergunta

Estou tentando programar uma batalha naval e não consigo entender porque ao executar o programa com esse código anexado, as vezes as Fragatas "FFF" e os Submarinos "SSSSS" não estão sendo inseridos na matriz, eu n consigo achar o erro do código.

E também n entendo porque quando acerto uma mina o jogo não esta parando, sendo q coloquei um Contador como argumento nas funções de jogo do Jogador e do Computador para receber -50 no contador quando uma bomba fosse atingida e o while no main não está parando quando isso acontece, e tambem n entendo porque mesmo colocando uma função pro sorteio do Computador, e outra função para Jogador as matrizes estão iguais, mesmas posições de Minas e Embarcações.Gostaria que alguém me ajudasse com esses erros, ow pelo menos algum deles.


#include <stdio.h>
#include <conio.h>
#include <ctime>
#include <stdlib.h>
#include <time.h>

int O;

void Zerar_Matriz(char Matriz[][10])
{
int z,y;
for (y=0 ; y < 10; y++)
{
for (z=0 ; z < 10; z++)
{
Matriz[z][y] = 0;
}
}
}

void Zerar_Matriz_Camuflada(char Matriz[][10])
{
int z,y;
for (y=0 ; y < 10; y++)
{
for (z=0 ; z < 10; z++)
{
Matriz[z][y] = 'V';
}
}
}


void Insere_PortaAviao(char Matriz[][10])
{
int i,y,z,aux;
bool Verificador;
i = rand()%4;
y = rand()%10;
aux = i + 6;
for (z= i ; z <= aux; z++)
{
Matriz[z][y] = 'P';
}
}



void Insere_Submarino(char Matriz[][10])
{
int z,y,i,aux;
bool Verificador = true;
while (Verificador)
{
z = rand()%6;
y = rand()%10;
if (Matriz[z][y] == 0)
{
Verificador = false;
aux = z + 4;
i = z;
for (z ; z < aux ; z++)
{
if (Matriz[z][y] != 0)
{
Verificador = true;
break;
}
}
}
}
for (;i <= aux ; i++)
{
Matriz[i][y] = 'S';
}
}

void Insere_Fragata(char Matriz[][10])
{
int z,y,i,aux;
bool Verificador = true;
while (Verificador)
{
z = rand()%8;
y = rand()%10;
if (Matriz[z][y] == 0)
{
Verificador = false;
aux = z + 2;
i = z;
for (z ; z < aux ; z++)
{
if (Matriz[z][y] != 0)
{
Verificador = true;
break;
}
}
}
}
for (i ;i <= aux ;i++)
{
Matriz[i][y] = 'F';
}
}

void Insere_Mina(char Matriz[][10])
{
int z,y,i,aux;
bool Verificador = true;
while (Verificador)
{
z = rand()%10;
y = rand()%10;
if (Matriz[z][y] == 0)
{
Matriz[z][y] = 'M';
Verificador = false;
}
}
}

void Preencher_Matriz_Barco(char Matriz[][10])
{
Insere_PortaAviao(Matriz);
Insere_Submarino(Matriz);
Insere_Submarino(Matriz);
Insere_Fragata(Matriz);
Insere_Fragata(Matriz);
Insere_Mina(Matriz);
Insere_Mina(Matriz);
Insere_Mina(Matriz);
}

void Exibir_Matriz(char Matriz[][10])
{
int y,z;
printf (" Tabuleiro : Jogador \n\n");
printf (" 1 2 3 4 5 6 7 8 9 10\n");
for (y=0 ; y <= 9; y++)
{
if (y < 9) {printf ("%i ",y+1);}
if (y==9){printf ("%i",y+1);}
for (z=0 ; z <= 9; z++)
{
printf ("|_%c_|",Matriz[z][y]);
}
printf ("\n");
}
printf ("\n");
}

void Exibir_Matriz_Camuflada(char Matriz[][10])
{
int y,z;
printf (" Tabuleiro : Computador \n\n");
printf (" 1 2 3 4 5 6 7 8 9 10\n");
for (y=0 ; y <= 9; y++)
{
if (y < 9) {printf ("%i ",y+1);}
if (y==9) {printf ("%i",y+1);}
for (z=0 ; z <= 9; z++)
{
if (Matriz[z][y] != 'V')
{
if (Matriz[z][y] == 0)
{
printf ("|_ _|");
}
else
{
printf ("|_%c_|",Matriz[z][y]);
}
}
else
{
printf ("|_?_|");
}
}
printf ("\n");
}
printf ("\n");
}

void Computador_Joga(char Matriz[][10],char MatrizX[][10], int)
{
int z,y;
O = 0;
bool Verificador = true;
while (Verificador)
{
z = rand()%10;
y = rand()%10;
if ( MatrizX[z][y] == 'V')
{
if ( Matriz[z][y] != 0 )
{
if ( Matriz[z][y] == 'P' )
{
O++;
Matriz[z][y] = 'X';
printf ("O computador acertou parte de um Porta Aviao\n");
}
if ( Matriz[z][y] == 'S' )
{
Matriz[z][y] = 'X';
O++;
printf ("O computador acertou parte de um Submarino\n");
}
if ( Matriz[z][y] == 'F' )
{
Matriz[z][y] = 'X';
O++;
printf ("O computador acertou parte de uma Fragata\n");
}
if ( Matriz[z][y] == 'M' )
{
Matriz[z][y] = 'X';
O = -50;
printf ("O computador acertou uma Mina\n : Game Over, voce ganhou.\n");
}
}
else
{
Matriz[z][y] = 'A';
printf("O computador jogou : Agua\n");
}
MatrizX[z][y] = Matriz[z][y];
Verificador = false;
}
}
}


void Inicio(char Matriz[][10])
{
Zerar_Matriz(Matriz);
Preencher_Matriz_Barco(Matriz);
}


void Apostar(char Matriz[][10],char Matriz_Camuflada[][10], int)
{
int z,y;
O = 0;
srand (time(NULL));
bool Verificador = true;
while (Verificador)
{
printf ("Digite a coluna que voce deseja atacar (1-10) : ");
scanf ("%i", &z);
printf ("Digite a linha que voce deseja atacar (1-10) : ");
scanf ("%i", &y);
printf ("\n");
z = z - 1;
y = y - 1;
if (Matriz_Camuflada[z][y] == 'V')
{
if ( Matriz[z][y] != 0 )
{
if ( Matriz[z][y] == 'P' )
{
O++;
printf ("Voce acertou parte de um Porta Aviao\n");
}
if ( Matriz[z][y] == 'S' )
{
O++;
printf ("Voce acertou parte de um Submarino\n");
}
if ( Matriz[z][y] == 'F' )
{
O++;
printf ("Voce acertou parte de um Fragata\n");
}
if ( Matriz[z][y] == 'M' )
{
O = -50;
printf ("Voce acertou uma Mina\n Game Over, voce perdeu.\n");
}
}
else
{
printf("Agua\n");
}
Matriz_Camuflada[z][y] = Matriz[z][y];
Verificador = false;
}
else
{
printf ("Jogada invalida.\n\n");
}
}
}


main()
{
int Contador = 0;
int ContadorJogador = 0;
int ContadorComputador = 0;
char Computadorcm[10][10];
char Jogador[10][10];
char Computador[10][10];
char Jogadorcm[10][10];

Inicio(Jogador);
Inicio(Computador);
Exibir_Matriz(Jogador);
Zerar_Matriz_Camuflada(Computadorcm);
Zerar_Matriz_Camuflada(Jogadorcm);
Exibir_Matriz_Camuflada(Computadorcm);
while (Contador >= 0)
{
Contador = 0;
Apostar(Computador,Computadorcm,Contador);
_sleep(1500);
ContadorJogador += O;
if (ContadorJogador < 0) {exit(0); }
else if (ContadorJogador == 23) { printf ("Voce ganhou.\n Parabens."); getch(); exit(0); }
Contador = 0;
Computador_Joga(Jogador,Jogadorcm,Contador);
Exibir_Matriz(Jogador);
Exibir_Matriz_Camuflada(Computadorcm);
_sleep(1500);
ContadorComputador += O;
if (ContadorComputador < 0) {exit(0); }
else if (ContadorJogador == 23) { printf ("Voce perdeu.\n Mais sorte da proxima vez."); getch(); exit(0); }
}
getch();
}
[/codebox]

Editado por Rafael AB
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

viu existem algumas funcoes memset(matriz, 0, sizeof(matriz) q zeram ela e/ou preenchem com o caracter desejado!!

mas quanto ao codigo....voce chegou a debugar ele??

eu debuguei aki e vi que ele sai nessa linha

if ( (i >=7 ) && (i <= 9) )
        Verificador = true;

agora eu n entendi muito bem sua logica...mas da um check....

abrasss

Link para o comentário
Compartilhar em outros sites

  • 0

if ( (i >=7 ) && (i <= 9) )
        Verificador = true;

então, usei isso ai, porque pensei na seguinte hipotese, c o random do i for 7,8 ou 9 ele n conseguiria preencher levanto em conta q ele usa 3 espaços numa linha para escrever o 'FFF'

vou pesquisar sobre o q você me falou, ver c consigo aqui, mesmo assim, Obrigado pela ajuda.

Debuguei ele, compilei e mandei rodar em Dev-C++ e rodou tranquilamente sem acusar erro...

Editado por Rafael AB
Link para o comentário
Compartilhar em outros sites

  • 0

Já resolvi o problema de quando acertar a mina parar o programa e dar game over, só n entendi ainda porque as duas matrizes estão sendo preenchidas igualmente e o problema com o preenchimento tb de Sumarinos e Fragatas.

erro não da...só que ele passa pela funcao que coloca a fragata, mas ele sai dela antes de colocar... (as vezes) dependendo do random :P

Você sabe me dizer porque ta acontecendo isso?

Tem alguma ideia de como posso solucionar o problema das Fragatas e dos Submarinos? (Levando em conta que o código ta quase igual pros 2)

Desde de já agradeço.

Editado por Rafael AB
Link para o comentário
Compartilhar em outros sites

  • 0

cara....eu fiz uma funcaozinha aqui...que poe qualquer barco q você desejar...

(ela não ta muito boa não, porque eu tentei fazer de um jeito que voce não tivesse que arrumar o resto do teu codigo)

segue a funcao:

#define DIREITA     0
#define ESQUERDA    1
#define CIMA        2
#define BAIXO       3

void PlaceBoat(char cMatriz[][10], int iLenght, char cChar)
{
    bool bPlaced = false;
    bool bTryPut = false;
    int iX, iY;
    int iDirs[4];
    
    while(!bPlaced)
    {
        iX = rand()%10;
        iY = rand()%10;
        if(cMatriz[iX][iY])
            continue;
        if(iLenght == 1)
        {
            cMatriz[iX][iY] = cChar;
            bPlaced = true;
            break;
        }
        
        for(int i = 0; i < 4; i++)
            iDirs[i] = 1;
            
        if(iX - iLenght < 0 )
            iDirs[DIREITA] = 0;
        if(iX + iLenght > 9 )
            iDirs[ESQUERDA] = 0;
        if(iY - iLenght < 0 )
            iDirs[CIMA] = 0;
        if(iY + iLenght > 9 )
            iDirs[BAIXO] = 0;
        
        for(int i = 0; i < 4; i++)
        {
            if(iDirs[i])
            {
                bTryPut = true;
                break;
            }
        }
        
        while(bTryPut)
        {
            bTryPut = false;
            if(iDirs[DIREITA])
            {
                for(int i = 0; i < iLenght; i++)
                {
                    if(cMatriz[iX+i][iY])
                    {
                        bTryPut = true;
                        iDirs[DIREITA] = 0;
                        break;
                    }
                }
                if(!bTryPut)
                {
                    for(int i = 0; i < iLenght; i++)
                        cMatriz[iX+i][iY] = cChar;
                    bPlaced = true;
                    break;
                }
            }
            bTryPut = false;
            if(iDirs[ESQUERDA])
            {
                for(int i = 0; i < iLenght; i++)
                {
                    if(cMatriz[iX-i][iY])
                    {
                        bTryPut = true;
                        iDirs[ESQUERDA] = 0;
                        break;
                    }
                }
                if(!bTryPut)
                {
                    for(int i = 0; i < iLenght; i++)
                        cMatriz[iX-i][iY] = cChar;
                    bPlaced = true;
                    break;
                }
            }
            bTryPut = false;
            if(iDirs[CIMA])
            {
                for(int i = 0; i < iLenght; i++)
                {
                    if(cMatriz[iX][iY-i])
                    {
                        bTryPut = true;
                        iDirs[CIMA] = 0;
                        break;
                    }
                }
                if(!bTryPut)
                {
                    for(int i = 0; i < iLenght; i++)
                        cMatriz[iX][iY-i] = cChar;
                    bPlaced = true;
                    break;
                }
            }
            bTryPut = false;
            if(iDirs[BAIXO])
            {
                for(int i = 0; i < iLenght; i++)
                {
                    if(cMatriz[iX][iY+i])
                    {
                        bTryPut = true;
                        iDirs[BAIXO] = 0;
                        break;
                    }
                }
                if(!bTryPut)
                {
                    for(int i = 0; i < iLenght; i++)
                        cMatriz[iX][iY+i] = cChar;
                    bPlaced = true;
                    break;
                }
            }
            bTryPut = false;
        }
        
    }
}
dai eu troquei esta funcao:
void Preencher_Matriz_Barco(char Matriz[][10]) {
    Insere_PortaAviao(Matriz);
    Insere_Submarino(Matriz);
    Insere_Submarino(Matriz);
    Insere_Fragata(Matriz);
    Insere_Fragata(Matriz);
    Insere_Mina(Matriz);
    Insere_Mina(Matriz);
    Insere_Mina(Matriz);
}
por esta:
void Preencher_Matriz_Barco(char Matriz[][10]) {
    PlaceBoat(Matriz, 6, 'P');
    PlaceBoat(Matriz, 4, 'S');
    PlaceBoat(Matriz, 4, 'S');
    PlaceBoat(Matriz, 2, 'F');
    PlaceBoat(Matriz, 2, 'F');
    PlaceBoat(Matriz, 1, 'M');
    PlaceBoat(Matriz, 1, 'M');
    PlaceBoat(Matriz, 1, 'M');
}

espero ter ajudado

a sugestao que te dou, é que sempre que tiver que fazer alguma coisa que vai fazer mais de uma vez (mesmo que seja um pokim diferente), crie uma funcao generica, vai te poupar trabalho, e fica mais facil dar manutencao depois :D!!

abrassss

ps: o codigo não esta muito bem escrito não.. da pra melhorar ele!!!

ahh.... esqueci de mencionar.....

voce só precisa utilizar a funcao srand 1 vez no programa inteiro....

eu coloquei ela no main

antes da funcao de Inicio

srand(time(NULL));

Editado por w0lv3r1n3
Link para o comentário
Compartilhar em outros sites

  • 0

Pow seguinte, já tinha resolvido aquele código de outra maneira, ia postar agora que tinha conseguido resolver já, mas teria como você me ajudar a entender qual o erro que ta dando nessa função que tentei criar agora?

Eu tentei criar uma função de AI pro pc chamada AI_PC, editei o código do post lá em cima pro meu código atual.

Me parece que não ta executando a função Computador_Joga q ta dentro da AI_PC. Mas n entendi porque, c você puder me ajudar.

E obrigado pela ajuda ai com o código do barco, vou salvar esse código, pra otimizar o joguinho lá ^^, mas o negócio é q é trabalho de escola não é?, n seria justo eu usar seu código pra ganhar pontos, mas foi de grande ajuda do mesmo jeito.

Editado por Rafael AB
Link para o comentário
Compartilhar em outros sites

  • 0

então.... achei alguns errinhos...

ele não esta passando pela funcao, porque voce chama ela passando alguns parametros

AI_PC(Jogador,Jogadorcm,y,z,Contador);

tanto o y quanto o z estao valendo 0

então ele entra nesse if:

if ((z == 0) && (y == 0))

e não passa pelo else, que é aonde tem a funcao:

Computador_Joga

....fora isso voce ainda esta fazendo:

ContadorJogador += O;

(inteiro ) += O (letra O);

não entendi qual o objetivo de somar a letra o nessa variavel....

da uma reformulada no teu codigo....

tenta fazer um esboco dele no papel...antes de comecar a programar

tenta pensar em todas as logicas antes de comecar a programar também...

qualquer coisa posta ai

Link para o comentário
Compartilhar em outros sites

  • 0

Pow já tentei de td e ainda não consegui implementar Inteligência Artificial nesse meu código... vou voltar o código ao normal sem minha tentativa de código de IA que só complicou mais ainda o q fiz, se alguém puder me ajudar a implementar a IA, eu pensei no seguinte, se um Barco for atingido por exemplo um Porta Aviao = PPPPPPP. O computador teria q ir tentando atingir o resto dele, por exemplo o porta avião foi atingido PPXPPPP o computador jogaria pra frente --> até atingir agua ou se chegasse em 7 o numero de acertos nesse Porta Avião, caso atingido agua, ele tentaria para trás <-- até atingir os 7, dps continuaria jogando normalmente até q outro barco fosse atingido, vou colocar meu código sem IA, se alguém tiver alguma ideia de como posso fazer posta ae, to prescisando fazer isso.

Desde de já agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0

Cara....tenta da uma olhada sobre maquina finita de estados (FSM - finity state machine)

ela funcionaria mais ou menos assim (pro batalha naval)

2 estados:

1 - Aleatorio

2 - Destruir barco encontrado

No modo aleatorio:

fazer um random, e atirar, ateh acertar algum barco, dai voce muda o estado pra Destruir barco encontrado...

No modo Destruir barco encontrado:

voce tem que checar todos os lados que o barco podem estar, cima, baixo, esq, direita, e a quantidades de pecas q o barco tem (no caso de encontrar o P , 6).

dai de acordo com a direcao escolhida voce vai atirar.... se for agua e a quantidade acertada ainda for menor que 6, escolhe outra direcao....

ficando assim ateh chegar a quantidade acertada = a qtd de pecas...

quando isso acontece, você muda pro estado aleatorio dinovo :D!!

espero ter ajudado...dps quando tiver um tempo eu tento fazer um cod parecido pra você ve!!

abrassss

Link para o comentário
Compartilhar em outros sites

  • 0

Deu pra tirar umas ideias do q você falou ^^

Ta quase td pronto aqui, falta só consertar alguns erros e tal, quando ficar pronto posto como fiz, usei if no lugar de FSM por ser um trabalho da escola e meu professor ainda n ter ensinado esse método, mas pelo q olhei na internet é tranquilo usar ele...

Mas é só pra ele n reclamar dps sabe...

Obrigado pela ajuda.

Depois quando puder fazer o código posta ae, ficarei agradecido.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...