elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Muchos loops, ayuda.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Muchos loops, ayuda.  (Leído 1,069 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Muchos loops, ayuda.
« en: 19 Agosto 2024, 07:10 am »

El programa genera dibujos en varios cuadros, separados con verde:

Hay 4x4 dibujos.

Luego, cuando el usuario cliquea un dibujo, se transmite a los demás pero con algunas mutaciones. Los de arriba-izquierda mutan menos y los de abajo-derecha mutan más (el cálculo para determinar cuántos mutan en cada dibujo me lo dijeron matemáticos, no lo entiendo bien, pero no importa aquí).

Creo que funciona bien, aquí está el código del clic:
Nota: Es importante diferenciar cuadro de cuadradito: Los cuadros son los dibujos separados con verde, los cuadraditos son digamos los píxeles (pero más grandes que un pixel) que contiene cada dibujo.
Código
  1. on (release) {
  2. // Los dibujos serán como el de encima de este botón:
  3. Dibujo = 1;
  4. ModificacionesRequeridas = 1;
  5. // Repetir para el dibujo 1, 2, etc:
  6. while (Dibujo < _level0.MaxCuadro+1) {
  7. // Este if es porque el dibujo a copiar no necesita...
  8. // ser modificado, eso sería como sustituirse por él mismo:
  9. if (Dibujo != _parent.ID) {
  10. Cuadradito = 0;
  11. // Repetir hasta que todo cuadradito se haya copiado:
  12. do {
  13. Cuadradito++;
  14. ColoraCopiar = new Color("_parent.Cuadradito"+Cuadradito);
  15. ColoraSustituirse = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+Cuadradito);
  16. ColoraSustituirse.setRGB(ColoraCopiar.getRGB());
  17. } while (Cuadradito<_level0.MaxCuadradito);
  18. // Los dibujos mutarán:
  19. // De cada dibujo copia, variar cuadraditos al azar,
  20. // de 1 hasta CuadraditosPorFila,
  21. // aumentando por dibujo hacia derecha y abajo:
  22. // Repetir hasta que se haya variado esa cantidad...
  23. // de cuadraditos:
  24. CuadraditosModificados = 0;
  25. do {
  26. // Para evitar que se modifique uno ya modificado,
  27. // los modificados se guardan en una lista,
  28. // y cuando se va a modificar uno se mira...
  29. // que no esté en la lista, sino se elige otro:
  30. do {
  31. trace("Se modificará un cuadradito del dibujo "+Dibujo);
  32. Repetido = "No";
  33. NroDeCuadraditoaCambiar = random(_level0.MaxCuadradito)+1;
  34. trace("El nro: "+NroDeCuadraditoaCambiar);
  35. trace("Se verá si ya fue modificado.");
  36. PunteroParaLista = 1;
  37. // Ver si NroDeCuadraditoaCambiar está en la lista de modificados:
  38. while (PunteroParaLista <= CuadraditosModificados) {
  39. trace("Comparando con el nro "+PunteroParaLista+" de la lista de modificados.");
  40. if (NroDeCuadraditoaCambiar == eval("CuadraditoModificado"+PunteroParaLista)) {
  41. Repetido = "Sí";
  42. PunteroParaLista = CuadraditosModificados+1;
  43. trace("Ya fue modificado, se elegirá otro.");
  44. }
  45. PunteroParaLista++;
  46. }
  47. } while (Repetido == "Sí");
  48. CuadraditoaCambiar = "_level0.Dibujo"+Dibujo+".Cuadradito"+NroDeCuadraditoaCambiar;
  49. trace("Ya se eligió uno no modificado, es: "+CuadraditoaCambiar);
  50. ColoraSustituirse = new Color(CuadraditoaCambiar);
  51. // A esto lo convierto a String porque...
  52. // lo debo comparar con un string y es más fácil así.
  53. SavedeColoraSustituirse = ""+(ColoraSustituirse.getRGB());
  54. // trace ("SavedeColoraSustituirse: "+SavedeColoraSustituirse);
  55. // Repetir mientras el color no cambie:
  56. do {
  57. NuevoColor = _parent.PosiblesColores[random(_parent.PosiblesColores.length)];
  58. } while (NuevoColor == SavedeColoraSustituirse);
  59. ColoraSustituirse.setRGB(NuevoColor);
  60. // trace ("NuevoColor: "+NuevoColor);
  61. CuadraditosModificados++;
  62. // Agregar el cuadradito a la lista de modificados:
  63. set("CuadraditoModificado"+CuadraditosModificados, NroDeCuadraditoaCambiar);
  64. } while (CuadraditosModificados<ModificacionesRequeridas);
  65. }
  66. Dibujo++;
  67. if (ModificacionesRequeridas <= _level0.Resto) {
  68. ModificacionesRequeridas = Math.floor((Dibujo-1)/(_level0.DistintasMutaciones+1))+1;
  69. } else {
  70.    ModificacionesRequeridas = Math.floor((Dibujo-1-_level0.Resto*(_level0.DistintasMutaciones+1))/(_level0.DistintasMutaciones))+1+_level0.Resto
  71. }
  72. }
  73. }

Quiero agregar que cada dibujo resultante deba tener cierta cantidad de colores (3 en este caso), ni más ni menos. Eso implica que si los cuadraditos elegidos a modificarse son los únicos que tienen cierto color, deben elegirse otros (porque si cambian de color, habría menos colores, por ser los únicos que tenían ese color). Y eso, creo, implica que ya no conviene modificarlos a penas se seleccionan, porque si no son una elección válida entonces habría que volverlos al color anterior y eso parece más complicado y menos eficiente que irlos guardando en una lista y modificarlos recién cuando esté completa.
Tengo más o menos la idea de cómo hacerlo pero son tantos while (o no sé evitarlos) que me lié. El pseudocódigo yo diría que es:
Código:
Repetir
   Si el dibujo (de turno, D) a sustituirse no es el que se está copiando,
      sustituirlo por el que se está copiando ("pegárselo" encima).
      Repetir
         Repetir
            Seleccionar un cuadradito del dibujo D.
            Si ese ya fue elegido, volver a elegir un cuadradito de D (contador--).
         hasta que se haya elegido la cantidad requerida.
         Si los elegidos no son válidos,
            elegirlos de nuevo (indicar que este loop reinicie ¿resetar contador?).
      hasta que se haya elegido un grupo válido.
      Repetir
         Repetir
            Modificar el color de uno de los cuadraditos elegidos y llevar la cuenta de cuántos colores tiene el dibujo.
         hasta que se haya modificado el color de todos los elegidos.
         Si el dibujo no tiene la cantidad requerida de colores,
            modificar los colores de nuevo (indicar que este loop reinicie).
      hasta que el dibujo tenga la cantidad requerida de colores.
hasta que se haya aplicado a todo dibujo.
Bueno, creo que está bien, hacer pseudocódigos puede simplificar la tarea veo, yo me había quedado así:
Código
  1. on (release) {
  2. // Los dibujos serán como el de encima de este botón:
  3. Dibujo = 1;
  4. ModificacionesRequeridas = 1;
  5. // Repetir para el dibujo 1, 2, etc:
  6. while (Dibujo < _level0.MaxCuadro+1) {
  7. // Este if es porque el dibujo a copiar no necesita...
  8. // ser modificado, eso sería como sustituirse por él mismo:
  9. if (Dibujo != _parent.ID) {
  10. Cuadradito = 0;
  11. // Repetir hasta que todo cuadradito se haya copiado:
  12. do {
  13. Cuadradito++;
  14. ColoraCopiar = new Color("_parent.Cuadradito"+Cuadradito);
  15. ColoraSustituirse = new Color("_level0.Dibujo"+Dibujo+".Cuadradito"+Cuadradito);
  16. ColoraSustituirse.setRGB(ColoraCopiar.getRGB());
  17. } while (Cuadradito<_level0.MaxCuadradito);
  18. // Los dibujos mutarán:
  19. // De cada dibujo copia, variarán cuadraditos al azar,
  20. // de 1 hasta CuadraditosPorFila,
  21. // aumentando por dibujo hacia derecha y abajo,
  22. // pero 1ero elegir cuales,
  23. // porque puede que la elección no sea válida,
  24. // en cuyo caso habría que resetearlos.
  25. // La elección no es válida si los elegidos tienen el mismo color y son los únicos con ese.
  26. // A continuación se eligen para 1 dibujo, pero esto se está repitiendo en un loop mayor:
  27. CuadraditosElegidos = 0;
  28. do {
  29. Repetir = "No";
  30. // Para evitar que se elija uno ya elegido,
  31. // los elegidos se guardan en una lista,
  32. // y cuando se va a elegir uno se mira...
  33. // que no esté en la lista, sino se elige otro:
  34. do {
  35. trace("Se elegirá un cuadradito del dibujo "+Dibujo);
  36. Repetido = "No";
  37. CuadraditoElegido = random(_level0.MaxCuadradito)+1;
  38. trace("El nro: "+CuadraditoElegido);
  39. trace("Se verá si ya fue elegido:");
  40. PunteroParaLista = 1;
  41. // Ver si CuadraditoElegido está en la lista de elegidos:
  42. while (PunteroParaLista <= CuadraditosElegidos) {
  43. trace("Comparando con el nro "+PunteroParaLista+" de la lista de elegidos.");
  44. if (CuadraditoElegido == eval("CuadraditoElegido"+PunteroParaLista)) {
  45. Repetido = "Sí";
  46. // Esto es para que ya no mire la lista:
  47. PunteroParaLista = CuadraditosElegidos;
  48. trace("Ya fue elegido antes, se elegirá otro.");
  49. }
  50. PunteroParaLista++;
  51. }
  52. } while (Repetido == "Sí");
  53. CuadraditosElegidos++;
  54.  
  55.  
  56.  
  57. // Repetir hasta que se haya variado esa cantidad...
  58. // de cuadraditos:
  59. CuadraditosaModificarse = 0;
  60. do {
  61. // Para evitar que se modifique uno ya modificado,
  62. // los modificados se guardan en una lista,
  63. // y cuando se va a modificar uno se mira...
  64. // que no esté en la lista, sino se elige otro:
  65. do {
  66. trace("Se modificará un cuadradito del dibujo "+Dibujo);
  67. Repetido = "No";
  68. NroDeCuadraditoaCambiar = random(_level0.MaxCuadradito)+1;
  69. trace("El nro: "+NroDeCuadraditoaCambiar);
  70. trace("Se verá si ya fue modificado.");
  71. PunteroParaLista = 1;
  72. // Ver si NroDeCuadraditoaCambiar está en la lista de modificados:
  73. while (PunteroParaLista <= CuadraditosaModificarse) {
  74. trace("Comparando con el nro "+PunteroParaLista+" de la lista de modificados.");
  75. if (NroDeCuadraditoaCambiar == eval("CuadraditoModificado"+PunteroParaLista)) {
  76. Repetido = "Sí";
  77. PunteroParaLista = CuadraditosaModificarse+1;
  78. trace("Ya fue modificado, se elegirá otro.");
  79. }
  80. PunteroParaLista++;
  81. }
  82. } while (Repetido == "Sí");
Un lío. Nótese que estoy cambiando algunos nombres por lo de que debe eligirse un grupo y chequearse que sirvan en vez de modificar colores enseguida.

Intentaré transformar el pseudocódigo en código, pero ¿se puede simplificar? ¿consejos?


« Última modificación: 19 Agosto 2024, 07:14 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fruity Loops en Español
Multimedia
Джордж 6 21,923 Último mensaje 23 Marzo 2007, 00:02 am
por Джордж
Loops infinitos en input erroneos
Programación C/C++
RyogiShiki 7 4,401 Último mensaje 1 Abril 2011, 22:17 pm
por Akai
Busqueda de sitio - samples ,loops etc.
Dudas Generales
Zorronde 2 2,553 Último mensaje 4 Marzo 2013, 13:58 pm
por Zorronde
Duda con LOOPS
Programación C/C++
pablovg9 5 2,274 Último mensaje 1 Agosto 2015, 23:08 pm
por pablovg9
Ayuda mostrar filas se relacion muchos a muchos
Bases de Datos
Filantropo 7 3,133 Último mensaje 23 Abril 2020, 10:03 am
por WHK
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines