Sou novo em programação e gostaria de uma avaliação sobre este código

Eu estou lendo um livro sobre Lógica de Programação com JavaScript e nele tem um exercício que me pede para fazer um jogo de loteria.
Eu consegui fazer oque estava no livro mas dai eu fui incrementando algumas coisa no código e depois disso eu parei para olhar e achei ele meio grande. Então eu gostaria de saber de vocês se ele está desnecessariamente grande ou se ele poderia ter sido feito de uma forma melhor e menor. Se possível até me apontar algumas falhas/hábitos que eu possa ter feito no código abaixo.
Agradeço desde já.

PS: Eu fiz ele no notepad++ e estou executando no chrome com um arquivo .html

 function loteria()
    {
    	var n, p;
    	//Inicialização
    	function pQ()
    	{
    		p = (parseInt(prompt("Devem ser sorteados números que estão entre 1 e ?:"))) - 1;
    		if (isNaN(p))
    		{
    			alert("INSIRA APENAS NÚNEROS!");
    			pQ();
    		}
    		else if (p < 2)
    		{
    			alert("VOCÊ NÃO PODE INSERIR UM VALOR MENOR DO QUE 2.");
    			pQ();
    		}
    	}
    	function nQ()
    	{
    		n = parseInt(prompt("Quantos números devem sem sorteados?"));
    		if (isNaN(n))
    		{
    			alert("INSIRA APENAS NÚNEROS!");
    			nQ();
    		}
    		else if (n < 1 || n > p)
    			{
    				alert("VOCÊ NÃO PODE INSERIR UM VALOR MENOR DO QUE 1 OU MAIOR DO QUE " + (p + 1) + ".");
    				nQ();
    			}
    	}
    	pQ();
    	nQ();
    	//SORTEIO
    	var x, y, check, acertos = 0, sorteados = [], escolhas = [];
    	for (var i = 0; i < n;)
    	{
    		x = Math.round((Math.random()*p) + 1);
    		check = 0;
    		for (var a = 0; a < n; a++)
    		{
    			if (sorteados[a] == x)
    			{
    				check = 1;
    			}
    		}
    		if (check == 0)
    		{
    			sorteados.push(x);
    			i++;
    		}
    	}
    	//-------------------------------------------------
    	//ESCOLHAS
    	for (b = 0; b < n;)
    	{
    		y = parseInt(prompt("Escolha um número entre 1 e " + (p + 1) + "\n--------------------------\nEscolha o " + (b + 1) + "º número"));
    		check = 0;
    		for (var c = 0; c < n; c++)
    		{
    			if (escolhas[c] == y)
    			{
    				alert("Este número já foi esclhido. Tente novamente!");
    				check = 1;
    			}
    		}
    		if (check ==0 && !isNaN(y) && y <= (p + 1) && y > 0)
    		{
    			escolhas.push(y);
    			b++;
    		}
    		else if (isNaN(y))
    			{
    				alert("APENAS NÚMEROS SÃO VÁLIDOS!");
    			}
    			else if (y > (p + 1))
    				{
    					alert("ESTE NÚMERO É MAIOR QUE O LIMITE DE " + (p + 1) + ". TENTE NOVAMENTE!");
    				}
    				else if (y <= 0)
    					{
    						alert("ESTE NÚMERO É MAIOR QUE O MÍNIMO DE 1. TENTE NOVAMENTE!");
    					}
    	}
    	//-------------------------------------------------
    	//VERIFICAÇÃO
    	for (var d = 0; d < n; d++)
    	{
    		for (var e = 0; e < n; e++)
    		{
    			if (escolhas[d] == sorteados [e])
    			{
    				acertos++;
    			}
    		}
    	}
    	alert("Você acertou " + acertos + " de " + n);
    	mostrarTexto("Foram sorteados: ----------- " + "Você escolheu:",1);
    	for (var r = 0; r < n; r++)
    	{
    		mostrarTexto(sorteados[r] + " ---------------------------------------------- " + escolhas[r], 1);
    	}
    	mostrarTexto("Pressione F5 para abrir o menu de opções novamente!", 2);
    	
    }
1 curtida

Coloque uma cópia no https://jsfiddle.net/.

Eu achei um pouco sem conexão, percebi a preocupação em conversões e verificações isso é importante!

1 curtida

Não entendi muito bem oque você quis dizer com “Sem conexão” mas obrigado pela resposta. :smiley:

Sem conectividade entre elas. Você depois no final colocou inline seu código, eu acho que isso poderia ser melhorado.

1 curtida

Entendi. Valeu! XD

1 curtida

Seu código ficou confuso e bastante acoplado, você poderia desacoplar as funções pq(); e nq(); para fora do metódo que as possui, no caso loteria(); deixando seu código mais coeso, o que você fez foi declarar e implementar as funções pq(); e nq(); dentro do metódo loteria, extraia-os fora e implemente suas funcionalidades, após chame os metódos dentro de loteria.

1 curtida

Obrigado pela resposta @Felipe_Miranda, farei isso com as funções pQ(); e nQ(); que você mencionou. Mas com relação ao restando do código, oque foi que eu fiz que o deixou confuso? Poderia ser um pouco mais específico para que eu possa mudar isso?