6
respostas

Por que o meu código não funciona? +Mini-desabafo

Eu tenho que compartilhar do sentimento do colega Roger (que fez um post parecido com esse).

Os exercícios mais complexos estão me deixando inseguro! Quando eu penso que entendi um conceito, um exercício consegue me mostrar que não sei nada quando deveria saber - isso se aplica ao exercício das barras e da mudaCor() - e eu tenho medo do que vem pela frente. Será que é falta de atenção minha?

Fiquei ainda mais frustado ao ver a resposta do exercício depois de dias sem conseguir resolver! Eu tinha formulado a seguinte lógica:

1) pincel.fillStyle recebe um valor, a ser dado pela variável cor;

2) a variável cor deveria receber um dos valores da variável cores = ['blue', 'red', 'green']... logo, pensei em chamar cor = cores[i] - começando com var i = 0, o que deveria me dar o resultado var cor = cores[0]. Logo, var cor = 'blue';

3) a variável i deveria ser incrementada pela função mudaCor(), que só seria chamada com o clique direito do mouse. Caso o valor de i fosse igual ao cores.length (que é 3, quando só temos valores de 0,1 e 2), o valor dei deveria voltar a ser 0;

4) infelizmente, o programa só desenha círculos em azul.

Meu código é o seguinte:

<meta charset="UTF-8">
<canvas id='tela' width=600 height=400></canvas>

<script>

var tela = document.getElementById('tela');
var pincel = tela.getContext('2d');

pincel.fillStyle='lightgray';
pincel.fillRect(0,0,600,400);

function desenhaCirculo(evento) {
    var x = evento.pageX - tela.offsetLeft;
    var y = evento.pageY - tela.offsetTop;

    pincel.fillStyle = cor;
    pincel.beginPath();
    pincel.arc(x,y,10,0,2*Math.PI);
    pincel.fill();
}

var cores = ['blue', 'red', 'green'];
var i = 0;
var cor = cores[i]

function mudaCor() {
    i++;
    if(i == cores.length) {
        i = 0;
    }
    return false;
}

tela.onclick = desenhaCirculo;
tela.oncontextmenu = mudaCor;
</script>

A resposta do exercício difere do meu código nessa parte:

Resposta certa:

function desenhaCirculo(evento) {
    var x = evento.pageX - tela.offsetLeft;
    var y = evento.pageY - tela.offsetTop;

    pincel.fillStyle = cores[i];
    pincel.beginPath();
    pincel.arc(x,y,10,0,2*Math.PI);
    pincel.fill();
}

var cores = ['blue', 'red', 'green'];

var i = 0;

Gostaria de saber o que difere isso do meu código? Pelo meu raciocínio é a mesa coisa!

Alguém pode me mostrar o meu erro?

Grato!

6 respostas

Olá, tudo blz? O seu erro está na localização da atribuição cor = cores[i] ; No ponto onde foi colocada, a atribuição só ocorrerá uma única vez, quando i = 0 e assim define que cor é blue e nunca será alterada. O seu método mudaCor() altera a variável i, mas isso não afeta em nada a variável cor. Você precisa alterar o valor da variável cor, fazendo cor = cores[i] ao final do método mudaCor() ou no método desenhaCirculo() antes da atribuição pincel.fillStyle = cor.

Boa Noite Márcia! Agradeço a atenção! Mas ainda fiquei com dúvida :( Pode explicar com mais detalhes?

Fala Lucas tudo bem? Sou estudante, assim como você, acho que estamos mais ou menos no mesmo nível. Não tenha medo! Acho que cada dificuldade que tenho e quebro a cabeça nas atividades me fazem querer aprender mais e tirar minhas dúvidas por aqui. Acho que só assim, ficando com raiva do código ( que nós mesmo produzimos) que vamos pegando o jeito.

Uma coisa que o pessoal me deu a dica e que funciona muito comigo é usar o console.log();

function mudaCor() {
    console.log('mudou');
    i++;
    if(i == cores.length) {
        i = 0;
    }
    return false;

}

Abra seu navegador e veja que ele está executando o que você pediu, a variável está mudando, mas como você definiu a var cor = 0, em nenhum momento mais você consegue mudar, porque vc não pede pra ela mudar.

Aqui eu sempre tento resolver o código com os números. E fazendo isso no seu código acho que vc definiu o 'valor' da variável cor como blue, e nunca mais chamou pela var cor e sim só pela var i.

Perceba que se você colocar o i direto la em cima no fill style e sumir com a var cor, seu código vai funcionar.

function desenhaCirculo(evento) {
    var x = evento.pageX - tela.offsetLeft;
    var y = evento.pageY - tela.offsetTop;

    pincel.fillStyle = cores[i];
    pincel.beginPath();
    pincel.arc(x,y,10,0,2*Math.PI);
    pincel.fill();
}

Espero ter ajudado! Vamos nos falando! Pra onde você ta planejando ir depois do Logica II?? Seguir a carreira de programação conforme orientado?? Ou tem outra idéia em mente?? Grande Abraço!

Oie Lucas,

Vamos ver se te ajudo com um exemplo mais simples: Sejam:

var a = 5;

var b = 10 + a;

Você espera que b seja igual a 15, certo? Como o computador calcula isso? pense que cada variável é uma caixinha. Na caixinha a, o computador colocou o valor 5. Na caixinha b, o computador colocou o valor 15. O valor que fica em b não é a expressão 10 + a, mas sim o RESULTADO da expressão que é 15.

Vejamos agora o seguinte exemplo:

var a = 5;
var b = 10 + a;
a = 8;

Veja agora na terceira linha, eu fiz a = 8, mas isso não muda em nada o valor de b, que continua sendo 15, entende? O computador processa as instruções a medida que elas aparecem, quando a variável b vai ser atribuída, o valor de a ainda era 5. Depois mudamos para 8, mas isso não afeta a atribuição feita anteriormente.

Voltando ao seu script, o que computador realiza internamente para responder a instrução var cor = cores[i], pode ser descrita nos seguintes passos:

1) resolve a expressão cores[i]
    1.1) obtem o valor de i (que é zero)
    1.2) substitui i por 0
    1.3) obtém o valor de cores[0] (que é blue)
2) cria a variável/caixinha cor (na verdade reserva a área de memória)
2) Coloca na caixinha cor, o resultado obtido em 1

Ou seja, cor = blue, somente. E você colocou essa instrução em um local que é executado só uma vez, por isso cor nunca muda.

Ajudou?

Quem esta começado com programação ajudar e ser ajudado tem um efeito poderoso.

Olha Lucas, não era o melhor aluno de lógica quando comecei e hoje programo em 5 linguagens e sou autor de livros.

Como o curso diz, é curso de lógica e nem mesmo lógica em matemática pegamos facilmente.

Agora, não desista... pensei em desistir várias vezes e se tivesse feito isso minha vida seria diferente.

Haverá sempre alguém melhor que nós e isso deve servir de inspiração para ir além.

Sobre sua dúvida, os colegas conseguiram ajudar? Posso ajudar em algo?

Pessoal muito obrigado pela ajuda (e desculpa pela demora na resposta hehe)

@Márcia acho que comecei a entender ! Mas ainda fiquei com uma dúvida! E talvez o professor @Flavio possa ajudar!

Teria algum jeito de fazer esse código funcionar sem tirar a variável cor?

@Rodrigo Grande ajuda amigão! Pretendo terminar toda a carreira de iniciante em programação e daí começar Python! Quais seus planos?

@Flavio palavras como as suas são o combustivel que falta quando a gente quase desiste! Obg pela ajuda!