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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Lograr exactamente X cambios random en una imagen.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lograr exactamente X cambios random en una imagen.  (Leído 5,222 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Lograr exactamente X cambios random en una imagen.
« en: 22 Junio 2024, 09:54 am »

Tras cliquear en el dibujo superior izquierdo, los demás quedan igual excepto que en este caso los de la fila 1 deben tener 1 diferencia (excepto el que fue cliqueado), los de la fila 2 deben tener 2, y así. Eso no sucede aquí:

Señalé que en la fila 1 hay 1 cambio donde debe, pero en la 4 a veces hay 4, 3, 2 o incluso puede haber 1 porque mi código debe ajustarse para eso ¿cómo?
Código
  1. // Repetir hasta que se haya variado esa cantidad...
  2. // de cuadraditos:
  3. CuadraditosModificados = 0;
  4. do {
  5. CuadraditoaCambiar = "_level0.Dibujo"+Dibujo+".Cuadradito"+(random(_level0.MaxCuadradito)+1);
  6. ColoraSustituirse = new Color(CuadraditoaCambiar);
  7. // A esto lo convierto a String porque...
  8. // lo debo comparar con un string y es más fácil así.
  9. SavedeColoraSustituirse = ""+(ColoraSustituirse.getRGB());
  10. // Repetir mientras el color no cambie:
  11. do {
  12. NuevoColor = _parent.PosiblesColores[random(_parent.PosiblesColores.length)];
  13. } while (NuevoColor == SavedeColoraSustituirse);
  14. ColoraSustituirse.setRGB(NuevoColor);
  15. // trace ("NuevoColor: "+NuevoColor);
  16. CuadraditosModificados++;
  17. } while (CuadraditosModificados<ModificacionesRequeridas);
Si precisan más código avísenme, eso es para modificar los cuadraditos de 1 dibujo, en otras partes se varía cual dibujo. El problema es que se modifica un cuadradito al azar, repetidamente, de modo que cada nuevo modificado puede ser alguno que ya haya sido modificado, por eso aunque en el código se hacen las modificaciones la cantidad de veces requeridas, en la práctica y a la vista pueden ser menos.

¿Debo crear una lista de los modificados y repetir si el nuevo modificado ya lo fue? ¿ha<y alguna alternativa más eficiente, o cómo hago eso? Ya se está repitiendo el cambio de color hasta que efectivamente ocurre (ya que el nuevo es random pero por eso puede ser igual al anterior; se repite para evitar eso), así que en lo posible no quisiera repetir tanta cosa...

Edit:
Acabo de ver que el 2ndo de la 2nda fila es totalmente igual al cliqueado, así que el código está peor de lo que pensé ¿cómo lo mejoro? O tal vez se modificó 1 cuadradito y luego se volvi´a modificar de modo que quedó como estaba, sería como lo que expliqué entonces, no sería un error extra, tal vez.


« Última modificación: 22 Junio 2024, 10:03 am por Tachikomaia » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Re: Lograr exactamente X cambios random en una imagen.
« Respuesta #1 en: 27 Junio 2024, 02:18 am »

Puse esto y el código tarda demasiado ¿sugerencias?
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. Repetido = "No";
  31. do {
  32. NroDeCuadraditoaCambiar = random(_level0.MaxCuadradito)+1;
  33. PunteroParaLista = 1;
  34. // Ver si NroDeCuadraditoaCambiar está en la lista de modificados:
  35. while (PunteroParaLista <= CuadraditosModificados) {
  36. if (NroDeCuadraditoaCambiar == eval("CuadraditoModificado"+PunteroParaLista)) {
  37. Repetido = "Sí";
  38. PunteroParaLista = CuadraditosModificados+1;
  39. }
  40. PunteroParaLista++;
  41. }
  42. } while (Repetido == "Sí");
  43. CuadraditoaCambiar = "_level0.Dibujo"+Dibujo+".Cuadradito"+(random(_level0.MaxCuadradito)+1);
  44. ColoraSustituirse = new Color(CuadraditoaCambiar);
  45. // A esto lo convierto a String porque...
  46. // lo debo comparar con un string y es más fácil así.
  47. SavedeColoraSustituirse = ""+(ColoraSustituirse.getRGB());
  48. // trace ("SavedeColoraSustituirse: "+SavedeColoraSustituirse);
  49. // Repetir mientras el color no cambie:
  50. do {
  51. NuevoColor = _parent.PosiblesColores[random(_parent.PosiblesColores.length)];
  52. } while (NuevoColor == SavedeColoraSustituirse);
  53. ColoraSustituirse.setRGB(NuevoColor);
  54. // trace ("NuevoColor: "+NuevoColor);
  55. CuadraditosModificados++;
  56. // Agregar el cuadradito a la lista de modificados:
  57. set("CuadraditoModificado"+CuadraditosModificados, NroDeCuadraditoaCambiar);
  58. } while (CuadraditosModificados<ModificacionesRequeridas);
  59. }
  60. Dibujo++;
  61. if (ModificacionesRequeridas <= _level0.Resto) {
  62. ModificacionesRequeridas = Math.floor((Dibujo-1)/(_level0.DistintasMutaciones+1))+1;
  63. } else {
  64.    ModificacionesRequeridas = Math.floor((Dibujo-1-_level0.Resto*(_level0.DistintasMutaciones+1))/(_level0.DistintasMutaciones))+1+_level0.Resto
  65. }
  66. }
  67. }


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Re: Lograr exactamente X cambios random en una imagen.
« Respuesta #2 en: 1 Julio 2024, 03:41 am »

Agregué traces:
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. trace("Se modificará un cuadradito del dibujo "+Dibujo);
  31. Repetido = "No";
  32. do {
  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 "+Puntero+" 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"+(random(_level0.MaxCuadradito)+1);
  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. }

Y el resultado al principio dice:
Citar
Se modificará un cuadradito del dibujo 2
El nro: 8
Se verá si ya fue modificado.
Ya se eligió uno no modificado, es: _level0.Dibujo2.Cuadradito2
Se modificará un cuadradito del dibujo 3
El nro: 13
Se verá si ya fue modificado.
Ya se eligió uno no modificado, es: _level0.Dibujo3.Cuadradito14
Se modificará un cuadradito del dibujo 4
El nro: 14
Se verá si ya fue modificado.
Ya se eligió uno no modificado, es: _level0.Dibujo4.Cuadradito16
Se modificará un cuadradito del dibujo 5
El nro: 11
Se verá si ya fue modificado.
Ya se eligió uno no modificado, es: _level0.Dibujo5.Cuadradito8
Se modificará un cuadradito del dibujo 5
El nro: 10
Se verá si ya fue modificado.
Comparando con el nro  de la lista de modificados.
Ya se eligió uno no modificado, es: _level0.Dibujo5.Cuadradito15
Se modificará un cuadradito del dibujo 6
Que empiece por el dibujo 2 está bien.

Que diga que eligió el cuadradito 8 y luego diga que el elegido es el 2, está mal, no sé qué pasa ahí ¿qué pasa?
Del dibujo 3 dice que modificará el cuadradito 13 pero luego dice que modificó el 14, lo mismo.
Con los demás pasa lo mismo.

Que modifique 2 del dibujo 5 está bien, pero cuando compara el candidato a modificado con los modificados debería decir cuales son los que está comparando, quizá olvidé poner ese trace.

El dibujo 10 no lo termina de modificar, dice:
Citar
Se modificará un cuadradito del dibujo 10
El nro: 15
Se verá si ya fue modificado.
Ya se eligió uno no modificado, es: _level0.Dibujo10.Cuadradito7
Se modificará un cuadradito del dibujo 10
El nro: 16
Se verá si ya fue modificado.
Comparando con el nro  de la lista de modificados.
Ya se eligió uno no modificado, es: _level0.Dibujo10.Cuadradito1
Se modificará un cuadradito del dibujo 10
El nro: 16
Se verá si ya fue modificado.
Comparando con el nro  de la lista de modificados.
Comparando con el nro  de la lista de modificados.
Ya fue modificado, se elegirá otro.
El nro: 1
Se verá si ya fue modificado.
Comparando con el nro  de la lista de modificados.
Comparando con el nro  de la lista de modificados.
El nro: 2
Algo falla ahí, antes de decir "El nro: 2" debería decir "Ya se eligió uno no modificado, es..." o "Ya fue modificado, se elegirá otro.".

El programa se repite en eso, básicamente, lo último que muestra (luego de indicar que está tardando demasiado y que yo lo detenga) es:
El nro: 6
Se verá si ya fue modificado.
Comparando con el nro  de la lista de modificados.
Comparando con el nro  de la lista de modificados.
El nro: 4
Se verá si ya fue modificado.

¿Cómo corrijo esos errores?
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Que es exactamente multiplexar
Multimedia
jneo21 3 13,212 Último mensaje 23 Febrero 2004, 01:33 am
por Songoku
¿Qué es el bitrate exactamente?
Multimedia
WildFroVII 5 34,124 Último mensaje 22 Marzo 2008, 13:54 pm
por Songoku
Que es un .EXE exactamente??
Windows
juancaa 4 6,546 Último mensaje 29 Diciembre 2012, 23:22 pm
por $Edu$
Ayuda ! ¿como mostrar cada vez una imagen dinamicamente de carpeta sin random?
PHP
EOF 1 2,517 Último mensaje 21 Enero 2014, 17:32 pm
por basickdagger
Bath ¿Cómo leer una imagen random de una carpeta online?
Scripting
danibus 3 5,432 Último mensaje 3 Agosto 2017, 01:13 am
por danibus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines