2
respostas

Gostaria de propor a correção do código "Acerte o Alvo"

Salvo melhor juízo, o código cerca se houve acerto do centro do alvo num quadrado de 10x10 pixels (solução da Alura) e não num círculo. Ou seja, se clico fora do centro do alvo, mas ainda dentro do quadrado de 10x10 pixels, o aviso de que cliquei dentro do alvo é acionado.

Se eu aumentar em +30 px cada um dos círculos do alvo, bem como se eu fizer as adaptações necessárias ao código, fica mais evidente este erro.

Porém, como o alvo é redondo, deve-se usar Pitágoras = x * x + y * y = d * d, onde d = distância, que, no caso, é o raio do centro do alvo. Os eixos x e y são perpendiculares, logo d é sempre uma hipotenusa de um triângulo retângulo.

Logo, a função dispara corrigida ficaria assim:

    function dispara(evento) {

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

        if (Math.sqrt((300 - x)*(300 - x) + (200 - y)*(200 - y)) <= raio) {
            alert('Acertou o alvo!');
        }
    }

Atenciosamente,

2 respostas

Caraca, nem tinha pensado nessa questão do quadrado, apenas dando os tamanhos. Faz todo sentido!

Queria só aproveitar o ganho do tópico sobre a tarefa Lucas, e tirar uma dúvida também. Posso?

Eu escrevi meu código assim:

if(x >= 290 || x <= 310 && y >= 290 || y <= 210){ [... mensagem e fim]

Está errado? Porque aparentemente, deu certo nos meus testes de cliques aqui.

Acredito que, no seu código, você teria que escrever tudo && (e), não deveria haver || (ou).

Ex. se você clicar pro lado direito do seu alvo, vai falar que você acertou, porque foi satisfeita a condição x>=290. Mas atenção! Se você clicar pro lado direito e fora do alvo, vai dizer que você acertou.

Pelo mesmo motivo, se você clicar para cima do alvo (y <= 210), ainda que fora do alvo, vai dizer que você acertou.