Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

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?

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
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!