Bem, Gus, eu não entendo muito de JavaScript, mas seu código tem alguns erros que, felizmente, são simples de consertar! Vamos começar pelo problema que você indicou, no loop for o if é "ignorado". Na realidade ele não é ignorado, mas simplesmente retorna falso. Pensa comigo - você está iterando pelos números de 0 a 5, certo? Então, para cada número (i
) você pede um valor para o usuário e checa se esse valor é igual ao valor que está na posição i
da array userArr. O problema é que essa condição nunca será verdadeira, já que, no momento desse if, a array userArr nem ao menos possui um valor na posição i
. Vamos simular a iteração, sem código:
Iteração 1:
1 - i
é igual a 0
2 - userArr
é uma array vazia ([]
)
3 - usuario
é igual ao input do usuário (nesse caso, vamos supor que seja "7"
, apenas como exemplo.
4 - Verificamos se o valor na posição i
(0
) é igual ao valor de usuario
("7"
). userArr
continua sendo uma array vazia, então nem ao menos existe um valor na posição 0
.
5 - O valor de usuario
é adicionado à array userArr
. Agora há um valor na posição 0
de userArr
Esse if que você colocou não vai funcionar, então. Você pode fazer um outro loop for dentro do primeiro, que verificaria se existe algum valor em userArr que é igual ao valor de usuario, mas é muito mais simples usar a função includes própria de arrays, que verifica se uma array possui um certo valor. Eu também recomendaria você a usar um loop while em vez do for. Por quê? Porque com o loop for a gente não pode garantir que o userArr vai sair da função com 6 valores. Com o loop while você pode fazer o seguinte:
function jogadorLoteria()
{
var userArr = []
while(userArr.len < 6)
{
usuario = prompt("Digite um número de 1 a 60");
if(userArr.includes(usuario)
{
alert("Você já digitou este número");
continue;
}
userArr.push(usuario);
}
}
Esse loop só vai acabar quando userArr tiver 6 valores. Caso o usuário repita um número, vai ter o alert que você colocou e chamamos o continue, que passa para a próxima iteração do loop automaticamente, o que é ótimo, já que o while não tem limites de iterações (como o for teria 6, nesse caso).
Também temos um pequeno aspecto (que, na realidade, raramente se tornará um problema) que é bom nos prevenirmos na função sorteiaNumeros
. Ele é similar ao que acabamos de resolver na função jogadorLoteria
, então você pode usar a mesma lógica para solucioná-lo. Nessa função, adicionamos um valor aleatório entre 1 e 60 na array arr
6 vezes, mas em nenhum momento paramos para verificar se esse valor já foi anteriormente sorteado. Claro, a chance de um número ser sorteado mais de uma vez é baixa, mas e se acontecer? O usuário não terá chance de ganhar! Vou deixar você resolver isso, se baseando no que acabamos de fazer com a função jogadorLoteria
, que tal?
Agora temos uma outra questão. A condição sorteiaNumeros() == jogadorLoteria()
sempre vai ser verdadeira. Por quê? Porque ambas as funções sorteiaNumeros
e jogadorLoteria
retornam undefined
, que é o valor padrão que o JavaScript usa para retornos vazios (como o None
e null
de outras linguagens). Então essa condição sempre será, basicamente, undefined == undefined
. O que você pode fazer é retornar a array arr
no final da função sorteiaNumeros
e a array userArr
no final da função jogadorLoteria
. Mesmo assim, ainda teremos um problema, porque o JavaScript só vai considerar que uma array é igual a uma array quando essas forem a mesma, ou seja:
>> var array1 = [1,2,3]
>> var array2 = [1,2,3]
>> array1 == array2
<- false
>> array1 == array1
<- true
>> array2 == array2
<- true
A solução, então, é iterar por cada elemento de uma das arrays e verificar se este é igual ao elemento da outra array. Como a posição de cada elemento não importa, temos que antes ordenar as arrays. Recomendo, também, deixar isso em uma função, para que fique mais simples:
function arraysIguais(array1, array2)
{
array1.sort()
array2.sort()
if(array1.length != array2.length)
{
return false
}
for(i = 0; i < array1.length; i++)
{
if array1[i] != array2[i]
{
return false
}
return true
}
Então você pode substituir a condição sorteiaNumeros() == jogadorLoteria()
por arraysIguais(sorteiaNumeros(), jogadorLoteria())
(considerando que você já adicionou os returns nas funções sorteiaNumeros
e jogadorLoteria
. Você até pode, na função que verifica se duas arrays são iguais, fazer algo para ver quantos números a pessoa acertou, ou no final imprimir, além da notícia de vitória ou não, quais números a pessoa colocou e quais foram sorteados (claro que, se quisesse implementar isso, não poderia chamar as funções sorteiaNumeros
e jogadorLoteria
direto na arraysIguais
, mas teria de fazer algo como
var numerosUsuario = jogadorLoteria();
var numerosSorteados = sorteiaNumeros()
e a condição pra ver se o usuário ganhou teria de serif(arraysIguais(numerosUsuario, numerosSorteados
), se achar chato apenas a notícia de vitória ou não (já que quase sempre o usuário irá perder).
Gus, espero que tenha entendido tudo o que eu falei aqui, se eu deixei alguma coisa confusa, pode falar que eu (e os outros usuários aqui da Alura) tento explicar de outra forma! Bons estudos, abraços!