• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Havoc

Ajuda Urgente - Batalha Naval Colocação de Barcos

6 mensagens neste tópico

Boas, tenho de acabar o jogo da Batalha Naval. No entanto estou com problemas para fazer a colocação dos barcos, uma vez que se sobrepoe ou ficam encostados. Os barcos tem de ser colocados aleatoriamente. O código que tenho feito para a colocação dos barcos é o seguinte:

void coloca_barcos(char tabuleiro[10][10], int dim_barco, int nr_barcos)
{
        int linha,coluna,orientacao,i,j,z=0,verificar;
        char direccao;
        srand(time(0));
        while (z<nr_barcos)
        {
                linha=rand()%10;
                coluna=rand()%10;
                orientacao=rand()%10;
                if (orientacao<5)//vertical
                {
                        direccao='v';
                        verificar=verifica_tabuleiro(tabuleiro,linha,coluna,direccao);
                        if((linha+dim_barco)>9||verificar==1)
                                continue;
                        else
                        {
                          tabuleiro[linha][coluna]='x';
                          for (i=0; i<dim_barco; i++)
                                tabuleiro[linha+i][coluna]='x';
                        }
                }
                else
                {
                        direccao='h';
                        verificar=verifica_tabuleiro(tabuleiro,linha,coluna,direccao);
                        if ((coluna+dim_barco)>9)
                                continue;
                        else
                        {
                                tabuleiro[linha][coluna]='x';
                                for (j=0; j<dim_barco; j++)
                                        tabuleiro[linha][coluna+j]='x';
                        }
                }
                z++;
        }

}

int verifica_tabuleiro(char tabuleiro[10][10], int linha, int coluna, char direccao)
{
        if (direccao=='v')
                        if (tabuleiro[linha][coluna]=='x'||tabuleiro[linha+1][coluna]=='x'||tabuleiro[linha-1][coluna]=='x')
                                return 1;
                        else
                                return 0;
        else
                        if (tabuleiro[linha][coluna]=='x'||tabuleiro[linha][coluna+1]=='x'||tabuleiro[linha][coluna-1]=='x')
                                return 1;
                        else
                                return 0;
}

Alguem ajuda? Preciso disto para Quarta-feira...  :down:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é a dimensão dos barcos? Esse código só parece funcionar para barcos com dimensão = 1 porque tu no verifica tabuleiro só fazes testes em relação a uma posição -> a posição dada pelo random.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os barcos tem dimensoes variadas. A funçao depois é chamada no modulo principal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em cima já disse que só testas uma posição. Tens de testar todas as posições que o barco vai ocupar.

Eu já não jogo batalha naval à imenso tempo, mas não percebi o teu teste de vizinhança: se o barco for vertical, só testas a posição acima e abaixo, não falta verificar a posição esquerda e direita?

E cuidado que  linha-1 ou linha+1ou os testes de colunas podem sair dos limites da matriz do tabuleiro. Deves testar primeiro se esse valor se encontra entre 0 e 9.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A verificação do tamanho do barco em relaçao ao tabuleiro já é feita em cima. Eu so estou a ver a posiçao inicial do barco porque se essa estiver ocupada a ideia é que ele gere aleatoriamente outra posição.

Agora estou com um problema no sistema de tiros, não sei porque este ciclo so me esta a fazer um dos Scanf, o primeiro. Alguma ideia de porque? A ideia é que ele repita a leitura de uma linha e coluna inserida pelo jogador e compare com a linha e coluna do tabuleiro, se tiver la um X que aumente a pontução em 1. E que repita isto tantas vezes quanto as que o jogador insere na variavel nr_maximo.

int jogar(char tabuleiro[10][10])
{
        int i,j=1,nr_maximo,linha,pontos=0, colunas;
        char coluna;
        clrscr();
        printf("Introduza o numero maximo de jogadas: ");
        scanf("%d",&nr_maximo);
        while (j<=nr_maximo)
        {
                        printf ("Escolha uma linha de 0 a 9: \n");
                        scanf("%d",&linha);
                        printf ("Escolha uma coluna de A a J: \n");
                        scanf("%c",&coluna);
                        colunas=transforma_coluna(coluna);
                        if (tabuleiro[linha][colunas]=='x')
                                pontos++;
        j++;
        }
        return pontos;
}

int transforma_coluna(char colunas)
{
                        int coluna;
                        switch (colunas)
                        {
                                case 'A':
                                case 'a':
                                {
                                        coluna=0;
                                }
                                case 'B':
                                case 'b':
                                {
                                        coluna=1;
                                }
                                case 'C':
                                case 'c':
                                {
                                        coluna=2;
                                }
                                case 'D':
                                case 'd':
                                {
                                        coluna=3;
                                }
                                case 'E':
                                case 'e':
                                {
                                         coluna=4;
                                }
                                case 'F':
                                case 'f':
                                {
                                        coluna=5;
                                }
                                case 'G':
                                case 'g':
                                {
                                        coluna=6;
                                }
                                case 'H':
                                case 'h':
                                {
                                        coluna=7;
                                }
                                case 'I':
                                case 'i':
                                {
                                        coluna=8;
                                }
                                case 'J':
                                case 'j':
                                {
                                        coluna=9;
                                }
                        }
        return coluna;
}

:lamo:

Ok, este está resolvido com um fflush(stdin); depois do primeiro scanf.

        while (j<nr_maximo)
        {
                        printf ("Escolha uma linha de 0 a 9: \n");
                        scanf("%d",&linha);
                        fflush(stdin);
                        printf ("Escolha uma coluna de A a J: \n");
                        scanf("%c",&coluna);
                        colunas=transforma_coluna(coluna);
                        if (tabuleiro[linha][colunas]=='x')
                                pontos++;
        j++;
        }

So falta mesmo o dos barcos.

Só um aparte. A função que coloca os barcos é chamada na parte principal do programa com os parametros tabuleiro, tamanho do barco e numero de barcos.

Eu pensei em faze-la de forma a chama-la uma vez para cada tamanho de barcos. Ou seja para colocar os 4 barcos de 1 ficava:

coloca_barcos(tabuleiro,1,4);

para colocar os 3 barcos de 2:

coloca_barcos(tabuleiro,2,3);

Continuo com o problema da sobreposiçao de barcos ou de ficarem encostados. Ninguem tem sugestoes?

mogers eu não consigo perceber a tua...  :'(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok eu sei que estou a fazer double post, mas fiz alterações ao codigo inicial de maneira que isto ja esta a ficar melhor mas continua a colocar-me barcos encostados e sobrepostos, com menos frequencia mas continua.

void coloca_barcos(char tabuleiro[10][10], int dim_barco, int nr_barcos)
{
        int linha,coluna,orientacao,i,j,z=0,verificar=0;
        char direccao;
        srand(time(0));
        while (z<nr_barcos)
        {
                linha=rand()%10;
                coluna=rand()%10;
                orientacao=rand()%10;
                if (orientacao<5)//vertical
                {
                        direccao='v';
                        verificar=verifica_tabuleiro(tabuleiro,linha,coluna,direccao,dim_barco);
                        if((linha+dim_barco)>9||verificar==1)
                                continue;
                        else
                        {
                          tabuleiro[linha][coluna]='x';
                          for (i=0; i<dim_barco; i++)
                                tabuleiro[linha+i][coluna]='x';
                        }
                }
                else//horizontal
                {
                        direccao='h';
                        verificar=verifica_tabuleiro(tabuleiro,linha,coluna,direccao,dim_barco);
                        if ((coluna+dim_barco)>9||verificar==1)
                                continue;
                        else
                        {
                                tabuleiro[linha][coluna]='x';
                                for (j=0; j<dim_barco; j++)
                                        tabuleiro[linha][coluna+j]='x';
                        }
                }
                z++;
        }

}

int verifica_tabuleiro(char tabuleiro[10][10], int linha, int coluna, char direccao,int dim_barco)
{
        int i,j;
        if (direccao=='v')
        {
                        if (tabuleiro[linha][coluna]=='x'||tabuleiro[linha+1][coluna]=='x'||tabuleiro[linha-1][coluna]=='x'||tabuleiro[linha][coluna-1]=='x'||tabuleiro[linha][coluna+1]=='x')
                                return 1;
                        else
                                return 0;
        }
        else
        {
                        if (tabuleiro[linha][coluna]=='x'||tabuleiro[linha][coluna+1]=='x'||tabuleiro[linha][coluna-1]=='x'||tabuleiro[linha-1][coluna]=='x'||tabuleiro[linha+1][coluna]=='x')
                                return 1;
                        else
                                return 0;
        }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora