Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Alguém, por favor, me ajuda a achar o erro ou entender a lógica que fez com que meu código não fosse interpretado corretamente

Pessoal, sei que não fiz o código da forma mais simples, mas gostaria de saber o que há de errado com ele. Eu coloquei pra exibir no console quais as coordenadas x e y, e mesmo elas estando dentro da margem de acerto, não aparece a mensagem programada. Mas as vezes, quando a coordenada está com 2 unidades de diferença (298, 299, 301, 302) a mensagem de acerto aparece.

<meta charset="UTF-8">
<canvas width="600" height="400"></canvas>

<script>

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');

    pincel.fillStyle = 'lightgray';
    pincel.fillRect(0, 0, 600, 400);

    var raio = 10;

    function desenhaCirculo(x, y, raio, cor) {

        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * Math.PI);
        pincel.fill();
    }

    function limpaTela() {

        pincel.clearRect(0, 0, 600, 400);
    }

    var intervaloX = [290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310];
    var intervaloY = [190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210];

    desenhaCirculo(300,200, raio + 20, 'red'); // maior círculo
    desenhaCirculo(300,200, raio + 10, 'white');
    desenhaCirculo(300,200, raio, 'red'); // menor circulo

    function dispara(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;


        for (var i = 0; i <= intervaloX.length; i++){

            if (x == intervaloX[i] && y == intervaloY[i]){
             alert('Parabéns! Você acertou o alvo');
            }
        }
        console.log(x, y);
    }


    tela.onclick = dispara;

</script>
2 respostas
solução!

Bom Dia Mauro, realmente você fez o código de uma maneira bem mais complexo do que precisava. Por exemplo, nos intervalos o ideal é você colocar o inicio e o fim, por exemplo intervalo em x tem começo em 290 e fim em 310.

Os números intermediários você resolve com um if muito simples.

if(valor >= [inicio do intervalo] && valor <= [fim do     intervalo]){
    console.log("Parabéns você acertou")
}

O que está dando problema no seu código é justamente essa verificação.

if (x == intervaloX[i] && y == intervaloY[i]){
             alert('Parabéns! Você acertou o alvo');
}

Veja que você está utilizando uma comparação de == para verificar se a posição do mouse é igual a alguma posição do seu array.

Acontece que a posição do mouse não se dá somente por números inteiros. O valor do mouse em X pode ser um número quebrado, por exemplo 199,003. E essa diferença que está te causando problemas, já que é muito complicado de acertar uma posição exata.

Muito Obrigado Ricardo, pelo que entendi, ele conta os números com vírgulas do meu intervalo, por exemplo 209,1 e como isso não tá no meu array, ele considera um erro? Muito obrigada pela explicação e pela sugestão de código, foram bem didáticas!