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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Se puede evitar estos ifs, cómo?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Se puede evitar estos ifs, cómo?  (Leído 331 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.406


Hackentifiko!


Ver Perfil
¿Se puede evitar estos ifs, cómo?
« en: Ayer a las 05:37 »

El código es largo como para ponerlo todo, cualquier cosa pregunten:
Código
  1. } else if (MinCuadraditoPintado < CuadraditoCentraloCD) {
  2. // El dibujo puede ser simétrico...
  3. // a otro ya mostrado. ¿Lo es?
  4. // Esto puede cambiar:
  5. DibujoEsSimetrico = "No";
  6. // Captar valor (colores) de cada fila;
  7. // si alguno es menor al inverso, sí:
  8. PunteroDeFilas = 0;
  9. do {
  10. PunteroDeFilas++;
  11. PunteroDeColumnas = 0;
  12. PunteroInverso = CuadraditosPorFila;
  13. do {
  14. PunteroDeColumnas++;
  15. Valor = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas);
  16. ValorInverso = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroInverso);
  17. // trace("Valor: "+Valor);
  18. // trace("ValorInverso: "+ValorInverso);
  19. if (Valor < ValorInverso) {
  20. DibujoEsSimetrico = "Sí";
  21. FilaFallada = PunteroDeFilas;
  22. PunteroDeFilas = CuadraditosPorFila;
  23. break;
  24. } else if (Valor > ValorInverso) {
  25. // Es ok:
  26. PunteroDeFilas = CuadraditosPorFila;
  27. break;
  28. }
  29. PunteroInverso--;
  30. } while (PunteroDeColumnas < CuadraditosPorFila);
  31. } while (PunteroDeFilas < CuadraditosPorFila);
  32. // Este if es probablemente innecesario,
  33. // porque se supone que el dibujo será simétrico u ok,
  34. // antes de que se terminen de comparar todas las filas.
  35. if (DibujoEsSimetrico == "Sí") {
  36. // trace ("  El dibujo es simétrico a otro ya mostrado.");
  37. DibujosSimetricos++;
  38. // Al Puntero ponerlo al final de la fila...
  39. // captada como simétrica, para posiblemente...
  40. // evitar algunos otros dibujos simétricos:
  41. Puntero = CuadraditosPorFila*FilaFallada;
  42. Variar();
  43. } else if (CuadraditosDespintados < MinCuadraditosDespintados) {
  44. trace ("  El dibujo tiene demasiados cuadraditos pintados: "+CuadraditosDespintados);
  45. DibujosDensos++;
  46. // Preparar Puntero para generar el próximo dibujo:
  47. Puntero = MaxPosiciondePuntero;
  48. Variar();
  49. } else {
  50. DibujosOk++;
  51. // trace ("  Mostrando dibujo nro: "+DibujosOk);
  52. // Preparar Puntero para generar el próximo dibujo:
  53. Puntero = MaxPosiciondePuntero;
  54. play ();
  55. }
  56. } else if (CuadraditosDespintados < MinCuadraditosDespintados) {
  57. trace ("  El dibujo tiene demasiados cuadraditos pintados: "+CuadraditosDespintados);
  58. DibujosDensos++;
  59. // Preparar Puntero para generar el próximo dibujo:
  60. Puntero = MaxPosiciondePuntero;
  61. Variar();
  62. } else {
  63. DibujosOk++;
  64. // trace ("  Mostrando dibujo nro: "+DibujosOk);
  65. // Preparar Puntero para generar el próximo dibujo:
  66. Puntero = MaxPosiciondePuntero;
  67. play ();
  68. }
  69.  

En resumen:
Código:
sino si el dibujo puede ser simétrico
   averiguar si lo es, iniciando un while
      iniciar otro while, también necesario
         si se capta simetría
            terminar los while
         sino si se capta que no hay simetría
            terminar los while
      fin del while
   fin del while
   Si se captó simetría
      hacer A
   sino si es denso
      hacer B
   sino
      hacer C
sino si es denso
   hacer B
sino
   hacer C

Veo 2 problemas:
- Ifs fuera del while, que se cumplen del mismo modo que los de dentro, sin que vaya a haber cambios en el proceso.
- Código repetido.

En cuanto al 1er punto:
El código es parte de la función Variar, que se autollama en los casos A y B, así que los while deberían terminar antes de que se autollame, por eso no puedo hacer A dentro del while como correspondería.

El código repetido se podría evitar si se analiza siempre la simetría (quitar el else if inicial), pero no parece buena idea sabiendo que será necesario sólo a partir de cierto punto (el código se repite así que tampoco es que haya un punto fijo, sólo hay condiciones fijas).

No sé. Lo de simetría, por las dudas, no se refiere a si el dibujo es capicúa, sino que, al ser invertido (espejo | ) es igual a un dibujo hecho antes.

Es un programa que genera dibujos en blanco y negro siguiendo cierto órden.


Me gustaría poner un ejemplo más simple sobre esta estructura de código... A ver:
Código:
Si hace calor
   usar gorro
sino si el cielo está nublado
   averiguar si está lloviendo, iniciando un while
      iniciar otro while, también necesario
         si se capta lluvia
            terminar los while
         sino si se capta que no llueve
            terminar los while
      fin del while
   fin del while
   Si se captó lluvia
      usar paraguas
   sino si hay terremoto
      no salir
   sino
      hacer lo normal
sino si hay terremoto
   no salir
sino
   hacer lo normal
No es muy parecido porque no hay autollamadas. ¿Ese es el problema, debería evitarlas? Puedo poner un while al principio supongo... Repetir mientras el dibujo generado no sea ok. Probaré. ¿Alguna otra idea o sugerencia?

¿Y el código repetido cómo lo hago más eficiente?


« Última modificación: Ayer a las 05:40 por Tachikomaia » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.406


Hackentifiko!


Ver Perfil
Re: ¿Se puede evitar estos ifs, cómo?
« Respuesta #1 en: Hoy a las 06:39 »

Acá, dentro de un while, tengo un problema similar, aunque más sencillo:
Código
  1. // Barril se movió.
  2. // Si toca al personaje:
  3. if (I.Player.hitTest(eval(BarrilaMover)) == true) {
  4. // Si él se está moviendo:
  5. if (I.Player.Action == "Walking") {
  6. // Game over:
  7. gotoAndStop (3);
  8. }
...a partir de ahí, si no hay Game over, quiero ver si el barril toca a otro barril. En realidad acabo de notar que eso no me sirve, pero supongamos que sí, quiero ver cómo se resolvería. Si uno los ifs (los que ya tiene el código) con una &&, no hay problema, salvo que me queda largo y feo el if, me gusta que cada condición esté en una línea distinta. Quizá concatenando las variables antes lograría eso. Pero si no uno los ifs, parece que debo poner 2 elses con lo mismo:
Código
  1. // Barril se movió.
  2. // Si toca al personaje:
  3. if (I.Player.hitTest(eval(BarrilaMover)) == true) {
  4. // Si él se está moviendo:
  5. if (I.Player.Action == "Walking") {
  6. // Game over:
  7. gotoAndStop (3);
  8. } else {
  9. // Ver si toca otro barril.
  10. }
  11. } else {
  12. // Ver si toca otro barril.
  13. }

No quiero ver eso y luego ver si hay game over, porque si hay game over no tiene sentido que se haga eso xP


« Última modificación: Hoy a las 06:42 por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines