Foros del Web » Programando para Internet » Javascript »

Porque pasa esto?

Estas en el tema de Porque pasa esto? en el foro de Javascript en Foros del Web. Buenas estoy creando un juego simple para practicar. Se trata que en un canvas creo 12 cuadrados, de varios colores, aleatorios cogidos de un array, ...
  #1 (permalink)  
Antiguo 23/05/2013, 07:23
 
Fecha de Ingreso: mayo-2009
Mensajes: 232
Antigüedad: 14 años, 11 meses
Puntos: 3
Porque pasa esto?

Buenas estoy creando un juego simple para practicar. Se trata que en un canvas creo 12 cuadrados, de varios colores, aleatorios cogidos de un array, pero siempre debe haber uno rojo, el cual es elque debes clickar.

Ahora pondre el codigo, pero basicamente lo k hago es un for, k de 12 vueltas, y creando un numero aleatorio con Math.random(), si la 'i' del for coincide con el aleatorio, pues el cuadrado es rojo, sino pasa a ser uno del array.

El problema es, que si haces F5 repetidas veces, para ver como o va creando aleatoriamente, alguna vez me salen 2 cuadrados rojos, y segun el codigo eso es imposible..

Hos dejo el codigo, espero lo proveis vosotros y comproveis k crea hasta 3 cuadrados rojos (siempre seguidos).

Ademas, lo avance mas y puse que si pulsavas en el rojo saliera un alert, y cuando salen 2 o 3 rojos solo sale el alert en el primero, los otros me dice que no es rojo -_-.


El codigo:

Código Javascript:
Ver original
  1. <html>
  2. <head>
  3.   <title></title>
  4. </head>
  5. <body>
  6.  
  7.  
  8.   <div align='center'>
  9.  
  10. <canvas id="myCanvas" width="600" height="600" align='center'/></canvas>
  11.  
  12. </div>
  13. <script type="text/javascript">
  14.  
  15. var level = parseInt(localStorage.level);
  16.  
  17.  
  18. var size = 40;
  19. var numxfila = 3;
  20. var cont = 0;
  21.  
  22. var colors=new Array("yellow","green","blue","black");
  23.  
  24.  
  25. var elem = document.getElementById('myCanvas'),
  26.     elemLeft = elem.offsetLeft,
  27.     elemTop = elem.offsetTop,
  28.     context = elem.getContext('2d'),
  29.     elements = [];
  30.  
  31. // Add element.
  32.  
  33. var posx = 10;
  34. var posy = 10;
  35.  
  36. var aleat2 = Math.random() * 11;
  37.     aleat2 = Math.round(aleat2);
  38.  
  39.  
  40. if (aleat2 == 0){aleat2 = 1;}
  41.  
  42. for (var i = 0 ; i <= 11; i++) {
  43.  
  44.   var aleat = Math.random() * 4;
  45.     aleat = Math.round(aleat);
  46.  
  47.  
  48.   if (cont == numxfila) {
  49.  
  50.     cont = 0;
  51.     posy += 50;
  52.     posx = 10;
  53.   };
  54.  
  55.  
  56.  
  57. if (i == aleat2) {
  58.  
  59.   elements.push({
  60.     colour: 'red',
  61.     width: size,
  62.     height: size,
  63.     top: posy,
  64.     left: posx
  65. });
  66.  
  67. }else {
  68.  
  69.   elements.push({
  70.     colour: colors[aleat],
  71.     width: size,
  72.     height: size,
  73.     top: posy,
  74.     left: posx
  75. });
  76. }
  77.  
  78.  
  79. posx +=50;
  80. cont +=1;
  81.  
  82. };
  83.  
  84.  
  85.  
  86. // Render elements.
  87. elements.forEach(function(element) {
  88.     context.fillStyle = element.colour;
  89.     context.fillRect(element.left, element.top, element.width, element.height);
  90. });
  91.  
  92. </script>
  93. </body>
  94. </html>
  #2 (permalink)  
Antiguo 23/05/2013, 09:25
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Porque pasa esto?

según mis pruebas, estás generando el valor aleatorio hasta el 4

var aleat = Math.random() * 4;

recuerda que ramdom siempre da un numero entre 0 y < 1, que nunca será uno (1), por lo que lógicamente aleat devolverá valores de 0 al < 4, pero como aplicas round, cualquier valor de > 3,5 te dará 4, lo que provoca un undefined al asignar el color (recuerda que el arreglo va del 0 al 3), y ello es el porque se repite.

o quitas el round o estableces el rango hasta 3
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 24/05/2013, 09:29
 
Fecha de Ingreso: mayo-2009
Mensajes: 232
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Porque pasa esto?

Muchas gracias maycolalvarez! Ese era el error.

Ahora estuve toqueteandolo un poco mas, para añadir eventos y niveles.

Peor otra vez llego a un punto que no se porque pasa lo que pasa...

Tengo una funcion Start que dibuja los cuadrados en el cambas, guarda los elementos en un array y crea los eventos de click.

Si pulsas el rojo se para el tiempo, sube un nivel 'level +=1',detiene el listener, borra todo y redibuja otra vez con la funcion start, esta vez con un cuadrado mas. Si por el contrario pulsas en uno erronio, aparte del mensaje, cambia el level a 1 otra vez, y lo otro igual.

Eso es la teoria, pero en la practica, aunque no te equivoques, los niveles no se suman 1 a 1, sino k van 1,2,4,8,12,16,20.. etc...

Aparte, en el nivel 4 o 6 normalmente todo se descontrola, pulsas sobre el rojo y dice que te has equivocado, y adems de sumar mas niveles de los k son, añade el doble o mas de cuadrados. cuando es una simple funcion k le dice k sume 1.


El codigo:

Código Javascript:
Ver original
  1. var level = 1;
  2. var anchurapantalla = screen.availWidth;
  3. var alturapantalla = screen.availHeight;
  4.  
  5. var popup = document.getElementById('alert');
  6.  
  7. popup.style.left= (anchurapantalla / 2) -100;
  8. popup.style.top= (alturapantalla / 2) -100
  9.  
  10. var elem = document.getElementById('canvas'),
  11.     elemLeft = elem.offsetLeft,
  12.     elemTop = elem.offsetTop,
  13.     context = elem.getContext('2d'),
  14.     elements = [];
  15.  
  16. elem.width = anchurapantalla;
  17. elem.height = alturapantalla;
  18.  
  19. context.fillRect(0, 0, anchurapantalla, alturapantalla);
  20.  
  21.  
  22. var size = 40;
  23. var numxfila = 3;
  24. var posx = 10;
  25. var posy = 10;
  26. var sumax = 50;
  27.  
  28. var a = document.getElementById("time");
  29. var time = 222;
  30.  
  31. var colors=new Array("yellow","green","blue","white","orange");
  32.  
  33. var timer ;
  34.  
  35. //AGREGO LOS LISTENERS A LOS ELEMENTOS
  36.  
  37.  
  38. function listener(event){
  39.  
  40. var x = event.pageX - elemLeft,
  41.         y = event.pageY - elemTop;
  42.     console.log(x, y);
  43.     elements.forEach(function(element) {
  44.         if (y > element.top && y < element.top + element.height && x > element.left && x < element.left + element.width) {
  45.  
  46.  
  47.             if (element.colour == 'red') {
  48.  
  49.                 elem.removeEventListener('click', listener, false);
  50.                 clearInterval(timer);
  51.                 time = 222;
  52.                 posx = 10;
  53.                 level +=1;
  54.  
  55.                 context.fillStyle="#000000";
  56.                 context.fillRect(0, 0, anchurapantalla, alturapantalla);
  57.  
  58.                 start();
  59.  
  60.             }else{
  61.  
  62.  
  63.                 elem.removeEventListener('click', listener, false);
  64.                 clearInterval(timer);
  65.  
  66.                
  67.  
  68.                 context.fillStyle="#000000";
  69.                 context.fillRect(0, 0, anchurapantalla, alturapantalla);
  70.  
  71.                 alert('Fallaste! llegaste al nivel '+level );
  72.  
  73.                 time = 222;
  74.                 posx = 10;
  75.                 level = 1;
  76.                
  77.          
  78.                 start();
  79.  
  80.             }
  81.            
  82.         }
  83.     });
  84.  
  85.  }
  86.  
  87.  
  88.  
  89.  
  90. function start(){
  91.  
  92. var rojo = Math.floor((Math.random()*level));
  93.     rojo = Math.round(rojo);
  94.  
  95. if (rojo == 0) { rojo = 1;};
  96. //CREO EL TEXTO
  97.  
  98. context.fillStyle = '#ffffff';
  99. context.font = 'italic bold 11px sans-serif';
  100. context.textBaseline = 'bottom';
  101. context.fillText('LeVeL: '+level, alturapantalla/2, 30);
  102.  
  103.  
  104. document.getElementById('alert').style.display = "none";
  105.  
  106.  
  107. var cont = 0;
  108.  
  109. for (var i = 1 ; i <= level; i++) {
  110.    
  111.     var color = Math.random() * 4;
  112.     color = Math.round(color);
  113.  
  114.  
  115.     if (cont == numxfila) {
  116.  
  117.         cont = 0;
  118.         posy += 50;
  119.         posx = 10;
  120.     };
  121.  
  122.  
  123.  
  124. if (i == rojo) {
  125.  
  126.     elements.push({
  127.     colour: 'red',
  128.     width: size,
  129.     height: size,
  130.     top: posy,
  131.     left: posx
  132. });
  133.  
  134. }else {
  135.  
  136.     elements.push({
  137.     colour: colors[color],
  138.     width: size,
  139.     height: size,
  140.     top: posy,
  141.     left: posx
  142. });
  143. }
  144.  
  145.  
  146. posx += sumax;
  147. cont += 1;
  148.  
  149. };
  150.  
  151.  
  152.  
  153. // Creo los elementos.
  154. elements.forEach(function(element) {
  155.     context.fillStyle = element.colour;
  156.     context.fillRect(element.left, element.top, element.width, element.height);
  157. });
  158.  
  159. //ejecuto el listener
  160. elem.addEventListener('click', listener, false);
  161.  
  162. //EMPIEZA L CUENTA ATRAS
  163.  
  164. timer = setInterval(ciclo,1000,false);
  165.  
  166.  
  167. }
  168.  
  169.  
  170.  
  171.  
  172. function ciclo(){
  173.  
  174.  
  175.  
  176. time -=1;
  177.  
  178. document.getElementById('time').innerHTML = time;
  179.  
  180. if(time == 0){
  181.  
  182. clearInterval(timer);
  183.  
  184. alert('Fuiste demasiado lento');
  185.  
  186.  
  187. }
  188.  
  189.  
  190.  
  191. }


Hos pongo la parte de html por si quereis provarlo:

Código HTML:
Ver original
  1.     <title></title>
  2.     <link rel="stylesheet" type="text/css" href="css/style.css" />
  3. </head>
  4. <div width='100%' height='10' align = 'center'>Time: <font id='time' size='5'> 3</font></div>
  5. <canvas id="canvas" width="100" height="100" align='center'/></canvas>
  6. <div id='alert' width='100' height='100' align='center'>
  7.     3 SEGUNDOS PARA PULSAR EL ROJO.
  8. <br>
  9.     <button onclick='start();'> START </button>
  10. </div>
  11. </body>
  12. <script src="js/game.js"></script>
  13. </html>


PD: En niveles superiores, crea tambien mas de uno rojo, y e comprovado que si clickeas en uno igual te suma 4 niveles, en otro solo te suma 1 y en otro te dice k no es rojo y pierdes. -_-

Última edición por phyronx; 24/05/2013 a las 09:47

Etiquetas: html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:51.