Contenido del curso
Primeros pasos con C#
- 6

Tipos de datos primitivos en C#
11:38 min - 7

Área de un rectángulo en C#
12:08 min - 8

var en C# para declarar variables sin tipo
05:25 min - 9

Cálculo del Área de un Círculo en C# Usando Constantes y Variables
14:39 min - 10

Operadores aritméticos en C# explicados
09:57 min - 11

Operadores lógicos AND OR NOT XOR en C#
17:30 min - 12

Operadores relacionales para comparar números en C#
11:05 min - 13

Interpolación de strings en C#
11:47 min
Bucles y estructuras de control en C#
- 14

Condicionales IF en C#: Estructura y Uso Práctico en Blackjack
15:23 min - 15

Switch en C# para máquinas de estado
11:04 min - 16

Ciclos while y do-while en C#
18:00 min - 17

Refactorizar el juego de 21 en C#
Viendo ahora - 18

Uso de ciclos FOR en programación C#
18:51 min - 19

Cómo corregir el bug del bucle for en C#
08:27 min
Próximos pasos
Refactorizar el juego de 21 en C#
Resumen
Aprender a programar no es solo escribir código que funcione, sino mejorarlo cuando detectas que algo se puede hacer mejor. Eso es refactorización en C#: revisar tu código, identificar redundancias y compactarlo sin perder la lógica. En la construcción de un mini juego de 21, ese proceso revela bugs sutiles con while, do while y variables acumuladas.
¿Qué es refactorizar y por qué importa al usar while?
Refactorizar significa reescribir partes de tu código para que sean más eficientes, legibles y mantenibles, sin cambiar lo que hace.
En el juego de 21, el primer problema apareció porque el programa pedía tres veces al usuario que escribiera yes dentro de un or. La solución fue crear una variable auxiliar llamada controlOtraCarta, inicializada vacía, que guarda una sola lectura de Console.ReadLine() y se compara después en la condición del do while [02:00].
¿Qué es una variable auxiliar? Es una variable que guarda temporalmente un valor para usarlo en otra parte del programa, evitando repetir la misma operación varias veces.
Con ese cambio, el flujo quedó limpio: el jugador responde una vez y el do while evalúa esa única respuesta.
¿Cómo agregar dificultad con Random.Next en C#?
Un juego sin oponente real no es juego. Por eso entra el dealer, controlado por la computadora.
La instrucción Random.Next(12, 23) genera un número aleatorio entre 12 y 23 que simula la mano del dealer [04:30]. Aquí surgió un detalle clave: el objeto random se había instanciado dentro del do while, lo que significa que solo existía dentro de ese bloque. Al moverlo arriba, pasó a estar disponible en todo el programa.
Este detalle conecta con un concepto fundamental: el alcance de las variables o scope. Una variable creada dentro de un bloque vive solo en ese bloque.
¿Qué hace Random.Next en C#? Devuelve un número entero aleatorio dentro del rango que indiques.
Random.Next(12, 23)da valores desde 12 hasta 22 inclusive.
Para mostrar la jugada del dealer, basta con un Console.WriteLine($"El dealer tiene {totalDealer}!"); usando interpolación de cadenas con el signo $.
¿Por qué se acumulan valores en un ciclo while?
Aquí apareció el bug más interesante. Después de varias partidas seguidas, el juego decía te pasaste de 21 aunque la suma real fuera 17.
¿La razón? Las variables totalJugador y totalDealer nunca se reseteaban entre rondas. Cada vez que el jugador volvía a empezar, los puntos anteriores seguían sumando. En el mundo físico te quitan las cartas y revuelven el mazo; en código, tienes que hacerlo tú.
La solución fue colocar al inicio del while(true) estas dos líneas:
csharp totalJugador = 0; totalDealer = 0;
Así, cada vez que el ciclo principal vuelve a ejecutarse, las variables arrancan limpias [07:15].
¿Cuándo debo resetear variables dentro de un ciclo?
Siempre que una variable acumule valores en cada iteración y necesites un estado fresco al reiniciar el flujo. Si tu lógica depende de empezar en cero (puntajes, contadores, totales), el reseteo va al inicio del ciclo, no al final.
Esta es una de esas lecciones que solo aprendes probando tu programa a conciencia, jugando varias veces y observando si los resultados tienen sentido.
¿Cómo se prueba un programa para detectar bugs?
Probar no es ejecutar una vez y celebrar. Es repetir el flujo varias veces, con distintos valores, hasta que el comportamiento sea consistente.
En el juego de 21, la prueba consistió en jugar varias rondas seguidas:
- Primera ronda: ganar con 18 frente a un dealer de 14.
- Segunda ronda: perder con 14 contra un dealer de 17.
- Tercera ronda: perder con 15 contra un dealer de 20.
En las tres, los totales se reiniciaron correctamente. Sin esa validación, el bug de acumulación habría pasado desapercibido.
Habilidades y conceptos que se trabajan en esta clase
Estos son los puntos técnicos que dejaste anclados al construir el juego:
- Refactorización: mejorar código existente sin alterar su funcionalidad [00:30].
- Variable auxiliar de control:
controlOtraCartacomo string que guarda la respuesta del usuario [02:00]. - Console.ReadLine(): lectura única en lugar de múltiple para limpiar el
do while. - Random.Next(min, max): generación de números aleatorios para simular al dealer [04:30].
- Alcance de variables: instanciar
randomfuera deldo whilepara que viva en todo el programa. - Interpolación de cadenas con
$: imprimir valores dentro de unConsole.WriteLine. - Reseteo de variables dentro de while(true): evitar acumulación entre rondas [07:15].
- Pruebas iterativas: jugar varias veces para detectar bugs ocultos.
Reto: lleva un juego de la vida real a C#
Con muy poco código construiste una abstracción de un juego de casino. Ahora te toca a ti: piedra, papel o tijera, una variación de 21 con tope en 42, o cualquier juego que te guste. Modifícalo, métele tu creatividad y compártelo.
Déjame en los comentarios una imagen del código, un link al video o un clip por Twitter mostrando tu versión. ¿Qué juego vas a construir?