Ejercicio: Creación de una lógica de decisión anidada con if, else if y else
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.
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.
Dedíquele un minuto a examinar las dos instrucciones
ifal final del archivo:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }Observe que ambas instrucciones
ifcomparantotalcon el mismo valor numérico. Esta es la oportunidad perfecta para usar una instrucciónelse.Actualice las dos instrucciones
ifde la siguiente manera:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }Aquí, si
total >= 15es false, se ejecutará el siguiente bloque de código; después se ejecutará la palabra claveelse. Dado que los dos resultados son contrarios, se trata de un escenario perfecto para la palabra claveelse.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.
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."); }Tómese un minuto para revisar las instrucciones
ifanidadas.El objetivo es crear una construcción
if-elseinterna 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ónifexterna y, a continuación, triples en la instrucciónifinterna. Este patrón garantiza que, cuando la comprobación interna de triples devuelvafalse, el bloque de códigoelsepuede 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.
Cree una línea de código en blanco encima de la línea donde se declara e inicializa
total.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
rollpermite probar el código sin tener que ejecutar la aplicación decenas de veces.En el menú Archivo de Visual Studio Code, haga clic en Guardar.
En la vista EXPLORER, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y, a continuación, 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.
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!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;En el menú Archivo de Visual Studio Code, haga clic en Guardar.
En la vista EXPLORER, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y, a continuación, seleccione Abrir en terminal integrado.
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 perdido
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.
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!"); }Tómese un minuto para revisar la construcción
if-elseif-elseactualizada.Las instrucciones
if,else ifyelsepermiten 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 instruccioneselse ifcomo queramos. Si no se aplica ninguna de las instruccionesifyelse if, se ejecutará el bloque de códigoelsefinal.elsees opcional, pero debe ser la última condición si decide incluirla.Use la técnica de codificar temporalmente de forma rígida las variables
rollpara probar cada mensaje.
Resumen
- La combinación de instrucciones
ifyelsepermite probar una condición y, a continuación, realizar uno de los dos resultados. El bloque de código deifse ejecutará cuando la expresión booleana seatruey el bloque de código deelse, cuando la expresión booleana seafalse. - Puede anidar instrucciones
ifpara limitar una posible condición. Aun así, considere la posibilidad de usar instruccionesifmelse ifyelseen su lugar. - Use instrucciones
else ifpara crear varias condiciones exclusivas. -
elsees opcional, pero si se incluye, debe aparecer en último lugar.