Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
15
respostas

Mostrando objeto no prompt

Sobre a Forca que fizemos com o professor Flávio, Gostaria que ao final do jogo quando mostramos "parabéns, você ganhou", exibisse a resposta da $entrada. Mas ao colocar ("parabéns, você ganhou! A resposta era: " + $entrada), o prompt do navegador exibe da seguinte maneira: "parabéns, você ganhou! A resposta era [Object object]. Já dei uma pesquisada rápida e não encontrei nada que me ajudasse. Alguém sabe a solução? Agradeço desde já!

15 respostas

Pelo que eu entendi vc quer imprimir a palavra secreta, então disponibiliza um método na classe à qual pertence a $entrada que retorne para vc a palavra apenas.

É claro se já não existir algum método que faça isso !!

// classe de onde é $entrada

Exemplo :


return {
    retornaPalavra:retornaPalavra.
}

Com isso é só chamar depois

alert("Parabéns vc acertou a palavra "+$entrada.retornaPalavra);

Mais ou menos isso vc tem que fazer !!

Desculpa não ter postado o código pois estou fazendo pelo celular !!!!

Roger, boa tarde, tudo bem? Exatamente, quero imprimir a palavra secreta tanto na resposta do alert pra quem acertou e pra quem errou. Pois percebi que quem errava e acabava a brincadeira, ficava sem saber a resposta, então quero colocar tanto pra quem acerta, quanto pra quem erra.

Bom, me deu uma grande clareada o que você me falou, o método já tá pronto mesmo mas agora que eu coloquei ele pra retornar, ele da a resposta como "undefined". Já to quebrando a cabeça faz 2 dias nessa brincadeira. KKK

E imagina cara, foi de grande ajuda porque agora peguei meio que o caminho pelo que você me falou, acho que to quase lá, mas ainda não resolvi..

Abraço e muito obrigado!

Segue a mesma lógica do professor Flávio disponibiliza um método publico junto com os outros métodos que já existam

return {
    outros metodos .....
    aqui o da palavra ...
}

qualquer coisa posta ai seu código !!!

Sim, mas acho que já tem os métodos da entrada no setPalavraSecreta. Ai to dando $entrada.setPalavraSecreta e ele ta voltando como undefined. E já ta disponibilizado no return { setPalavraSecreta: setPalavraSecreta }, mas acho que to comendo bola e pegando o objeto errado.. tenho quase certeza disso.

Ok !! mais dá uma olhada ai !! Uma coisa para pegar o valor geralmente é get, e para colocar o valor (setar) em uma variável é set

Entendeu

get : pega (o get sempre tem retorno )

set : coloca o valor (seta o valor daquela variável : o set não retorna nada )

Então pelo que vi vc está setando a variável com o setPalavraSecreta.

verifica se não tem um getPalavra

Exemplo :

    function getPalavraSecreta(){
        return $getPalavraSecreta
    }

Isso é um exemplo !!

Entendi, Roger!

Então, na verdade tem duas funções com o nome getLacunas e getEtapa e ambas voltam elas mesmas (return lacunas; return etapa;). Já utilizei as duas funções também junto com o $entrada e mesmo assim da undefined. Por isso to achando estranho.

Mas aqui tem duas exatamente como você escreveu ai.


function getLacunas() {
    return lacunas;
}

function getEtapa() {
    return etapa;
}

e logo abaixo:

return {
    setPalavraSecreta: setPalavraSecreta:
    getLacunas: getLacunas,
    getEtapa: getEtapa,
    (...)
};

Me manda todo teu código desse arquivo !!

Me manda como código !!

Confere a hierarquia dos objetos tbm pois para vc chegar nesses métodos pode ser que precisa pegar outros métodos de outro objeto antes

Exemplo :

    $outroMetodo.getOutroMetodo.$getPalavra();

Tenta isso depois disponibiliza ela como publica dentro do retorno do objeto!!

 var getPalavra = function(){
        var palavraRetorno ="";
        for (var i = 0; i < palavra.length; i++) {
            palavraRetorno += palavra[i];
        }
    return palavraRetorno;
    }

Depois chama assim !!

alert("Parabens você ganhou "+jogo.getPalavra());

Acho que isso resolve teu caso !!

Poderia tbm criar uma variável global e dentro do método setPalavraSecreta setar ela depois retornar ela com o getPalavra !!

Tentei também com a dica acima Roger, continua dando undefined quando ele mostra o resultado.

Abaixo segue o código completo do documento controller.js, que é uma das partes que tava mexendo.

Valeu Roger, já agradeço antecipadamente, mesmo não dando certo, pelo esforço ai!!!

var criaController = function(jogo) {

    var $entrada = $(".entrada");
    var $lacunas = $(".lacunas"); 

    var exibeLacunas = function () {

        $lacunas.empty();
        jogo.getLacunas().forEach(function(lacuna) {
            $("<li>")
                .addClass("lacuna")
                .text(lacuna)
                .appendTo($lacunas);
        });
    };

    var mudaPlaceHolder = function (texto) {

        $entrada.attr("placeholder", texto);
    };


    var guardaPalavraSecreta = function () {

        bloqueia();

        try {
            jogo.setPalavraSecreta($entrada.val().trim());
            $entrada.val("");
            mudaPlaceHolder("Digite uma letra");
            exibeLacunas();
        } catch(err) {
            alert(err.message);
        }  
    };

    var reinicia = function() {

        desbloqueia();
        jogo.reinicia();
        $lacunas.empty();
        mudaPlaceHolder("Digite a palavra a ser adivinhada");
    };

    var leChute = function() {

        try {
            jogo.processaChute($entrada.val().trim().substr(0, 1));
            $entrada.val("");
            exibeLacunas();

            if(jogo.ganhouOuPerdeu()) {

                setTimeout(function() {
                    if (jogo.ganhou()) {
                        alert("Parabéns! Você ganhou!\nA palavra secreta era: ");
                    } else if (jogo.perdeu()){
                        alert("Que pena! Tente novamente...\nA palavra secreta era: ");
                }
                    reinicia();
                }, 200);    
            }
        } catch(err) {
            alert(err.message);
        }    
    };

    var inicia = function () {

        $entrada.keypress(function (event) {
            if (event.which == 13) {
                switch (jogo.getEtapa()) {
                    case 1:
                        guardaPalavraSecreta();
                        break;
                    case 2:
                        leChute();
                        break;
                }
            }
        });
    };

    return { inicia: inicia };
};
// VARIAVEL CRIADA A PARTE POR MIM SÓ PRA PODER DAR UMA DICA NA HORA DA PALAVRA.
var dica = $(".dica");

function bloqueia() {
    dica.attr("disabled", true);
}

function desbloqueia() {
    dica.attr("disabled", false);
    dica.val("");
}

Mais isso tu tem que fazer no arquivo jogo.js entendeu não é no arquivo controller,js.

Agora achamos o erro tu está fazendo no arquivo errado !! Tu faz no arquivo jogo.js depois chama no controller.js.

Agora foi !!!!

Tentei aqui a tarde toda Roger, da uma olhada como ficou meu código do jogo.js e ainda ta dando o mesmo erro:

var criaJogo = function(sprite) {

    var palavraSecreta = "";
    var lacunas = [];
    var etapa = 1;

    var ganhou = function () {

        return lacunas.length
            ?!lacunas.some(function(lacuna) {
                return lacuna == "";
        })
        : false;
    };

    var perdeu = function () {

        return sprite.isFinished();
    };

    var ganhouOuPerdeu = function () {

        return ganhou() || perdeu();
    };

    var reinicia = function () {

        etapa = 1;
        lacunas = [];
        palavraSecreta = "";
        sprite.reset();
    };

    var processaChute = function(chute) {

        if(!chute.trim()) throw Error("Letra inválida.");

        var exp = new RegExp(chute, "gi");
        var resultado;
        var acertou = false;

        while(resultado = exp.exec(palavraSecreta)) {

            acertou = lacunas[resultado.index] = chute;
        }

        if(!acertou) sprite.nextFrame();
    };

    var criaLacunas = function() {

        for(var i = 0; i < palavraSecreta.length; i++) {
            lacunas.push("");
        }
    };

    var proximaEtapa = function() {

        etapa = 2;
    };

    var setPalavraSecreta = function(palavra) {

        if(!palavra.trim()) throw Error("Palavra secreta inválida.");

        palavraSecreta = palavra;
        criaLacunas();
        proximaEtapa();
    };

    var getLacunas = function() {

        return lacunas;
    };

    var getEtapa = function() {
        return etapa;
    };

    var getPalavra = function(){
        var palavraRetorno ="";
        for (var i = 0; i < palavra.length; i++) {
            palavraRetorno += palavra[i];
        }
    return palavraRetorno;
    }

    return {
        setPalavraSecreta: setPalavraSecreta,
        getLacunas: getLacunas,
        getEtapa: getEtapa,
        processaChute: processaChute,
        ganhou: ganhou,
        perdeu: perdeu,
        ganhouOuPerdeu: ganhouOuPerdeu, 
        reinicia: reinicia
    };

 };

Detalhe que eu chamei como:

var leChute = function() {

        try {
            jogo.processaChute($entrada.val().trim().substr(0, 1));
            $entrada.val("");
            exibeLacunas();

            if(jogo.ganhouOuPerdeu()) {

                setTimeout(function() {
                    if (jogo.ganhou()) {
                        alert("Parabéns! Você ganhou!\nA palavra secreta era: " + jogo.getPalavra);
                    } else if (jogo.perdeu()){
                        alert("Que pena! Tente novamente...\nA palavra secreta era: ");
                }
                    reinicia();
                }, 200);    
            }
        } catch(err) {
            alert(err.message);
        }    
    };

Coloquei sem os parênteses porque se eu colocar os parênteses nem o prompt aparece.

Que complicado!!! Desculpa ai, Roger! ;/

Ta nais tu não colocou ela como publica, e coloca os parenteses tbm.

return {
        getPalavra: getPalavra,
        setPalavraSecreta: setPalavraSecreta,
        getLacunas: getLacunas,
        getEtapa: getEtapa,
        processaChute: processaChute,
        ganhou: ganhou,
        perdeu: perdeu,
        ganhouOuPerdeu: ganhouOuPerdeu, 
        reinicia: reinicia
    };

Roger, agora ficou uma coisa curiosa kkk

Fiz exatamente como falou e agora quando eu coloco parênteses o prompt não abre e se eu tiro os parênteses do jogo.getPalavra, ele aparece no prompt o código todo da função getPalavra com o var for e o return... nunca vi isso... ce tem ideia do que seja?

jogo.js

     var getPalavra = function(){
        var palavraRetorno ="";
        for (var i = 0; i < palavra.length; i++) {
            palavraRetorno += palavra[i];
        }
    return palavraRetorno;
    };

    return {
        getPalavra: getPalavra,
        setPalavraSecreta: setPalavraSecreta,
        getLacunas: getLacunas,
        getEtapa: getEtapa,
        processaChute: processaChute,
        ganhou: ganhou,
        perdeu: perdeu,
        ganhouOuPerdeu: ganhouOuPerdeu, 
        reinicia: reinicia
    };

 };

E o controller.js

var leChute = function() {

        try {
            jogo.processaChute($entrada.val().trim().substr(0, 1));
            $entrada.val("");
            exibeLacunas();

            if(jogo.ganhouOuPerdeu()) {

                setTimeout(function() {
                    if (jogo.ganhou()) {
                        alert("Parabéns! Você ganhou!\nA palavra secreta era: " + jogo.getPalavra());
                    } else if (jogo.perdeu()){
                        alert("Que pena! Tente novamente...\nA palavra secreta era: ");
                }
                    reinicia();
                }, 200);    
            }
        } catch(err) {
            alert(err.message);
        }    
    };

No console da o erro que na linha 82, "palavra is not defined". A linha 82 é onde está o for que você colocou: for (var i = 0; i < palavra.length; i++)

Acho que não tem nem variável da "palavra", por isso talvez ta dizendo que ela não foi definida, será isso? Posso ta falando besteira, to a pouco tempo nisso então desculpa qualquer coisa.. rs

solução!

No meu eu criei a variável palavra no teu não tem !!

Mais agora está tudo certo meu se vc está chamando sem parenteses e está retornando o corpo da função nós já resolvemos o problema indefinido da função !!

Fiz sem o for para vc é só retornar a palavra como eu tinha falado antes !!

Olha abaixo ai !!! Agora resolve !!!

function criaJogo (sprite){
    var palavra;
    var lacunas = []; 
    var etapa = 1;


    var getPalavra = function(){
        return palavra;
    }
    //  criando sem for 

    var criarLacunas = function () {
        lacunas = Array(palavra.length).fill('');
    };
    var ganhou = function () {
        return lacunas.length ? !lacunas.some(function(lacuna) {return lacuna == "";}) : false;
    };
    var perdeu = function () {
        return sprite.isFinished();
    };
    var ganhouOuPerdeu = function () {
        return ganhou() || perdeu();
    };
    var reinicia = function () {
        sprite.reset();
        palavra = "";
        lacunas = [];
        etapa = 1;
    };
    var processaChute = function (letra){
        if(!letra.trim()) {
            throw Error("Chute inválido");
        }
        var exp = new RegExp(letra,'gi'),
        resultado,
        acertou = false;

        while(resultado = exp.exec(palavra)){
            acertou = lacunas[resultado.index] = letra;
        } 

        if(!acertou) sprite.nextFrame();
    }
    var proximaEtapa = function() {
      etapa = 2  
    };
    var setaPalavraSecreta =function (p) {
        if(!p.trim()) throw Error("Palavra secreta inválida");
        palavra = p;
        criarLacunas();
        proximaEtapa();
    };
    var getEtapa = () => {
        return etapa;
    };
    var getLacuna= () => {
        return lacunas;
    };
    return {
        getEtapa:getEtapa,
        setaPalavraSecreta:setaPalavraSecreta,
        getLacuna:getLacuna,
        processaChute:processaChute,
        getPalavra:getPalavra,
        ganhou:ganhou,
        perdeu:perdeu,
        ganhouOuPerdeu:ganhouOuPerdeu,
        reinicia:reinicia
    };
}
//////////////////////////////////////////////////////////


var criaController = function (jogo) {

    var $entrada = $('#entrada');
    var $lacunas = $('.lacunas');

    // consulta jogo.getLacunas() e exibe para o usuário cada lacuna 

    var exibeLacunas = function () {
        $lacunas.empty();
        jogo.getLacuna().forEach(lacuna => {
            $('<li>').addClass('lacuna')
            .text(lacuna)
            .appendTo($lacunas);
        });       
    };

    // muda o texto do placeHolder do campo de entrada    
    var mudaPlaceHolder = function (texto) {
        $entrada.attr('placeholder',texto);
    };

    // passa para jogo.setPalavraSecreta() o valor digitado pelo jogador e chama o a função `exibeLacunas()` e `mudaPlaceHolder()` definidas no controller. 

    var guardaPalavraSecreta = function () {
        try{
            jogo.setaPalavraSecreta($entrada.val().trim());
            $entrada.val("");
            exibeLacunas();
            mudaPlaceHolder("chute");
        }catch(err){
            alert(err.message);
        }
    };
    var reiniciar = function () {
      $lacunas.empty();
      mudaPlaceHolder("palavra secreta");
      jogo.reinicia();  
    };
    var lerChute = function (){
        try {
            jogo.processaChute($entrada.val().trim().substr(0,1));
            $entrada.val("");
            exibeLacunas();
            if(jogo.ganhouOuPerdeu()){
                setTimeout(function () { 
                    if(jogo.ganhou()){
                        alert("Parabens você ganhou "+jogo.getPalavra());
                    }else if(jogo.perdeu()){
                        alert("Você perdeu tente novamente !");                    
                    }
                    reiniciar();
                 },200);

            }
        } catch ($error) {
            alert($error.message);
        }

    };
    // faz a associação do evento keypress para capturar a entrada do usuário toda vez que ele teclar ENTER
    var inicia = function () {

        $entrada.keypress(function (event) {
            if (event.which == 13) {
                switch (jogo.getEtapa()) {
                    case 1:
                        guardaPalavraSecreta();
                        break;
                    case 2:
                        lerChute();
                        break;
                }
            }
        });
    }
    return { inicia: inicia };
};

Caramba Roger, finalmente! KKK

Só tive que trocar a variavel palavra e o return palavra pelo palavraSecreta e ai fora de primeira. Muito obrigado pela paciência e pela explicação de tudo ai em cima. Estou começando e espero um dia poder retribuir esse favor a você.

Abraço!!