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

Desafio

function sorteiaNumeros()
    {
        var arr = [];
        for(var i = 0; i < 6; i++)
        {            
            arr.push(Math.round(Math.random() * 60));
        }
    }

    function jogadorLoteria()
    {
        var userArr = []
        for(var i = 0; i < 6; i++)
        {
            usuario = prompt("Digite um número de 1 a 60");
            if(userArr[i] == usuario)
            {
                alert("Você já digitou este número");
                return;
            }
            userArr.push(usuario);
        }
    }

    if(sorteiaNumeros() == jogadorLoteria())
    {
        document.write("você ganhou na loteria!");
    }
        else
        {
            document.write("Você não ganhou na loteria");
        }

Ao digitar, ele continua no for sem entrar no if. Por que isso?

7 respostas

Olá Gus,

você deve comparar o conteúdo dos arrays:

arr e userArr

creio que:

 if(sorteiaNumeros() == jogadorLoteria())

não é a abordagem mais apropriada.

Att,

Hm... Mas ele continua no for da função jogadorLoteria(){}. Ele não faz a comparação para ver se há números iguais.

o seu userArr ainda esta vazio quando você realiza a comparação, você precisa primeiro inserir o valor no array e depois verificar se o que o usuario digitou esta neste array.

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!

solução!

eu consegui fazendo assim:

//função para testar o valor do array
    function inArray(arr, valor)
    {
        for(var i = 0; i < arr.length; i++)
        {
            if(arr[i] == valor)
            {
                return true;
            }
        }
        return false;
    }

    function sorteiaNumeros()
    {
        var arr = [];
        for(var i = 0; i < 6; i++)
        {            
            arr.push(Math.round(Math.random() * 60));
        }
        return arr;
    }

    function jogadorLoteria()
    {
        var userArr = []
        for(var i = 0; i < 6; i++)
        {
            var numero = prompt("Digite um número de 1 a 60");
            while(inArray(userArr, numero))
            {
                alert("Número já existente. Digite outro");
                numero = prompt("Digite um número de 1 a 60");
            }    
            userArr.push(numero);
        }
        return userArr;
    }

    var player = jogadorLoteria();
    var npc = sorteiaNumeros();

    if(player == npc)
    {
        document.write("Você ganhou na loteria!");
    }else
        {
            document.write("Você não ganhou na loteria");
        }

são três funções. uma para comparar o valor dos arrays, e as outras para pegar os números sorteados e números digitados. na de números digitados, ela vai entrar no while e se a condição for satisfeita (dois números iguais), ela continua travada lá.

Gus, seu código ainda possui um erro fundamental! player == npc sempre vai retornar falso, porque o JavaScript não considera que duas variáveis de tipo array são iguais. Ou seja, é impossível que o usuário ganhe a loteria! Dá uma olhada na minha resposta ali em cima, pra entender melhor isso e como resolver!

Valeu, Yan!