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

Dúvida em vetor com 2 dimensões


rodrigoamadeus

Pergunta

Galera, tenho que escrever um programa para o jogo batalha naval e estou encontrando dificuldades em como incluir os navios no mapa. Sempre que um navio começa/ termina na borda, ele volta para a ultima coluna da linha anterior ou pula para a primeira coluna da linha seguinte, respectivamente.

Segue uma parte do código:

void Ship::setShip(char ship, int ship_size, char tabPlayer[9][9]){
int coordinate1, coordinate2, auxCol, row, col, optCord = 0;
char position;
bool vertical = true;
cout << "Select the row you want to place: " << endl;
cin >> row;
cout << "Select the collumn you want to place: " << endl;
cin >> col;
cout << "Select the ship direction: vertical or horizontal (V/H). " << endl;
cin >> position;
if (position == 'H' || position == 'h')
vertical = false;
if (vertical == false)
{
coordinate1 = col - (ship_size - 1);
coordinate2 = col + (ship_size - 1);
int min_ = 0 + (ship_size - 1 );
int max_ = 9 - (ship_size - 1 );
if ( col >= min_ && col <= max_ )
{
cout << "For the second coordinate, select one of the options: " << endl;
cout << "1: " << "[" << row << ", " << coordinate1 << "]" << endl;
cout << "2: " << "[" << row << ", " << coordinate2 << "]" << endl;
cin >> optCord;
if ( optCord == 1 )
{
for (int j = coordinate1 ; j <= col; ++j)
{
tabPlayer[row][j] = ship; //ERRO
}
}
else
{
for (int j = col; j <= coordinate2; ++j)
{
tabPlayer[row][j] = ship;
}
}
}
Se eu executar o comando setShip('A', 5, tabPlayer[9][9]), sendo 'A' o caracter que eu quero inserir, 5 como tamanho do navio e a vetor 2D que irei utilizar, e escolher a row = 3 e col = 4 e setar como posição horizontal, ele calculará automaticamente quais seram as duas possibilidade de posicionar o navio.

As opções serão ou [3][0], ou [3][8]. Se eu escolher a segunda opção, funciona beleza, mas a primeira opção, fica assim:

- - - - - - - - - -

- - - - - - - - - -

- - - - - - - - - A

A A A A A - - - - -

- - - - - - - - - -

- - - - - - - - - -

- - - - - - - - - -

- - - - - - - - - -

- - - - - - - - - -

- - - - - - - - - -

O mesmo occore quando a última posição fica na borda. Ele pula de linha e escreve. Qual seria o problema? :(

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Isso é por que a memoria é em linha e não bidimensional.

O perigo é você sair pelo inicio ou pelo final.

si você tiver uma matriz[3][3]:

[0][1][2]

[3][4][5]

[6][7][8]
Na memoria ela esta representada assim:

[0][1][2][3][4][5][6][7][8]

Si você sair pelo 5 você vai parar no 6, si você sair pelo 3 você vai parar no 2.

você ate pode aceder a todas as casinhas assim:

matriz[0][0] <-inicio

matriz[0][1]

matriz[0][2]

matriz[0][3]

matriz[0][4]

matriz[0][5]

matriz[0][6]

matriz[0][7]

matriz[0][8] <-final

pode imprimir com cout o printf como si de um array se trata-se. cout << matriz[0][8] << endl;

Então não saia pelos extremos por que ai você esta invadindo memoria não reservada.
Pense que a memoria ram é uma avenida muito grande cheia de casas iguais todas elas numeradas. Uma matriz é uma forma diferente de representar a memoria, mas a memoria e em linha, lembre-se disso.

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

  • 0

Ola camarada, eu copiei o código e tive vários erros por causa do fechamento das chaves.

Então eu passei o seu código a limpo e fechando as chaves na ordem que achei correto.

void addShip(int size, char ship, char arg[9][9])
{
    int coord1, coord2, row, col, optCoord, m1, m2;
    char pos;

    cout << "Entre uma linha 0 - 8" << endl;
    cin >> row;

    cout << "Entre uma coluna 0 - 8" << endl;
    cin >> col;

    cout << "Selecione uma posição V/H" << endl;
    cin >> pos;

    if (pos == 'H' || pos == 'h')
    {
        coord1 = col - (size - 1);
        coord2 = col + (size - 1);
        m1 = 0 + (size - 1);
        m2 = 9 - (size - 1);
    }

    if (col >= m1 && col <= m2)
    {
        cout << "Selecione uma opção" << endl;
        cout << "1: [" << row << ", " << coord1 << "]" << endl;
        cout << "2: [" << row << ", " << coord2 << "]" << endl;
        cin >> optCoord;
    }

    if (optCoord == 1)
    {
        for (int i = coord1; i <= col; i++)
            arg[row][i] = ship;
    }
    else
    {
        for (int i = col; i <= coord2; i++)
            arg[row][i] = ship;
    }
}

Mudei o nome de algumas variáveis apenas para ir mais rápido, a logica do código esta inalterada(entre aspas eu tirei a variável bool e uma outra que não estava sendo usada), e funciona como esperado

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
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...