German Pinilla
Jhoan Sebastián Lopera Gallego
Gracias por el aporte
freddy.home
Bien.
La sentencia switch en C# sigue siendo útil cuando programas máquinas de estado, sistemas embebidos o videojuegos. Si estás aprendiendo a controlar el flujo de tu código según múltiples valores, esta estructura te ahorra escribir cadenas largas de if-else y deja tu lógica más legible.
¿Qué es una máquina de estados y por qué necesita switch?
Una máquina de estados es un patrón donde tu programa solo puede estar en un estado a la vez y cambia entre ellos según ciertos eventos. El switch encaja perfecto aquí porque cada caso representa un estado distinto.
Piensa en un robot centinela de seguridad. Tiene dos estados básicos: búsqueda y detección, y persecución con alerta. Mientras sus sensores no detecten a un humano, se queda indefinidamente en búsqueda. Cuando detecta a alguien, cambia al estado de alerta y persigue hasta que el intruso sea neutralizado. Solo entonces vuelve al estado inicial.
Lo mismo pasa en un videojuego de pelea de arcade. La pantalla de menú se repite con el mensaje insert coin hasta que metes una moneda. Ahí entras al estado de juego, eliges personaje, peleas, avanzas. Si pierdes, pasas al estado game over y de ahí regresas automáticamente al menú inicial.
¿Cuándo conviene usar switch en lugar de if? Cuando comparas una sola variable contra varios valores fijos y cada valor dispara un bloque distinto. El switch es más legible y es el estándar para representar estados.
¿Cómo se escribe un switch en C#?
El switch necesita una variable controladora. Puede ser un string, un entero u otro tipo compatible. Esa variable es la que decide a qué case entrar.
La estructura básica se ve así:
csharp string switchControl = "menu";
switch (switchControl) { case "menu": Console.WriteLine("Welcome al casino"); Console.WriteLine("Escriba '21' para jugar al 21"); switchControl = Console.ReadLine(); break;
case "21": // aquí va la lógica del juego con if-else break; default: Console.WriteLine("Valor ingresado no válido en el casino"); break;
}
Fíjate en tres piezas obligatorias:
¿Para qué sirve el case default?
El default es el caso de respaldo. Se ejecuta cuando ninguno de los case coincide con el valor de la variable. Si el usuario escribe "gato" en lugar de "21", el programa cae en default y muestra el mensaje de valor no válido.
Puedes tener tantos case como necesites, pero solo un default por switch.
¿Qué hace el break en un switch? Indica al programa que termine la ejecución del switch una vez que el caso correspondiente terminó. Sin él, el compilador marca error en C#.
¿Cómo aplicar switch a un casino en consola?
Partiendo del código de la clase anterior, donde ya tenías un if que evaluaba si el jugador ganaba o perdía contra el dealer en el 21, el siguiente paso es envolver esa lógica dentro de un switch para construir un menú.
El flujo queda así:
string switchControl = "menu"; para que el programa entre por defecto al menú de bienvenida.Console.ReadLine() en la misma variable switchControl.Cuando ejecutas el programa, si la variable inicia en "menu", verás la bienvenida y la instrucción para jugar. Si la inicias en "21", el programa salta directo a la lógica del juego y evalúa quién ganó con los valores de 25 y 15, mostrando el mensaje Perdiste versus el dealer, te pasaste de 21.
Aquí queda claro que el switch ejecuta solo el caso que coincide, llega al break y sale. Por eso el programa se cierra después de una jugada: no hay nada que lo mantenga corriendo.
¿Por qué el programa termina después de un case?
Porque el switch es una estructura de decisión única, no un ciclo. Una vez evaluada la variable y ejecutado el break, el flujo continúa después del switch y, si no hay más código, el programa termina.
Para que tu casino siga preguntando jugada tras jugada sin cerrarse, necesitas envolver el switch en un bucle. Ahí es donde entra la sentencia while, que es el siguiente paso natural para que tu juego empiece a sentirse como un juego de verdad.
¿Ya pensaste qué otros juegos podrías agregar al menú: solitario, póker, ruleta? Cuéntame en los comentarios cuál programarías primero.
<string number; int opt = 2; switch(opt) { case 1: number = "One"; break; case 2: number = "Two"; break; default: number = "Error"; break; } Console.WriteLine("El número es: " + number);>
German Pinilla
Jhoan Sebastián Lopera Gallego
Gracias por el aporte
freddy.home
Bien.
Gerardo Ferreyra
La sentencia switch no es ampliamente utilizada por programadores senior debido a algunas limitaciones y consideraciones en cuanto a su mantenimiento y legibilidad del código. Aquí hay algunas razones:
Complejidad y dificultad de mantenimiento: A medida que aumenta el número de casos en una sentencia switch, se vuelve más difícil de mantener y comprender. El código puede volverse largo y enredado, lo que dificulta su lectura y comprensión.
Falta de flexibilidad: La sentencia switch solo puede evaluar expresiones de igualdad. No permite la evaluación de expresiones lógicas o condiciones complejas. Esto puede ser limitante y requerir el uso de estructuras de control adicionales para abordar casos más complejos.
Duplicación de código: Si hay múltiples casos que requieren la misma lógica de ejecución, es necesario repetir ese código en cada caso correspondiente. Esto puede conducir a una mayor duplicación de código y dificultar la mantenibilidad y la introducción de errores.
Mayor propensión a errores: La sentencia switch puede ser propensa a errores, especialmente si se olvida agregar una instrucción break al final de cada caso. Esto puede llevar a que se ejecuten casos no deseados o múltiples casos debido a una falta de manejo adecuado.
En cambio, los programadores pueden preferir utilizar estructuras de control más flexibles, como declaraciones if-else o diccionarios/mapeos, que pueden proporcionar una mayor legibilidad, modularidad y flexibilidad en el código.
Olga Berenice Hernández Cruz
Juan Camilo Duque Gil
Gerardo Garduño Rosas
Para que no rompa como el ejemplo que puso el maestro en el primer caso no se pone el break para que siga en ejecución y este valide la nueva variable, que es lo mismo que poner continué.
juan camilo salazar
Michael Xavier Portillo Reyes
Me queda la duda, de por que utilizar el switch en lugar de los condicionales tradicionales, si alguien me pudiera responder se lo agradeceria mucho
Samuel Schulz
Básicamente, es más fácil de leer y además organiza mejor el código, permitiéndote un mantenimiento más sencillo a futuro.
Sin lugar a dudas tambien mejora la eficiencia para el compilador
Por ejemplo, si los casos en un switch son valores de un enumerado o constantes enteras cercanas entre sí, el compilador podría implementar el switch como una tabla de salto en lugar de una cadena de comparaciones, lo que puede resultar en un rendimiento ligeramente mejor.
Por otra parte, vas a mejorar la seguridad en tu escritura, ya que necesitas que cada caso sea tratado explícitamente o tenés el caso default para evitar errores, lo cual se vuelve más tedioso en if-else
Particularmente, no quería dejar de lado el tema de los enums. Cuando los utilices vas a notar la gran comodidad de usar switch 😁
Antonio Nicasio
En la empresa donde trabajo utilizamos ni switch o else lo consideran mala practica. en lugar a eso utilizamos mas patrones de diseño
Esteban Cerda Román
interesante perspectiva.
MS Vitamins
Que buenas analogías, me encanta ver plasmados los temas con robótica. Gracias maestro, un honor!!
Karen Daniela Chaparro Vasquez
Hola chicos, tengo un problema con el código no me corre. Me dice que hay un error en la linea 18 pero veo que esta igual al ejercicio planteado en el video.
Alguno sabe como se podria arreglar este problema?
Bryhan Eduardo Pedrero Villalba
Bro, eso es porque a los switch despues del case no le debes poner ; sino : pues no estas buscando separar codigo, sino introducir condiciones al case
Luz Adriana
En las últimas versiones de C# el switch cambia un poco para este caso lo hice algo asi:
var totalJugador = 24;
var totalDealer = 15;
var switchControl = "21";
var resultado = switchControl switch
{
"menu" => "Bienvenido al C a s i n o",
"21" => (totalJugador > totalDealer && totalJugador < 21)
? "Venciste al dealer, felicidades"
: ((totalJugador < totalDealer) || (totalJugador > 21))
? "Perdiste vs el dealer, lo siento"
: "condicion no valida",
_ => "condicion no valida"
};
Console.WriteLine(resultado);
Sergio Daniel Flamenco
string fruta;
double precio;
Console.WriteLine("¿Qué fruta desea?");
fruta = Console.ReadLine();
switch (fruta)
{
case "Fresas":
precio = 4.6;
Console.WriteLine($"Las {fruta} cuestan {precio} s/ el kilogramo ");
break;
case "Guineos":
precio = 10;
Console.WriteLine($"Las {fruta} cuestan {precio} s/ el kilogramo ");
break;
case "Cerezas":
precio = 7.9;
Console.WriteLine($"Las {fruta} cuestan {precio} s/ el kilogramo ");
break;
case "Uvas":
case "Manzanas":
precio = 8.7;
Console.WriteLine($"Las {fruta} cuestan {precio} s/ el kilogramo ");
break;
default:
Console.WriteLine($"Las {fruta} están agotados");
break;
};
Console.WriteLine("Gracias por su visita.");
Sergio Daniel Flamenco
Edwin Pacheco
Se puede manejar un caso por default dentro del Switch???
Platzi
Sí, se puede manejar un caso por default dentro del Switch.
Sheila Mesa Villa
En el default del switch, cuando me sale el mensaje de que no es un valor válido para el casino si pongo algo diferente a 21, se queda ejecutándose el mensaje en un loop infinito. ¿Cómo se arregla esto?
Rafael Umairs
Täyttääkseni taloudellisen tavoitteeni hyvän tilan saavuttamiseksi menin https://betinia.com/fi/ lähteeseen. Heidän online-kasinonsa sisältää suosittuja vaihtoehtoja, kuten blackjackin, ruletin ja kolikkopelit, sekä live-jakajapelejä, jotka tekevät kokemuksesta mukaansatempaavamman. Olen huomannut viettäväni tunteja tutkiessani kaikkia eri vaihtoehtoja ja kokeilen onneani eri peleissä. Ja heidän helppokäyttöisen käyttöliittymänsä ja avuliaan asiakastukitiiminsä ansiosta olen aina luottavainen panostaessani ja liikkuessani sivustolla.
Ludwin Eduardo Escobar Flores
¿Qué ciclo estás usando? hay que revisar la condición de salida del ciclo, si dentro del default colocas un valor válido y se mantiene dentro del ciclo es por eso que no obtiene una salida y queda en el loop infinito
Luis Efren Rojas Montañez
Luis Ortiz
Carlos Mario
<
string country;
Console.WriteLine(@"*******************
COMO SE OYE
*******************
");
Console.WriteLine("Escribe tu país:");
Console.WriteLine(@"
- ESPAÑA
- ARGENTINA
- USA
- MEXICO
- COLOMBIA
");
country = (Console.ReadLine() ?? string.Empty).ToUpper();
switch (country)
{
case "ESPAÑA":
Console.WriteLine($"En {country} se dice: Que Bonita Canción");
break;
case "ARGENTINA":
Console.WriteLine($"En {country} se dice: Que Bonita Canción");
break;
case "USA":
Console.WriteLine($"En {country} se dice: What a beatiful Song");
break;
case "MEXICO":
Console.WriteLine($"En {country} se dice: Oí nomás ese cumbion");
break;
case "COLOMBIA":
Console.WriteLine($"En {country} se dice: Mucho Tema");
break;
default:
Console.WriteLine("Entrada no Valida :(");
break;
}
>
Octavio Nuñez
revisen Pattern matching
y switch puede reemplazar a if, Gleam es un lenguaje nuevo no utiliza if ni for ... interesante ojala crezca la adopción de ese lenguaje esta genial
Raúl Adolfo Sánchez Rodríguez
++Condicional SWITCH++
La instrucción switch selecciona una lista de instrucciones para ejecutarla en función de la coincidencia de un patrón con una expresión de coincidencia, como se muestra en el ejemplo siguiente:
DisplayMeasurement(-4); // Output: Measured value is -4; too low. DisplayMeasurement(5); // Output: Measured value is 5. DisplayMeasurement(30); // Output: Measured value is 30; too high. DisplayMeasurement(double.NaN); // Output: Failed measurement. void DisplayMeasurement(double measurement) { switch (measurement) { case < 0.0: Console.WriteLine($"Measured value is {measurement}; too low."); break; case > 15.0: Console.WriteLine($"Measured value is {measurement}; too high."); break; case double.NaN: Console.WriteLine("Failed measurement."); break; default: Console.WriteLine($"Measured value is {measurement}."); break; } }
En el ejemplo anterior, una instrucción switch usa los siguientes patrones:
Un patrón relacional (disponible en C# 9.0 y versiones posteriores), para comparar el resultado de una expresión con una constante. Patrón constante: pruebe si un resultado de expresión es igual a una constante.
En el ejemplo anterior también se muestra el caso default. El caso default especifica las instrucciones que se ejecutarán cuando una expresión de coincidencia no coincida con ningún otro patrón de caso. Si una expresión de coincidencia no coincide con ningún patrón de caso y no hay ningún default caso, el control pasa por una switch instrucción.
Una instrucción switch ejecuta la lista de instrucciones en la primera sección de switch cuyo patrón de caso coincida con una expresión de coincidencia y cuya restricción de caso, de haberla, se evalúe como true. Una instrucción switch evalúa los patrones de casos en el orden de texto de arriba a abajo. El compilador genera un error cuando una instrucción switch contiene un caso inaccesible.
++Ejemplos de la sentencia SWITCH y su uso:++
Comparto mi código de un menu con distintos juegos:
int totalPlayer; int totalDealer = 15; string message; int option; Console.WriteLine("Menu: \n 1 - BlackJack \n 2 - Rock/Paper/Siccers \n 3 - Tik Tak Toe \n choose a game"); option = Convert.ToInt32(Console.ReadLine()); switch (option) { case 1: Console.WriteLine("BlackJack Game"); Console.WriteLine("Enter the total value of your cards"); totalPlayer = Convert.ToInt32(Console.ReadLine()); if (totalPlayer > totalDealer && totalPlayer < 22) { message = "You win :D"; } else if (totalPlayer <= totalDealer || totalPlayer > 21) { message = "You lost :("; } else { message = "upps!!!"; } Console.WriteLine(message); break; case 2: Console.WriteLine("2 - Rock/Paper/Siccers \n COMMING SOON"); break; case 3: Console.WriteLine("3 - Tik Tak Toe \n COMMING SOON"); break; default: Console.WriteLine("upss, option not valid"); break; }
Bienvenido y muchas gracias por su feedback.
Me gustaría dejar aquí mis modificaciones,
// See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!"); int totalJugador = 0; string mensaje; int totalDealer = 15; string controladorSwitch = "menu"; Console.WriteLine("Bienvenido, digita '21' para jugar al juego del 21"); controladorSwitch = Console.ReadLine(); switch (controladorSwitch) { case "21": Console.WriteLine("Ingresa la sumatoria de tus cartas"); totalJugador = Convert.ToInt32(Console.ReadLine()); if ((totalJugador > totalDealer) && (totalJugador <= 21)) { mensaje = "Venciste al Dealer, Felicidades."; } else if (totalJugador <= totalDealer) { mensaje = "No lograste vencer al Dealer."; } else if (totalJugador > 21) { mensaje = "No lograste vencer al Dealer, sacaste más de 21"; } else { mensaje = "Condicón no válida para el juego."; } Console.WriteLine(mensaje); break; default: Console.WriteLine("No se reconoce el comando ingrsado"); break; }
Console.WriteLine("Hello, World!"); Console.WriteLine(" Switch "); // variables int totalJugador = 25; int totalMaquina = 15; string mensaje = ""; string switchControl = "15"; // Juego Blackjack switch (switchControl) { case "menu": Console.WriteLine(" Bienvenido al casino online: "); Console.WriteLine(" escriba 21 para entrar al juego: "); switchControl = Console.ReadLine(); break; case "21": if (totalJugador > totalMaquina && totalJugador<22) { mensaje = " Le ganaste a la maquina felicidades "; } else if (totalJugador >= 22) { mensaje = " Perdiste contra la maquina te pasaste de 21 "; } else if (totalJugador <= totalMaquina) { mensaje = " perdiste game over "; } else { mensaje = " condicion no valida "; } Console.WriteLine(mensaje); break; default: Console.WriteLine(" Valor ingresado no valido: "); break; }
Esta es la modificación que realicé con el switch: ```c# Random aleatorioJugador = new Random(); Random aleatorioDealer = new Random(); Console.WriteLine("Bienvenidos al juego BlackJack. Es hora de jugar: \n"); int cartasJugador = aleatorioJugador.Next(1, 11); int cartasDealer = aleatorioDealer.Next(1, 11); int totalDealer = 0; int totalJugador = 0; string message = ""; string finJuego = "No"; string ultimaCarta = "No"; string otraCarta = "Si"; string switchControl = "Dealer";
//Blackjack, juntar 21 o en caso de tener menos de 21, tener más puntos que el dealer
while (finJuego == "No") { switch (switchControl) { case "Dealer": totalDealer += cartasDealer; Console.WriteLine($"El dealer inicia con: {totalDealer}"); while (totalDealer <= 15) { cartasDealer = aleatorioDealer.Next(1, 11); totalDealer += cartasDealer; Console.WriteLine($"El acumulado del dealer, después de esta carta {cartasDealer}, es: {totalDealer}"); if (totalDealer > 21) { message = "El dealer ha perdido!!!"; ultimaCarta = "Si"; finJuego = "Si"; } } switchControl = "Jugador"; break;
case "Jugador": Console.WriteLine("\n"); totalJugador += cartasJugador; Console.WriteLine($"El jugador inicia con: {totalJugador}"); while (ultimaCarta == "No") { Console.WriteLine("Deseas otra carta"); otraCarta = Console.ReadLine(); if (otraCarta == "Si") { cartasJugador = aleatorioJugador.Next(1, 11); totalJugador += cartasJugador; Console.WriteLine($"El acumulado del jugador, después de esta carta {cartasJugador}, es: {totalJugador}\n"); if (totalJugador > 21) { message = "Lo siento, perdiste porque te pasaste!!!"; finJuego = "Si"; ultimaCarta = "Si"; } } else if (otraCarta == "No") { if (totalJugador > totalDealer) { message = "Has vencido al dealer!!!"; ultimaCarta = "Si"; finJuego = "Si"; } else if (totalJugador <= totalDealer) { message = "Lo siento, perdiste porque tienes menos que el dealer!!!"; ultimaCarta = "Si"; finJuego = "Si"; } else { message = "Condición no válida."; ultimaCarta = "Si"; finJuego = "Si"; } } else { Console.WriteLine("Opción no válida, intenta nuevamente!!!"); } } break; default: Console.WriteLine("Opción no válida, inténtalo nuevamente"); break; }
}
Console.WriteLine($"Las cartas del dealer son: {totalDealer} y las cartas tuyas son: {totalJugador}. {message}");
Use la condicional de switch combinada con un if y un bucle for y este fue mi resultado
Adjunto mi codigo ```js //Menu Basico de juego
//Declaro variables
Random random = new Random(); String opcionmenu = ""; String opcionsubmenu = ""; String message = ""; int dealer = random.Next(0, 21); int jugador = 0;
//Empiezo a gestionar las operaciones
Console.WriteLine($" Menu disponible \n Inicio \n"); opcionmenu = Console.ReadLine();
switch (opcionmenu) { case "Inicio": //Menu basico de opciones Console.WriteLine($"\n Opciones disponibles: \n Nueva partida \n Scores \n Cerrar Sesion \n"); opcionsubmenu = Convert.ToString(Console.ReadLine());
//Seleciona una opcion del submenu switch (opcionsubmenu) { case "Nueva partida": // Se Inicia una partida ingresando valores Console.WriteLine("Ingrese un valor"); jugador = Convert.ToInt32(Console.ReadLine()); if (jugador > dealer) { message = $"Ganaste al dealer con {jugador}"; } else if (jugador < dealer) { message = $"El dealer gano con {dealer}"; } else { message = "Opción no valida"; } break; case "Scores": Console.WriteLine("En construcción"); break; case "Cerrar Sesion": Console.WriteLine("En los proximos minutos se cerrara la sesión"); for (int i = 5; i >= 0; i--) { Console.WriteLine($"Saliendo del sistema {i} \n"); System.Threading.Thread.Sleep(1000); } Console.WriteLine("Sesión cerrada"); break; default: Console.WriteLine("Opción no valida"); break; } break; default: Console.WriteLine("Opcion no valida"); break;
} Console.WriteLine(message);
//Declaro variables  Random random = new Random(); String opcionmenu = ""; String opcionsubmenu = ""; String message = ""; int dealer = random.Next(0, 21); int jugador = 0; //Empiezo a gestionar las operaciones Console.WriteLine($" Menu disponible \n Inicio \n"); opcionmenu = Console.ReadLine(); switch (opcionmenu) {   case "Inicio": //Menu basico de opciones   Console.WriteLine($"\n Opciones disponibles: \n Nueva partida \n Scores \n Cerrar Sesion \n");   opcionsubmenu = Convert.ToString(Console.ReadLine());   //Seleciona una opcion del submenu   switch (opcionsubmenu)   {   case "Nueva partida": // Se Inicia una partida ingresando valores   Console.WriteLine("Ingrese un valor");   jugador = Convert.ToInt32(Console.ReadLine());   if (jugador > dealer)   {   message = $"Ganaste al dealer con {jugador}";   }   else if (jugador < dealer)   {   message = $"El dealer gano con {dealer}";   }   else   {   message = "Opción no valida";   }   break;   case "Scores":   Console.WriteLine("En construcción");   break;   case "Cerrar Sesion":   Console.WriteLine("En los proximos minutos se cerrara la sesión");   for (int i = 5; i >= 0; i--)   {   Console.WriteLine($"Saliendo del sistema {i} \n");   System.Threading.Thread.Sleep(1000);   }   Console.WriteLine("Sesión cerrada");   break;   default:   Console.WriteLine("Opción no valida");   break;   }   break;   default:   Console.WriteLine("Opcion no valida");   break; } Console.WriteLine(message);