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

Acertando o Alvo - Resolvendo com Arrays

Como forma de evoluir/tentar soluções diferentes(ainda que piores, vou desenvolver alguma habilidade) tentei resolver o exercicio proposto com arrays, mas não consigo criar um IF que contemple todas as areas devido ao incremento da var posicao.

<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();
    }

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

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




    function dispara(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
/*a partir daqui acredito que esteja o erro: quando posicao acha o clique certo, ao buscar no alvoY ele já começa com o valor herdado do if anterior)*/
    for(var posicao = 0; posicao < 10; posicao++){

        if(x == alvoX[posicao]){

            if(y == alvoY[posicao]){

                alert("voce acertou");


            }
        }
    }

    }

    tela.onclick = dispara;

</script>
3 respostas
solução!

O problema realmente está onde imaginou. O que acontece é que no seu for usa o mesmo contador de posição tanto para o x quanto para o y, então quando você encontra no array x a posição certa, se no array y a posição for outra vai dar errado. O que você precisa fazer é percorrer o array y com outro contador depois de encontrar a posição do x. Para isso pode usar um for dentro do seu for, assim:

    for(var posicaoX = 0; posicaoX < alvoX.length; posicaoX++){
        for(var posicaoY = 0; posicaoY < alvoY.length; posicaoY++){
            if (x == alvoX[posicaoX]){
                if (y == alvoY[posicaoY]){
                    alert("Acertou!");
                }
            }
        }
    }

Ahh e uma dica, no seu for, você colocou posicao < 10, mas seu array tinha mais elementos que isso, pra evitar esse erro, pode colocar o nome do array seguido de .length para saber o seu tamanho, no seu caso teria ficado:

for (var posicao = 0; posicao < alvoX.length ; posicao++)

Espero que tenha ajudado!

Funcionou sim, Vinicius! Muito Obrigado.