a minha função altera o valor errado do array

Pessoal Isto parece um problema simples, mas estou a ter problemas para resolvê-lo. Basicamente, a função desenhaFaceTotal() tem um botão que permite desenhar cinco dados em cinco canvas diferentes e atribuir o valor numArray a cada dado desenhando os pontos dos dados de acordo com o número que saiu (exemplo: n = 5 desenha cinco pontos) e depois organiza os dados por ordem crescente isso faz tudo bem o problema é que: eu queria mudar o valor do primeiro dado (o menor número na matriz) pressionando o canvas na função alterarNumero() e organiza-lo depois ao invés disso o meu programa altera o valor de qualquer um dos dados.

Exemplo de operação que eu queria que acontecesse

Dados:

1 2 3 5 5

depois de pressionar o primeiro canvas: (o número que saiu é, por exemplo, quatro)

2 3 4 5 5

O que acontece no meu código em vez de mudar o valor do primeiro dado mudou qualquer um dos dados no caso mudou por exemplo o dado número 3 e colocou o número 6

1 2 5 5 6




JavaScript:
graf1 = document.getElementById("myCanvas1").getContext("2d");
graf2 = document.getElementById("myCanvas2").getContext("2d");
graf3 = document.getElementById("myCanvas3").getContext("2d");
graf4 = document.getElementById("myCanvas4").getContext("2d");
graf5 = document.getElementById("myCanvas5").getContext("2d");
          
          function desenhaFaceTotal(){
                
            desenhaDado(graf1);
            desenhaDado(graf2);
            desenhaDado(graf3);
            desenhaDado(graf4);
            desenhaDado(graf5);
            
            n = Math.floor(6 * Math.random()) + 1;
            n2 = Math.floor(6 * Math.random()) + 1;
            n3 = Math.floor(6 * Math.random()) + 1;
            n4 = Math.floor(6 * Math.random()) + 1;
            n5 = Math.floor(6 * Math.random()) + 1;
            
                                
            var numArray = [n, n2, n3, n4, n5];
                                    
            numArray.sort(function(a, b) {
                return a - b;
            });
                                                
            desenhaFace(numArray[0], graf1);
            desenhaFace(numArray[1], graf2);
            desenhaFace(numArray[2], graf3);
            desenhaFace(numArray[3], graf4);
            desenhaFace(numArray[4], graf5);
                                            
        }
          
            function alterarNumero(){
                                            
            n = Math.floor(6 * Math.random()) + 1;
                                        
            desenhaFaceTotal();     
                            
        }

HTML:
<canvas class="dados" id="myCanvas1" width="88" height="88" onclick="alterarNumero()"></canvas>


<button class="botao" id="botaoNovaMao" onclick="desenhaFaceTotal()">nova<br>mão</button>
 
Podes colocar esse exemplo de forma mais auto-contida? Do teu código parece-me que falta imensa coisa. Não temos os myCanvas#, não temos o desenhaFace(), portanto não podemos propriamente testar.

Também notei que no alterarNumero() estás a atribuir um valor à variável n que depois nunca é lido, e a seguir passas o controlo ao desenhaFaceTotal() (que nunca vê esse n, e não me parece que faça o que queiras).

Para já, coloquei num jsfiddle: https://jsfiddle.net/cmnqewgh/#&togetherjs=pNBaK73Nfz
 
Qual é o teu objectivo com chamares a função "desenhaFaceTotal" dentro da função "alterarNumero"?
Era desenhar novamente os dados alterando apenas o valor do primeiro array consoante o valor de n (se o valor de n fosse por exemplo 5 desenhava um dado com cinco pintas) e ordenava-o por ordem crescente

Podes colocar esse exemplo de forma mais auto-contida? Do teu código parece-me que falta imensa coisa. Não temos os myCanvas#, não temos o desenhaFace(), portanto não podemos propriamente testar.

Também notei que no alterarNumero() estás a atribuir um valor à variável n que depois nunca é lido, e a seguir passas o controlo ao desenhaFaceTotal() (que nunca vê esse n, e não me parece que faça o que queiras).

Para já, coloquei num jsfiddle: https://jsfiddle.net/cmnqewgh/#&togetherjs=pNBaK73Nfz
Como isto é um projeto da escola eu não queria colocar aqui o meu código completo porque a única coisa que me falta é resolver esse bug. E o bug é supostamente na função alterarNumero(). Dá para dar upload de ficheiros html? Eu posso colocar a solução do professor e a minha solução.
 
Era desenhar novamente os dados alterando apenas o valor do primeiro array consoante o valor de n (se o valor de n fosse por exemplo 5 desenhava um dado com cinco pintas) e ordenava-o por ordem crescente
O próprio desenhaFaceTotal() está a calcular valores novos cada vez que é chamado, e a atribuição que fazes ao n dentro do alterarNumero nunca é usada. Provavelmente queres passar os valores como argumento da função.

Não dá para fazeres upload de ficheiros, mas podes perfeitamente usar o jsfiddle nesse sentido.
 
O próprio desenhaFaceTotal() está a calcular valores novos cada vez que é chamado, e a atribuição que fazes ao n dentro do alterarNumero nunca é usada. Provavelmente queres passar os valores como argumento da função.

Não dá para fazeres upload de ficheiros, mas podes perfeitamente usar o jsfiddle nesse sentido.
Coloquei lá o meu código para melhor entendimento do problema n sei se está bem organizado
 
Parece funcionar. Portanto, se escolher "nova mão" posso carregar tantas vezes quantas quiser, mas se carregar num canvas só tenho 3 jogadas? Isso é mesmo assim?

Aqueles "if contaPares" sucessivos (e outras sucessões de ifs como "if nBonus") podem ser substituídos por cláusulas "switch"/"case".

O problema que tens parece-me mesmo ser alterares o valor de "n" fora da função onde ele é usado. Chamas um "desenhaFaceTotal" sem lhe passares n, e o desenhaFaceTotal não tem forma (que eu saiba) de saber dessa alteração. Não entendo onde é que ele vai buscar os valores n ... n5 nesta linha:
Código:
          var numArray = [n, n2, n3, n4, n5];
mas eu também não programo JavaScript, portanto deve ser só nabice minha.

O que puseste no fiddle é diferente do que puseste neste tópico: no fiddle tens duas funções, desenhaFaceTotal e desenhaFaceTot (que provavelmente se devia chamar algo como "calculaFaces" ou algo assim, evita fazer atalhos como "Tot" quando na realidade precisas de encontrar um nome mais descritivo :) ). Assim faz um pouco mais de sentido, mas ainda não totalmente.
 
Parece funcionar. Portanto, se escolher "nova mão" posso carregar tantas vezes quantas quiser, mas se carregar num canvas só tenho 3 jogadas? Isso é mesmo assim?

Aqueles "if contaPares" sucessivos (e outras sucessões de ifs como "if nBonus") podem ser substituídos por cláusulas "switch"/"case".

O problema que tens parece-me mesmo ser alterares o valor de "n" fora da função onde ele é usado. Chamas um "desenhaFaceTotal" sem lhe passares n, e o desenhaFaceTotal não tem forma (que eu saiba) de saber dessa alteração. Não entendo onde é que ele vai buscar os valores n ... n5 nesta linha:
Código:
          var numArray = [n, n2, n3, n4, n5];
mas eu também não programo JavaScript, portanto deve ser só nabice minha.

O que puseste no fiddle é diferente do que puseste neste tópico: no fiddle tens duas funções, desenhaFaceTotal e desenhaFaceTot (que provavelmente se devia chamar algo como "calculaFaces" ou algo assim, evita fazer atalhos como "Tot" quando na realidade precisas de encontrar um nome mais descritivo :) ). Assim faz um pouco mais de sentido, mas ainda não totalmente.
É possivel carregar na novaMao sempre que houver saldo porque quando carrega na novaMao remove saldo o mesmo com o canvas

Ele vai buscar os valores de n na função "desenhaFaceTot" eu criei a função "desenhaFaceTot" para ver se conseguia resolver esse bug eu vou alterar o nome do final. A função "alterarNumero" deveria mudar o valor do primeiro canvas não de outro canvas qualquer como acontece no meu código. Exemplo tenho os dados (2, 3, 4, 5, 5) carregava no primeiro canvas (saía o número 3) e mostrava (3, 3, 4, 5, 5) o número 2 tem que sair no exemplo (a menos que saísse outra vez o 2). Às vezes funciona mas é à sorte.

Obrigado na mesma!!!
 
Era desenhar novamente os dados alterando apenas o valor do primeiro array consoante o valor de n (se o valor de n fosse por exemplo 5 desenhava um dado com cinco pintas) e ordenava-o por ordem crescente
E a função "desenhaFaceTotal" só desenha e ordena ou está a fazer algo mais? O que é acontece aos valores do array n, n2, n3, n4, n5 cada vez que chamas a função?
 
Os requisitos não pedem isso certo? Quando se clica no alteraNumero só deveria ser mudada uma face.
Há uma parte da função desenhaFaceTotal que tu queres reutilizar e chamar pela função alteraNumero e uma parte que não queres.
Sim o alteraNumero muda uma face mas não aquela que selecionei eu tou a chamar o desenhaFaceTotal de novo para voltar a fazer o desenho e a ordenação (naquela função supostamente só deveria mudar o valor do primeiro array) os outros valores mantém-se iguais. Na função alteraNumero estou a atribuir a n (primeiro valor do array) um novo valor aleatório.
 
Back
Topo