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

Não consigo implementar um sistema de difículdade

Olá! Eu estou tentando implementar um sistema de escolha de dificuldades, mas travei numa parte e não estou conseguindo fazer o setInterval mudar a velocidade do jogo.

Usei o código dado no nesse tópico. O código do Raul Guilherme.

function menuDificulade() {
            var opt = prompt('Escolha a difículdade?');
            switch (opt) {
                case 1:
                    intervalo = 2600;
                    break;
                case 2:
                    intervalo = 1600;
                    break;
                case 3:
                    intervalo = 800;
                    break;
                default:
                    Text = 'Opção invalida!';
                    break;
            }
        }

Usei variáveis e um if como no código, mas não deu em nada, teria também como ao invés de um prompt, usar botões?

10 respostas

Boa tarde! Como vai?

Usei variáveis e um if como no código, mas não deu em nada, teria também como ao invés de um prompt, usar botões?

Sim, mas primeiro vamos começar pela parte importante que é a implementação correta da dificuldade do jogo!

O que está acontecendo após a escolha da dificuldade? O seu código dá algum erro? Já verificou se é exibida alguma mensagem no console do desenvolvedor do navegador?

Com essas informações eu poderei te ajudar de uma forma mais efetiva!

Grande abraço e bons estudos!

Boa tarde Gabriel!

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Bala no Alvo</title>
</head>

<body>
    <input type="text" value="0" disabled>
    <canvas width="600" height="400"></canvas>
    <script>

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

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

        var raio = 10;
        var xAleatorio;
        var yAleatorio;
        var intervalo = 2600;
        var loop = setInterval(atualizaTela, intervalo);


        //alert('Acerte o alvo e melhore sua mira, a cada acerto no alvo você irá acumular mais 10 pontos');

        function menuDificulade() {
            var opt = prompt('Escolha a difículdade? 1 - Facil / 2 - Medio / 3 - Dificil.');
            switch (opt) {
                case 1:
                    intervalo = 2600;
                    break;
                case 2:
                    intervalo = 1600;
                    break;
                case 3:
                    intervalo = 800;
                    break;
                default:
                    Text = 'Opção invalida!';
                    break;
            }
        }
        function aumentaPlacar(pontosGanhos) {
            var valorPlacar = parseInt(placar.value);
            placar.value = valorPlacar + pontosGanhos;
        }
        function limpaTela() {
            pincel.clearRect(0, 0, 600, 400);
        }
        function desenhaCirculo(posX, posY, raio, cor) {
            pincel.fillStyle = cor;
            pincel.beginPath();
            pincel.arc(posX, posY, raio, 0, 2 * Math.PI);
            pincel.fill();
        }
        function desenhaAlvo(x, y) {
            desenhaCirculo(x, y, raio + 20, 'red'); // maior círculo
            desenhaCirculo(x, y, raio + 10, 'white');
            desenhaCirculo(x, y, raio, 'red'); // menor circulo
        }
        function sorteiaPosição(maximo) {
            return Math.floor(Math.random() * maximo);
        }
        function atualizaTela() {
            limpaTela();
            xAleatorio = sorteiaPosição(600);
            yAleatorio = sorteiaPosição(400);
            desenhaAlvo(xAleatorio, yAleatorio);
        }
        function dispara(evento) {
            var x = evento.pageX - tela.offsetLeft;
            var y = evento.pageY - tela.offsetTop;

            if (x > xAleatorio - raio
                && x < xAleatorio + raio
                && y > yAleatorio - raio
                && y < yAleatorio + raio) {
                alert('Acertou! Mais 10 pontos');
                aumentaPlacar(10);
                intervalo = intervalo - 200;
                clearInterval(loop);
                loop = setInterval(atualizaTela, intervalo);
            }
        }
        menuDificulade();
        setInterval(atualizaTela, intervalo);
        tela.onclick = dispara;
        aumentaPlacar;
    </script>
</body>

</html>

Esse é meu código todo, travei e não to conseguindo implementar o menu de dificuldade, fiz umas adições com base no que está em outros tópicos, como o placar e um aumento da velocidade a cada acerto, mas eu quero que já possa começar rápido com esse sistema de escolha de dificuldade, porém empaquei aí.

solução!

Boa tarde!

Testei aqui, e seu problema está no switch da função menuDificulade().

O prompt() retorna um texto, não número. Então o código não acaba entrando em nenhum caso.

Deixe a função da seguinte forma:

function menuDificulade() {
            var opt = prompt('Escolha a difículdade? 1 - Facil / 2 - Medio / 3 - Dificil.');
            switch (opt) {
                case '1':
                    intervalo = 2600;
                    break;
                case '2':
                    intervalo = 1600;
                    break;
                case '3':
                    intervalo = 800;
                    break;
                default:
                    Text = 'Opção invalida!';
                    break;
            }
        }

Aqui funcionou ;)

Dica: Sempre utilize do console.log() para testar. Se você colocasse um console.log(typeof opt); após o prompt, teria visto que a resposta era uma string e estava comparando com um inteiro, uma comparação não possível.

Espero ter ajudado.

Entendi Caique, muito obrigado pela ajuda e pela dica, vou passar a usar mais o console.log(), agora tenho mais uma duvida, tem como fazer essa escolha com botões ao invés de um prompt

FattoriaWeb, o problema apontado pelo Caique está correto! O problema era justamente vc receber como resultado do prompt() um valor textual e comparar nas cláusulas case com um valor numérico.

Isso acontece pq o case do switch funciona usando por baixo dos panos o operador de comparação de igualdade estrita ===, como é descrito nesse trecho da documentação:

O programa primeiro procura por um caso o qual a expressão avalie como tendo o mesmo valor que o input da expressão (usando a comparação de igualdade estrita, ===) transferindo assim o controle para a cláusula encontrada e em seguida execudando as instruções associadas.

Ou seja, isso quer dizer que se em vez do switch vc tivesse utilizado várias instruções if do tipo:

if (opt == 1) {
     // implementação da sua lógica.
}

Tudo teria funcionado como vc esperava mesmo com a variável opt recebendo valores do tipo string! Esse comportamento ocorre pq no JavaScript o operador de comparação == apenas verifica os valores e não o tipo dos dados. Portanto, '1' == 1 retorna true enquanto '1' === 1 retorna false.

agora tenho mais uma duvida, tem como fazer essa escolha com botões ao invés de um prompt.

Sobre isso, como vc gostaria de fazer? Seriam 3 botões cada um deles para um nível de dificuldade?

Sim, Gabriel, seriam 3 botões, cada um com um nível de dificuldade.

Obrigado pela explicação, fiz aqui com o switch mesmo e deu certo :)

Olá FattorialWeb, tudo bem?

Fiz o que você pediu, ficou da seguinte forma:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Bala no Alvo</title>
</head>
<body>
    <input type="text" value="0" disabled>
    <button onclick="setDificuldade(2600)">Fácil</button>
    <button onclick="setDificuldade(1600)">Médio</button>
    <button onclick="setDificuldade(800)">Difícil</button>
    <canvas width="600" height="400"></canvas>
    <script>

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

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

        var raio = 10;
        var xAleatorio;
        var yAleatorio;
        var intervalo = 2600;
        var loop = setInterval(atualizaTela, intervalo);

        function setDificuldade(valor){
            intervalo = valor;
            clearInterval(loop);
            loop = setInterval(atualizaTela, intervalo);
        }
        function aumentaPlacar(pontosGanhos) {
            var valorPlacar = parseInt(placar.value);
            placar.value = valorPlacar + pontosGanhos;
        }
        function limpaTela() {
            pincel.clearRect(0, 0, 600, 400);
        }
        function desenhaCirculo(posX, posY, raio, cor) {
            pincel.fillStyle = cor;
            pincel.beginPath();
            pincel.arc(posX, posY, raio, 0, 2 * Math.PI);
            pincel.fill();
        }
        function desenhaAlvo(x, y) {
            desenhaCirculo(x, y, raio + 20, 'red'); // maior círculo
            desenhaCirculo(x, y, raio + 10, 'white');
            desenhaCirculo(x, y, raio, 'red'); // menor circulo
        }
        function sorteiaPosição(maximo) {
            return Math.floor(Math.random() * maximo);
        }
        function atualizaTela() {
            limpaTela();
            xAleatorio = sorteiaPosição(600);
            yAleatorio = sorteiaPosição(400);
            desenhaAlvo(xAleatorio, yAleatorio);
        }
        function dispara(evento) {
            var x = evento.pageX - tela.offsetLeft;
            var y = evento.pageY - tela.offsetTop;

            if (x > xAleatorio - raio
                && x < xAleatorio + raio
                && y > yAleatorio - raio
                && y < yAleatorio + raio) {
                alert('Acertou! Mais 10 pontos');
                aumentaPlacar(10);
                intervalo = intervalo - 200;
                clearInterval(loop);
                loop = setInterval(atualizaTela, intervalo);
            }
        }

        tela.onclick = dispara;
        aumentaPlacar;
    </script>
</body>
</html>

Adicionei 3 botões, um para cada dificuldade, cada um com o atributo onClick chamando a função setDificuldade() com a dificuldade respectiva desse botão.

A função chamada recebe o valor e atualiza o intervalo de atualização.

Era isso que você queria?

Vlw Caique, era isso mesmo, funcionou direitinho, muito obrigado cara :)

Boa tarde, pessoal! Como vão?

FattoriaWeb, apenas uma sugestão! Trabalhar com chamadas de função JavaScript direto no HTML, embora funcione, não é visto como uma boa prática no mundo front-end pois acabamos acoplando nosso código HTML com o JavaScript!

O ideal nesse caso seria utilizar um padrão de projeto chamado delegation em conjunto com a Dataset API do HTML! Ficar algo assim:

<div id="painel-dificuldades">
     <button data-dificuldade="2600">Fácil</button>
     <button data-dificuldade="1600">Médio</button>
     <button data-dificuldade="800">Difícil</button>
</div>

<script>
     const painelDificuldades = document.querySelector('#painel-dificuldades');
     painelDificuldades.addEventListener('click', function(evento) {

          const elementoClicado = evento.target;

          // Verifica se o elemento clicado contém
          // a propriedade data-dificuldade.
          // Se tiver essa propriedade significa que é
          // um botão de seleção de dificuldade.
          if (elementoClicado.dataset.dificuldade) {
               const dificuldadeSelecionada = elementoClicado.dataset.dificuldade;
               console.log(dificuldadeSelecionada);

               // Altero a dificuldade do jogo de acordo
               // com a seleção do usuário.
               mudaDificuldade(dificuldadeSelecionada);
          }
     });
</script>

Veja que com esse tipo de código vc consegue realmente desacoplar o seu código JavaScript do seu HTML sem ter que sair espalhando chamada de função na estrutura do seu documento.

Para saber mais: Link da documentação da Dataset Api

Qualquer coisa é só falar!

Grande abraço e bons estudos!