Jogo da Velha, extrair linha e coluna da matriz passando posição

Bom dia! Estou desenvolvendo um jogo da velha e quero passar a posição informando um valor DOUBLE e depois extrair por meio de um cálculo matemático a linha e a coluna. Exemplo: posição 1,2 = linha 1, coluna 2.

Eu sei que eu poderia pedir primeiro a linha depois a coluna mas assim é muito fácil e eu não quero assim.

Só para vocês terem uma idéia melhor está aqui o método onde quero fazer isso:

public void jogar() {
      escreverMatriz();
      System.out.print("Posição: ");
      double posicao = ler.nextDouble();
        
      int linha = //(posicao * 10 / 2) - 1;
      int coluna = //(posicao % )
        
}

E qual o problema? Converta em String, faça split com o separador de unidades decimais (ponto ou vírgula, dependendo o caso) e pronto.

Eu não queria fazer conversão mas é uma solução. É que eu sei que tem como fazer porque eu já fiz mas não me lembro qual era o cálculo. Mas obrigado pela resposta.

double linhaColuna = 1.2;
int linha = (int) linhaColuna;
int coluna = (int) ((linhaColuna - linha) * 10);

Olá @staroski, eu testei aqui e a coluna deu 1. Você testou? Quanto deu?

Não havia testado, só postei a lógica, que está correta, veja:

double numeroReal = 1.2;
int parteInteira = (int) numeroReal;
int parteDecimal = (int) ((numeroReal - parteInteira) * 10);
System.out.println(parteInteira + " " + parteDecimal);

Acontece que a parteDecimal está ficando com 1 devido à uma característica da operação abaixo:

numeroReal - parteInteira

Isto é, 1.2 - 1 ao invés de retornar 0.2 acaba retornando 0.19999999999999996;

0.19999999999999996 * 10 = 1.9999999999999996;

Com o cast para int esse número é truncado para 1.

Como resolver então?

Simples, somar 0.5 na operação da parte decimal antes de fazer o cast para int, isso ocasionará um arredondamento da operação, dessa forma:

double numeroReal = 1.2;
int parteInteira = (int) numeroReal;
int parteDecimal = (int) (0.5 + ((numeroReal - parteInteira) * 10));
System.out.println(parteInteira + " " + parteDecimal);
1 curtida

Obrigado pela explicação, a lógica está certa mesmo.

1 curtida