Thursday, June 25, 2009

¿Que son ciclos?

Esta primera entrada es en Java y es desde mi curso de Lenguajes de Programación en 2009. ¿Pueden identificar porque es tan mala? Personalmente yo puedo pensar de otra forma para hacer lo mismo sin ciclos, y será mas elegante. ¿Algunas Sugerencias?

public void cantidad_jugadores( ActionEvent e) {
if(valor_nulojug[0]==0){
System.out.println("Primero Establezca La Cantidad de Jugadores en la \n Partida haciendo click en el Boton de jugadores \n mas abajo ");
}else{
int valor = valor_nulo[0];
if(valor==0){
if(cantidad_jug[0]==8){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;
System.out.println("Nombre del Jugador 3");
linea = in.readLine();
Nombre_jug1[3] = linea;
System.out.println("Nombre del Jugador 4");
linea = in.readLine();
Nombre_jug1[4] = linea;
System.out.println("Nombre del Jugador 5");
linea = in.readLine();
Nombre_jug1[5] = linea;
System.out.println("Nombre del Jugador 6");
linea = in.readLine();
Nombre_jug1[6] = linea;
System.out.println("Nombre del Jugador 7");
linea = in.readLine();
Nombre_jug1[7] = linea;
System.out.println("Nombre del Jugador 8");
linea = in.readLine();
Nombre_jug1[8] = linea;
valor_nulo[0]=1;
}

if(cantidad_jug[0]==7){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;
System.out.println("Nombre del Jugador 3");
linea = in.readLine();
Nombre_jug1[3] = linea;
System.out.println("Nombre del Jugador 4");
linea = in.readLine();
Nombre_jug1[4] = linea;
System.out.println("Nombre del Jugador 5");
linea = in.readLine();
Nombre_jug1[5] = linea;
System.out.println("Nombre del Jugador 6");
linea = in.readLine();
Nombre_jug1[6] = linea;
System.out.println("Nombre del Jugador 7");
linea = in.readLine();
Nombre_jug1[7] = linea;
valor_nulo[0]=1;
}


if(cantidad_jug[0]==6){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;
System.out.println("Nombre del Jugador 3");
linea = in.readLine();
Nombre_jug1[3] = linea;
System.out.println("Nombre del Jugador 4");
linea = in.readLine();
Nombre_jug1[4] = linea;
System.out.println("Nombre del Jugador 5");
linea = in.readLine();
Nombre_jug1[5] = linea;
System.out.println("Nombre del Jugador 6");
linea = in.readLine();
Nombre_jug1[6] = linea;

valor_nulo[0]=1;
}

if(cantidad_jug[0]==5){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;
System.out.println("Nombre del Jugador 3");
linea = in.readLine();
Nombre_jug1[3] = linea;
System.out.println("Nombre del Jugador 4");
linea = in.readLine();
Nombre_jug1[4] = linea;
System.out.println("Nombre del Jugador 5");
linea = in.readLine();
Nombre_jug1[5] = linea;


valor_nulo[0]=1;
}


if(cantidad_jug[0]==4){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;
System.out.println("Nombre del Jugador 3");
linea = in.readLine();
Nombre_jug1[3] = linea;
System.out.println("Nombre del Jugador 4");
linea = in.readLine();
Nombre_jug1[4] = linea;


valor_nulo[0]=1;
}

if(cantidad_jug[0]==3){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;
System.out.println("Nombre del Jugador 3");
linea = in.readLine();
Nombre_jug1[3] = linea;

valor_nulo[0]=1;
}

if(cantidad_jug[0]==2){
System.out.println("Nombre del Jugador 1");
linea = in.readLine();
Nombre_jug1[1] = linea;
System.out.println("Nombre del Jugador 2");
linea = in.readLine();
Nombre_jug1[2] = linea;

valor_nulo[0]=1;
}

}

24 comments:

  1. A mi también se me ocurre una forma MUCHO más elegante...ciclos les recuerda a algo?.

    ReplyDelete
  2. Si un ciclo es la mejor manera para hacerlo. Pero hay otra, sin usando un ciclo y con mucho menos código.

    ReplyDelete
  3. aaaa repite todo el mismo rato!, sacar fuera el codigo de los if que es común y algo como

    if(cantidad_jug[0] <= 3){
    System.out.println(imprimo el 3 solo una vez en el codigo y no todo el ratooo!);
    }

    ReplyDelete
  4. if(cantidad_jug[0]<=2){
    system.out.rpintln("imprimo 2 una vez y no todo el ratooo")
    linea = in.readLine();
    Nombre_jug1[2] = linea;
    }
    //Fuera del if,me da flojera repetir en cada if //eso
    valor_nulo[0]=1;

    ReplyDelete
  5. Un manera mas eficiente de hacer es a traves de una pregunta que llame a metodo en particular, que termine creando los jugadores. Incluso Podriamos hacer un random de nombre desde archivo.


    Matías Dávila...In class
    9:10

    ReplyDelete
  6. preguntar por los ocho jugadores en variables distintas y los jugadores que no utilize iniciarlos en 0 asi escribo y pregunto de a uno y este preseso solo una vez por todos.
    asi utilizar los jugadores que tengan el nombre y los == a cero no me sirven.

    pablo.

    ReplyDelete
  7. con un case, definiendo una variable n que tome el numero de jugadores, con esto se realiza el case segun la cantidad de jugadores.
    Alexi Tapia

    ReplyDelete
  8. Alexi es lo mas cerca, pero esa no ahorra mucho código.

    ReplyDelete
  9. el case se debería realizar dentro del ciclo.

    ReplyDelete
  10. This comment has been removed by the author.

    ReplyDelete
  11. Se debe implementar un switch, donde sus case estén dirigidos a métodos que solicitarán los datos.

    Por ejemplo:

    System.out.println("Ingresa numero de jugadores: ");
    cantidad_de_jugadores=a.readLine();

    switch(cantidad_de_jugadores){

    case 2:metodo2(jugador);
    break;

    case 3:metodo2(jugador);
    metodo3(jugador);
    break;

    case 4: metodo2(jugador);
    metodo3(jugador);
    metodo4(jugador);
    break;

    ...
    }

    En “metodo2” se solicitaran el nombre del jugador 1 y el jugador 2.
    En “método3” se solicitará el nombre del jugador 3.
    En tanto si entra en el case 3 se llamará a método2 y a método3 (como se indica en el case 3).
    Los métodos pueden ser de la siguiente forma:

    public void metodo2(String jugador[]{
    println("nombre jugador 1: ");
    linea=in.readLine();
    jugador[1]=linea;
    println("nombre jugador 2: ");
    linea=in.readLine();
    jugador[2]=linea;
    }

    public void metodo3(String jugador[]){
    println("nombre jugador 3: ");
    linea=in.readLine();
    jugador[3]=linea;
    }



    Cristian Cordero

    ReplyDelete
  12. Mas cerca, pero todavía hay una forma mas simple...

    ReplyDelete
  13. Recursividad es una manera, y a veces es elegante, pero en esta instancia hay una forma mas sencilla.

    ReplyDelete
  14. print("jug 1: ");
    names[0] = readLine();
    print("jug 2: ");
    names[1] = readLine();

    if (cant > 2)
    {
    print("jug 3: ");
    names[2] = readLine();
    }

    if (cant > 3)
    {
    print("jug 4: ");
    names[3] = readLine();
    }

    if (cant > 4)
    {
    print("jug 5: ");
    names[4] = readLine();
    }

    if (cant > 5)
    {
    print("jug 6: ");
    names[5] = readLine();
    }

    if (cant > 6)
    {
    print("jug 7: ");
    names[6] = readLine();
    }

    if (cant > 7)
    {
    print("jug 8: ");
    names[7] = readLine();
    }

    //por esto existen los ciclos

    ReplyDelete
  15. Indicamos el numero de jugadores y realizamos la siguiente operacion

    jugadores = 9-jugadores;
    switch(jugadores)
    case 1:
    hacemos lo de 8
    case 2:
    hacemos lo de 7
    case 3:
    hacemos lo de 6
    .
    .
    .
    case 7:
    hacemos lo de 2
    case 8:
    hacemos lo de 1

    si usamos el switch sin el break pasará desde el caso indicada hasta la última, si ingresamos 8 haría solo 1 instruccion de ahi ponerlas invertidas.
    Es un poco mas eficiente que el anterior.. creo..

    Cristian.

    ReplyDelete
  16. Bien.. el ultimo comentario es lo que quiero.

    por el "abuso" del switch/case, podemos hacer el código sin un ciclo, y en muchas menos lineas.

    Por supuesto, el ideal es:
    for (int i=0; i<num_jugadores; i++) {
    System.out.println("Nombre del Jugador "+(i+1));
    Nombre_jug1[i] = in.readLine();
    }

    ReplyDelete
  17. en el de Cristian falta incrementar la variable jugadores

    Son menos lineas de codigo, pero me parece que es menos eficiente por la necesidad de incrementar una variable. el "case" es un if camuflado.

    ReplyDelete
  18. En este caso no importa mucho, pero fíjense que en el ciclo for suele ser más apropiado usar ++i que i++

    ReplyDelete
  19. Se puede "hard code" los indexes como en el ejemplo original, no necesita incrementar jugadores. El switch se entra al condición correcta y todos los condiciones posteriores son usados. La idea es equivalente a el series de if-statements, pero menos lineas del código.

    (La ventaja de los if-statements es que se puede preguntar para jugador 1 antes jugador 8. No es posible con el switch)

    ReplyDelete
  20. Entonces:

    x = 9 - jugadores;
    switch(x)
    case 1:
    get_name(1);
    case 2:
    get_name(3 - x);
    case 3:
    get_name(4 - x);
    case 4:
    get_name(5 - x);
    case 5:
    get_name(6 - x);
    case 6:
    get_name(7 - x);
    case 7:
    get_name(8 - x);
    case 8:
    get_name(9 - x);

    Y tenemos el switch pidiendo el nombre del jug 1 antes del jugador 8.

    ReplyDelete
  21. Si, este es correcto. Pero quizás mi sentencia fue imprecisa.

    No es posible usar un switch con los números de jugadores hardcoded como en el original sin cambiando el orden. Con parámetros, casi todo es posible ;-).

    ReplyDelete