Ejercicio: Creación de una lógica de decisión anidada con if, else if y else

Completado

En la unidad anterior usamos varias instrucciones if para implementar las reglas de un juego. Sin embargo, al final de la unidad, observamos que se necesitan instrucciones if más expresivas para corregir un error sutil en el código.

En este ejercicio usaremos instrucciones if, else y else if para mejorar las opciones de bifurcación en el código y corregir un error de lógica.

Uso de las instrucciones if y else en lugar de dos instrucciones if independientes

En lugar de realizar dos comprobaciones para mostrar el mensaje "¡Ha ganado!" o "Lo sentimos, ha perdido", usaremos la palabra clave else.

  1. Asegúrese de que el código de Program.cs coincida con lo siguiente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Este es el código que completamos en la unidad anterior.

  2. Dedíquele un minuto a examinar las dos instrucciones if al final del archivo:

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Observe que ambas instrucciones if comparan total con el mismo valor numérico. Esta es la oportunidad perfecta para usar una instrucción else.

  3. Actualice las dos instrucciones if de la siguiente manera:

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Aquí, si total >= 15 es false, se ejecutará el siguiente bloque de código; después se ejecutará la palabra clave else. Dado que los dos resultados son contrarios, se trata de un escenario perfecto para la palabra clave else.

  4. El archivo Program.cs actualizado debe contener el código siguiente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles!  +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3))
    {
        Console.WriteLine("You rolled triples!  +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

Modificación del código para eliminar la acumulación de puntos extra por obtener dobles y triples con anidamiento

En la unidad anterior, vimos que se introdujo un error de lógica sutil en la aplicación. Puede corregir ese problema si anida las instrucciones if.

El anidamiento nos permite colocar bloques de código dentro de otros bloques de código. En este caso, anidaremos una combinación de if y else (la comprobación de dobles) dentro de otra instrucción if (la comprobación de triples) para evitar que se otorguen ambas bonificaciones.

  1. Modifique su código para que coincida con la lista de código siguiente:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    
  2. Tómese un minuto para revisar las instrucciones if anidadas.

    El objetivo es crear una construcción if-else interna en la que los dos resultados sean contrarios y, a continuación, usar los resultados contrarios (if/true y else/false) para conceder los puntos de bonificación para triples y dobles. Para lograr este objetivo, comprobamos si hay dobles en la instrucción if externa y, a continuación, triples en la instrucción if interna. Este patrón garantiza que, cuando la comprobación interna de triples devuelva false, el bloque de código else puede conceder los puntos para los dobles.

    Próximamente, "codificaremos de forma rígida" los resultados de las tres tiradas para probar la lógica del código.

  3. Cree una línea de código en blanco encima de la línea donde se declara e inicializa total.

  4. Para probar una tirada de dobles, escriba el código siguiente:

    roll1 = 6;
    roll2 = 6;
    roll3 = 5;
    

    Codificar de forma rígida las tres variables roll permite probar el código sin tener que ejecutar la aplicación decenas de veces.

  5. En el menú Archivo de Visual Studio Code, haga clic en Guardar.

  6. En el panel EXPLORADOR, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y seleccione abrir en terminal integrado.

    Debe abrirse un panel de terminal y debe incluir un símbolo del sistema que muestre que el terminal está abierto en la ubicación de la carpeta TestProject.

  7. En el símbolo del sistema del terminal, para ejecutar el código, escriba dotnet run y presione Intro.

    Cuando se ejecute el código, debería ver lo siguiente:

    Dice roll: 6 + 6 + 5 = 17
    You rolled doubles!  +2 bonus to total!
    You win!
    
    
  8. Para probar una tirada de triples, actualice las variables de tirada codificadas de forma rígida como se indica a continuación:

    roll1 = 6;
    roll2 = 6;
    roll3 = 6;
    
  9. En el menú Archivo de Visual Studio Code, haga clic en Guardar.

  10. En el panel EXPLORADOR, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y seleccione abrir en terminal integrado.

  11. En el símbolo del sistema del terminal, para ejecutar el código, escriba dotnet run y presione Intro.

    Cuando se ejecute el código, debería ver lo siguiente:

    Dice roll: 6 + 6 + 6 = 18
    You rolled triples!  +6 bonus to total!
    You win!
    
    

Uso de instrucciones if, else y else if para ofrecer un premio en lugar de un mensaje de que ha ganado o erdido

Para que el juego sea más divertido, podemos cambiar la dinámica de ganar o perder para adjudicar premios ficticios a cada puntuación. Podemos ofrecer cuatro premios. El jugador solo debe ganar uno:

  • Si el jugador obtiene una puntuación igual o mayor que 16, gana un coche nuevo.
  • Si el jugador obtiene una puntuación igual o mayor que 10, gana un portátil nuevo.
  • Si el jugador obtiene una puntuación de 7, gana un viaje.
  • De lo contrario, el jugador gana un gatito.
  1. Modifique el código de los pasos anteriores para que coincida con la siguiente lista de códigos:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    
        Console.WriteLine($"Your total including the bonus: {total}");
    }
    
    if (total >= 16)
    {
        Console.WriteLine("You win a new car!");
    }
    else if (total >= 10)
    {
        Console.WriteLine("You win a new laptop!");
    }
    else if (total == 7)
    {
        Console.WriteLine("You win a trip for two!");
    }
    else
    {
        Console.WriteLine("You win a kitten!");
    }
    
    
  2. Tómese un minuto para revisar la construcción if-elseif-else actualizada.

    Las instrucciones if, else if y else permiten crear varias condiciones exclusivas como expresiones booleanas. En otras palabras, cuando solo queremos que se produzca un resultado, pero tenemos varias condiciones y resultados posibles, usaremos tantas instrucciones else if como queramos. Si no se aplica ninguna de las instrucciones if y else if, se ejecutará el bloque de código else final. else es opcional, pero debe ser la última condición si decide incluirla.

  3. Use la técnica de codificar temporalmente de forma rígida las variables roll para probar cada mensaje.

Resumen

  • La combinación de instrucciones if y else permite probar una condición y, a continuación, realizar uno de los dos resultados. El bloque de código de if se ejecutará cuando la expresión booleana sea true y el bloque de código de else, cuando la expresión booleana sea false.
  • Puede anidar instrucciones if para limitar una posible condición. Aun así, considere la posibilidad de usar instrucciones ifm else if y else en su lugar.
  • Use instrucciones else if para crear varias condiciones exclusivas.
  • else es opcional, pero si se incluye, debe aparecer en último lugar.