Ejercicio: Desarrollo de lógica de decisión con instrucciones if

Completado

La mayoría de las aplicaciones incluyen un gran número de rutas de acceso de ejecución. Por ejemplo, una aplicación podría implementar diferentes rutas de ejecución en función de la opción de menú que seleccione un usuario. Los desarrolladores hacen referencia al código que implementa diferentes rutas de ejecución como bifurcaciones de código.

La instrucción más utilizada para crear bifurcaciones de código es if. La instrucción if se basa en una expresión booleana que se incluye entre paréntesis. Si la expresión es verdadera, se ejecutará el código que sigue a la instrucción if. De lo contrario, el entorno de ejecución de .NET omitirá el código y no lo ejecutará.

En este ejercicio, practicará la escritura de instrucciones if mediante la creación de un juego. Primero definirá las reglas del juego y las implementarás en el código.

Usará el método Random.Next() para simular el lanzamiento de tres dados de seis caras. Para calcular la puntuación, evaluará los valores obtenidos. Si la puntuación es mayor que un total arbitrario, se mostrará un mensaje de éxito al usuario. Si la puntuación está por debajo del límite, se mostrará un mensaje de fracaso al usuario.

  • Si dos dados cualesquiera muestran el mismo valor, se obtienen dos puntos extra por obtener un doble.
  • Si los tres dados muestran el mismo valor, se obtienen seis puntos extra por obtener un triple.
  • Si la suma de los tres dados, junto con los puntos extra, es igual o mayor que 15, gana el juego. De lo contrario, pierde.

A medida que obtenga más información sobre la instrucción if, podrá refinar las reglas.

Importante

En este ejercicio se usa ampliamente la clase System.Random. Puede consultar el módulo de Microsoft Learn "Llamada a métodos desde la biblioteca de clases .NET mediante C#" si necesita recordar cómo funciona Random.Next().

Preparación del entorno de creación de código

Este módulo incluye actividades que le guiarán por el proceso de compilación y ejecución de código de ejemplo. Se recomienda completar estas actividades con Visual Studio Code como entorno de desarrollo. El uso de Visual Studio Code para estas actividades le ayudará a familiarizarse con la escritura y la ejecución de código en un entorno de desarrollador que usan los profesionales de todo el mundo.

  1. Abra Visual Studio Code.

    Puede usar el menú Inicio de Windows (o un recurso equivalente para otro sistema operativo) para abrir Visual Studio Code.

  2. En Visual Studio Code, en el menú Archivo, seleccione Abrir archivo.

  3. En el cuadro de diálogo Abrir carpeta, vaya a la carpeta Escritorio de Windows.

    Si tiene una ubicación de carpeta diferente donde guarda los proyectos de código, úsela. Para este curso, lo importante es tener una ubicación fácil de encontrar y recordar.

  4. En el cuadro de diálogo Abrir carpeta, elija Seleccionar carpeta.

    Si ve un cuadro de diálogo de seguridad en el que se le pregunta si confía en los autores, seleccione .

  5. En Visual Studio Code, en el menú Terminal, seleccione Nuevo terminal.

    Observe que un símbolo del sistema en el panel Terminal muestra la ruta de acceso de la carpeta actual. Por ejemplo:

    C:\Users\someuser\Desktop>
    

    Nota

    Si está trabajando en su propio equipo, en lugar de en un entorno aislado u hospedado, y ha realizado otros módulos de Microsoft Learn de esta serie de C#, es posible que ya haya creado una carpeta de proyecto para ejemplos de código. Si ese es el caso, puede saltar al paso siguiente, que se usa para crear una aplicación de consola en la carpeta TestProject.

  6. En el símbolo del sistema del terminal, para crear una nueva aplicación de consola en una carpeta especificada, escriba dotnet new console -o ./CsharpProjects/TestProject y presione Entrar.

    Este comando de la CLI de .NET usa una plantilla de programa de .NET para crear un nuevo proyecto de aplicación de consola de C# en la ubicación de carpeta especificada. El comando crea las carpetas CsharpProjects y TestProject y usa TestProject como nombre del archivo .csproj.

  7. En el panel EXPLORADOR, expanda la carpeta CsharpProjects.

    Debería ver la carpeta TestProject y dos archivos, un archivo de programa de C# llamado Program.cs y un archivo de proyecto de C# llamado TestProject.csproj.

  8. En el panel EXPLORADOR, para ver el archivo de código en el panel Editor, seleccione Program.cs.

  9. Elimine las líneas de código existentes.

    Usará este proyecto de consola de C# para crear, compilar y ejecutar ejemplos de código durante este módulo.

  10. Cierre el panel del terminal.

Escritura de código que genera tres números aleatorios y los muestre en la salida

  1. Asegúrese de que tiene un archivo Program.cs vacío abierto en Visual Studio Code.

  2. Para crear el código inicial de este ejercicio, escriba 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}");
    
    
  3. Dedique un minuto a revisar el código que está ejecutando.

    Para empezar, cree una nueva instancia de la clase System.Random y almacene una referencia al objeto en una variable denominada dice. A continuación, llamamos al método Random.Next() en el objeto dice tres veces y proporcionamos los límites inferior y superior para limitar los valores posibles entre 1 y 6 (el límite superior es exclusivo). Guardamos los tres números aleatorios en las variables roll1, roll2 y roll3, respectivamente.

    A continuación, se suman los tres dados y se guarda el valor en una variable entera denominada total.

    Por último, use el método WriteLine() para mostrar los tres valores mediante la interpolación de cadenas.

    Al ejecutar el código, debería ver el mensaje que se indica a continuación (los números serán diferentes).

    Dice roll: 4 + 5 + 2 = 11
    
    

    Esta primera tarea era de configuración. Ahora, puede agregar la lógica de decisión en nuestro código para que el juego sea más interesante.

Incorporación de una instrucción if para mostrar diferentes mensajes según el valor de la variable total

  1. En el editor de Visual Studio Code, busque el cursor en la parte inferior del archivo de código y cree una línea de código en blanco.

  2. Para crear tu primera característica de juego, escribe las siguientes instrucciones if.

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

    Estas dos instrucciones if se usan para administrar los escenarios de éxito y fracaso. Dedique un minuto a examinar la primera instrucción if.

    Observe que la instrucción if tiene tres partes:

    • La palabra clave if.
    • Una expresión booleana entre paréntesis ().
    • Un bloque de código delimitado por llaves { }.

    En tiempo de ejecución, se evalúa la expresión booleana total > 14. Si se trata de una instrucción verdadera (el valor de total es mayor que 14), el flujo de ejecución continuará con el código definido en el bloque de código. En otras palabras, se ejecutará el código entre llaves.

    Sin embargo, si la expresión booleana es falsa (el valor de total no es mayor que 14), el flujo de ejecución omitirá el bloque de código. En otras palabras, no se ejecutará el código entre llaves.

    Por último, la segunda instrucción if controla el mensaje si el usuario pierde. En la unidad siguiente, usaremos una variación en la instrucción if para acortar estas dos instrucciones en una sola y expresar con mayor claridad nuestra intención.

¿Qué es una expresión booleana?

Una expresión booleana es cualquier código que devuelve un valor booleano, ya sea true o false. Las expresiones booleanas más simples son los valores true y false. Como alternativa, una expresión booleana podría ser el resultado de un método que devuelve los valores true o false. Por ejemplo, a continuación, se muestra un ejemplo de código sencillo que usa el método string.Contains() para evaluar si una cadena contiene otra.

string message = "The quick brown fox jumps over the lazy dog.";
bool result = message.Contains("dog");
Console.WriteLine(result);

if (message.Contains("fox"))
{
    Console.WriteLine("What does the fox say?");
}

Como message.Contains("fox") devuelve un valor true o false, cumple los requisitos de una expresión booleana y se puede usar en una instrucción if.

Se pueden crear otras expresiones booleanas simples mediante el uso de operadores para comparar dos valores. Los operadores incluyen:

  • ==, el operador "igual que" para probar la igualdad
  • >, el operador "mayor que" para probar si el valor a la izquierda es mayor que el valor a la derecha
  • <, el operador "menor que" para probar si el valor a la izquierda es menor que el valor a la derecha
  • >=, el operador "mayor o igual que"
  • <=, el operador "menor o igual que"
  • Etcétera.

Nota:

La serie de aprendizaje basado en C# de Microsoft Learn dedica un módulo completo a las expresiones booleanas. Hay muchos operadores que se pueden usar para crear una expresión booleana, pero en este módulo solo se tratarán algunos operadores básicos. Para más información sobre las expresiones booleanas, consulte el módulo de Microsoft Learn "Evaluación de expresiones booleanas para tomar decisiones en C#".

En este ejemplo, hemos evaluado la expresión booleana total > 14. Sin embargo, se podría haber elegido la expresión booleana total >= 15 porque, en este caso, son lo mismo. Las reglas del juego especifican que "si la suma de los tres dados y cualquier punto extra, es igual a 15 puntos o más, se ganará el juego". Por lo que probablemente debería implementar la expresión >= 15. En el siguiente paso del ejercicio, se llevará a cabo ese cambio.

¿Qué es un bloque de código?

Un bloque de código es una colección de una o varias líneas de código delimitadas por un símbolo de llave de apertura y otro de cierre { }. Representa una unidad completa de código que tiene una única finalidad en nuestro sistema de software. En este caso, en tiempo de ejecución, se ejecutan todas las líneas de código del bloque de código si la expresión booleana es verdadera. Por el contrario, si la expresión booleana es falsa, se omiten todas las líneas de código del bloque de código.

También debe saber que los bloques de código pueden contener más bloques de código. De hecho, es habitual que un bloque de código esté "anidado" en otro bloque de código en las aplicaciones. Para comenzar, anidará sus propios bloques de código más adelante en este módulo al crear una instrucción if dentro de otro bloque de código.

Nota

La serie de aprendizaje basada en C# de Microsoft Learn dedica un módulo completo a comprender los bloques de código. Los bloques de código son fundamentales para comprender la organización y la estructura del código, y definen los límites del ámbito de la variable. Consulte el módulo [Control variable scope and logic using code blocks in C#](TBD).

Incorporación de otra instrucción if para implementar puntos extra por obtener dobles

A continuación, puede a implementar la siguiente regla: "Si dos dados cualesquiera muestran el mismo valor, se obtendrán dos puntos extra por obtener dobles". Modifique el código del paso anterior para que coincida con la lista de códigos siguiente:

  1. En el editor de Visual Studio Code, busque el cursor en la línea de código en blanco encima de la primera instrucción if.

  2. Para crear la característica de juego "dobles", escriba la siguiente instrucción if.

    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    

    Aquí se combinarán tres expresiones booleanas para crear una expresión booleana compuesta en una sola línea de código. A veces, esto se denomina condición compuesta. Cuenta con un conjunto externo de paréntesis que combina tres conjuntos internos de paréntesis separados por dos caracteres de barra vertical.

    Los caracteres de barra vertical || son el operador O lógico, que básicamente indica “la expresión a la izquierda O la expresión a la derecha deben ser verdaderas para que toda la expresión booleana sea verdadera”. Si ambas expresiones booleanas son falsas, toda la expresión booleana será falsa. A continuación, usará dos operadores lógicos "O" para ampliar la evaluación a una tercera expresión booleana.

    En primer lugar, evaluará (roll1 == roll2). Si es verdadera, la expresión completa es verdadera. Si la expresión es falsa, evaluará (roll2 == roll3). Si es verdadera, la expresión completa es verdadera. Si la expresión es falsa, evaluará (roll1 == roll3). Si es verdadera, la expresión completa es verdadera. Si es falsa, la expresión completa es falsa.

    Si la expresión booleana compuesta es verdadera, ejecutará el bloque de código siguiente. En esta ocasión, hay dos líneas de código. La primera línea de código imprime un mensaje al usuario. La segunda línea de código incrementa el valor de total en 2.

  3. Para mejorar la legibilidad del código, actualice la segunda instrucción if de la siguiente manera:

    if (total >= 15)
    

    Observe que ahora usa el operador >= en la expresión que se usa para evaluar una tirada ganadora. El operador >= significa "mayor o igual que". Como consecuencia, podrá comparar total con un valor 15 en lugar de 14. Con estos cambios, la expresión que se usa para evaluar una tirada ganadora ahora es similar a la expresión que se evalúa para una tirada perdedora. Esto debería facilitar la comprensión del código (legibilidad). Dado que se trabaja con valores enteros, la nueva expresión (total >= 15) funcionará de forma similar a la que escribió anteriormente (total > 14).

  4. Dedique un minuto a revisar el código.

    El código debería coincidir con este de aquí:

    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 (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }    
    

    Observe la mejor alineación entre las expresiones usadas para evaluar las tiradas ganadoras y perdedoras.

Incorporación de otra instrucción if para implementar los puntos extra por obtener triples

A continuación, puede implementar la siguiente regla: "Si los tres dados que tire muestran el mismo valor, obtendrá seis puntos extra por obtener un triple". Modifique el código de los pasos anteriores para que coincida con la siguiente lista de códigos:

  1. En el editor de Visual Studio Code, cree una línea de código en blanco debajo del bloque de código de la instrucción if "dobles".

  2. Para crear la característica de juego "triples", escriba la siguiente instrucción if.

    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    

    Ahora combinará dos expresiones booleanas para crear una expresión booleana compuesta en una sola línea de código. Cuenta con un conjunto externo de paréntesis que combina dos conjuntos internos de paréntesis separados por dos caracteres de "Y" comercial.

    Los caracteres && de Y comercial son el operador Y lógico, que básicamente indica “solo si ambas expresiones son verdaderas, la expresión completa es verdadera”. En este caso, si roll1 es igual a roll2, y roll2 es igual a roll3, entonces, por deducción roll1, debe ser igual a roll3 y el usuario ha sacado triples.

  3. En el menú Archivo de Visual Studio Code, seleccione Guardar.

  4. Dedique un minuto a revisar el código.

    Asegúrese de que el código 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.");
    }
    
    
  5. 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.

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

    Nota

    Si ve un mensaje que indica "No se ha podido encontrar un proyecto para ejecutar", asegúrese de que el símbolo del sistema del terminal muestra la ubicación prevista de la carpeta TestProject. Por ejemplo: C:\Users\someuser\Desktop\csharpprojects\TestProject>

    Debería ver una salida con resultados similares a los siguientes:

    Dice roll: 3 + 6 + 1 = 10
    Sorry, you lose.
    
    

    O esto:

    Dice roll: 1 + 4 + 4 = 9
    You rolled doubles! +2 bonus to total!
    Sorry, you lose.
    
    

    O esto:

    Dice roll: 5 + 6 + 4 = 15
    You win!
    
    

    O bien, si tiene suerte, verá lo siguiente:

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

    Pero ¿realmente se debería premiar al jugador por los puntos extra por la obtención de dobles y triples? Después de todo, una tirada de triples implica que también se lograron dobles. Lo ideal sería que los puntos extra no se acumulen. Deberían darse dos condiciones por separado con los puntos extra. Se trata de un error en la lógica que deberá corregirse.

Problemas con la lógica y oportunidades para mejorar el código

Aunque esta es una buena forma de comenzar y ha aprendido mucho sobre la instrucción if, las expresiones booleanas, los bloques de código, los operadores lógicos O, Y, etc., se pueden mejorar muchas cosas. Lo hará en la unidad siguiente.

Resumen

  • Use una instrucción if para crear una rama en la lógica del código. La instrucción de decisión if ejecutará el código en su bloque de código si su expresión booleana es verdadera. De lo contrario, el runtime omitirá el bloque de código y continuará con la siguiente línea de código después de este.
  • Una expresión booleana es cualquier expresión que devuelve un valor booleano.
  • Los operadores booleanos compararán los dos valores a la izquierda y a la derecha para ver si son iguales, para compararlos, etc.
  • Un bloque de código está delimitado por llaves { }. Recopila líneas de código que deben tratarse como una sola unidad.
  • El operador Y lógico, &&, agrega dos expresiones y ambas subexpresiones deben ser verdaderas para que toda la expresión sea verdadera.
  • El operador O lógico, ||, agrega dos expresiones y si alguna de las subexpresiones es verdadera, toda la expresión lo es también.

Comprobación de conocimientos

1.

¿Qué es un bloque de código?

2.

¿Qué es una expresión o instrucción booleana?