En el mundo de la programación, las estructuras de control son esenciales para el manejo de flujos lógicos. La instrucción if es conocida por muchos, pero su hermana menos mencionada, switch, también tiene un lugar crucial, especialmente en escenarios específicos. A continuación, profundizaremos en la importancia de la instrucción switch y su aplicación en máquinas de estado, un concepto aplicable tanto en sistemas embebidos como en el desarrollo de videojuegos.
¿Por qué es importante la instrucción switch?
La instrucción switch podría parecer obsoleta para algunos, pero su utilidad se destaca en ciertas situaciones. Por ejemplo, en el desarrollo de sistemas embebidos o videojuegos, donde se necesita gestionar diferentes estados de un programa.
¿Cómo funciona una máquina de estados?
Una máquina de estados es una forma de gestionar cambios de estados en un programa. Por ejemplo, si programamos un robot de seguridad, este podría tener diferentes estados como "búsqueda y detección" y "alerta y persecución". Un switch se maneja mediante casos y resulta ideal para este tipo de lógica:
Estado de búsqueda y detección: El robot verifica si hay algo que deba alertar con sus sensores. Permanece en este estado hasta que detecta una anomalía.
Estado de alerta y persecución: Al detectar a un humano, cambia a un estado de alerta y comienza a seguir al intruso hasta que la situación se resuelve.
Cada estado dicta el comportamiento del robot y permite una organización clara del código.
¿Cómo se aplica el switch en videojuegos?
En un videojuego de lucha, la máquina de estados maneja desde la inserción de una moneda hasta el final de una partida. El switch permite cambiar de estados como "menú de inicio", "selección de personaje" y "estado de juego" hasta llegar a un "estado de derrota" y regresar al principio.
¿Cómo implementar la instrucción switch?
Para trabajar con switch, iniciamos con una variable de control y a continuación se declara la estructura switch en el código. Por ejemplo:
string switchControl ="";switch(switchControl){case"menu":// Instrucciones para el estado de menú.break;case"21":// Instrucciones para el juego "21" o Blackjack.break;default:// Instrucciones por defecto si no se cumple ningún caso.break;}
Cada "case" representa un posible estado y el código asociado a ese estado. La palabra clave "default" cubre cualquier situación no especificada por los casos anteriores.
¿Cómo evitar que el código termine después de un switch?
Para que un programa no termine inmediatamente después de ejecutar un switch, se utilizan bucles o ciclos como while. Esto permite que el programa espere por nuevas entradas del usuario o eventos, manteniendo al programa en ejecución y en espera de cambios de estado.
El manejo adecuado de las estructuras de control como if y switch, así como la comprensión de conceptos como las máquinas de estado, son habilidades fundamentales para cualquier programador. Continuar practicando y profundizando en estos conocimientos es esencial para el desarrollo de programas más eficientes y efectivos. Recuerda que la práctica constante y el aprendizaje continuo son tus mejores aliados en este camino apasionante que es la programación. ¡Sigue adelante!
<string number;int opt =2;switch(opt){case1: number ="One";break;case2: number ="Two";break;default: number ="Error";break;}Console.WriteLine("El número es: "+ number);>
por que esta entre <>???
Creo que tu código tiene un error en la primera linea... sería bueno que lo corrijas y no confundas a los compañeros.
++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.voidDisplayMeasurement(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:++
Gracias por el aporte
Bien.
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.
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){case1: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";}elseif(totalPlayer <= totalDealer || totalPlayer >21){ message ="You lost :(";}else{ message ="upps!!!";}Console.WriteLine(message);break;case2:Console.WriteLine("2 - Rock/Paper/Siccers \n COMMING SOON");break;case3: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 informationConsole.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.";}elseif(totalJugador <= totalDealer){ mensaje ="No lograste vencer al Dealer.";}elseif(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;}
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é.
Console.WriteLine("Hello, World!");Console.WriteLine(" Switch ");// variablesint totalJugador =25;int totalMaquina =15;string mensaje ="";string switchControl ="15";// Juego Blackjackswitch(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 ";}elseif(totalJugador >=22){ mensaje =" Perdiste contra la maquina te pasaste de 21 ";}elseif(totalJugador <= totalMaquina){ mensaje =" perdiste game over ";}else{ mensaje =" condicion no valida ";}Console.WriteLine(mensaje);break;default:Console.WriteLine(" Valor ingresado no valido: ");break;}
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
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 😁
En la empresa donde trabajo utilizamos ni switch o else lo consideran mala practica. en lugar a eso utilizamos mas patrones de diseño
interesante perspectiva.
Que buenas analogías, me encanta ver plasmados los temas con robótica. Gracias maestro, un honor!!
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.");
Se puede manejar un caso por default dentro del Switch???
Sí, se puede manejar un caso por default dentro del Switch.
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?
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.
¿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
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";}}elseif(otraCarta =="No"){if(totalJugador > totalDealer){ message ="Has vencido al dealer!!!"; ultimaCarta ="Si"; finJuego ="Si";}elseif(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 submenuswitch(opcionsubmenu){case"Nueva partida":// Se Inicia una partida ingresando valoresConsole.WriteLine("Ingrese un valor"); jugador =Convert.ToInt32(Console.ReadLine());if(jugador > dealer){ message = $"Ganaste al dealer con {jugador}";}elseif(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 =newRandom();String opcionmenu ="";String opcionsubmenu ="";String message ="";int dealer = random.Next(0,21);int jugador =0;//Empiezo a gestionar las operacionesConsole.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}"; } elseif(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);
<
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;
}
>
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
Mejoraría mucho el curso si tuviese los playground para practicar después de este tipo de clases.
En la versión Microsoft Visual Studio Community 2022 (64 bits) - Current
Versión 17.8.6
No me aceptada el "break"..,. decía que en este nuevo contexto ya no era valida.
Al checar documentación encontre que en lugar de break se usaba "return"
Este código si fue valido son errores y compilo correctamente