Jump to content
Fórum Script Brasil
  • 0

Dúvida em vetor com 2 dimensões


rodrigoamadeus

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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.

Edited by vangodp
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...