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
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
comparantotal
con el mismo valor numérico. Esta es la oportunidad perfecta para usar una instrucciónelse
.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 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
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ónif
externa y, a continuación, triples en la instrucciónif
interna. Este patrón garantiza que, cuando la comprobación interna de triples devuelvafalse
, el bloque de códigoelse
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.
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
roll
permite 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 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.
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 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.
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.
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; } } 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-else
actualizada.Las instrucciones
if
,else if
yelse
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 instruccioneselse if
como queramos. Si no se aplica ninguna de las instruccionesif
yelse if
, se ejecutará el bloque de códigoelse
final.else
es opcional, pero debe ser la última condición si decide incluirla.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
yelse
permite probar una condición y, a continuación, realizar uno de los dos resultados. El bloque de código deif
se ejecutará cuando la expresión booleana seatrue
y el bloque de código deelse
, cuando la expresión booleana seafalse
. - Puede anidar instrucciones
if
para limitar una posible condición. Aun así, considere la posibilidad de usar instruccionesif
melse if
yelse
en su lugar. - Use instrucciones
else if
para crear varias condiciones exclusivas. else
es opcional, pero si se incluye, debe aparecer en último lugar.
¿Necesita ayuda? Consulta nuestra guía de solución de problemas o notifica un problema para enviar comentarios específicos.