Solucionado (ver solução)
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!!