¿Qué es la instrucción while y cómo funciona en los ciclos?
En la programación, los bucles son fundamentales para mantener un programa en ejecución continua, simulando, por ejemplo, el funcionamiento constante de una máquina arcade. Uno de los comandos que permite este flujo es la instrucción while. En esencia, while es utilizado para crear ciclos que se ejecutan mientras una condición determinada sea verdadera. Su estructura básica es:
while(condición){// Código para ejecutar}
Al usar while true, se crea un bucle infinito, lo que significa que las instrucciones dentro del bucle se seguirán ejecutando indefinidamente. Sin embargo, es crucial asegurarse de que haya algún mecanismo para salir del bucle, evitando que el programa se quede estancado.
¿Cómo implementamos un bucle infinito en un juego con while?
Al crear un juego sencillo que se repite indefinidamente a través de un bucle infinito, debemos inicializar nuestras variables y controlar el flujo del programa con precisión. Usaremos switch para dirigir el flujo a la opción correcta, como en un menú que conduce al juego o a otras acciones. Aquí un ejemplo sencillo:
int switchControl = menu;// Inicializa la variable de controlwhile(true){switch(switchControl){case menu:// Lógica del menúbreak;case21:// Lógica cuando el jugador selecciona 21if(jugadorPierde){ switchControl = menu;// Regresa al menú si el jugador pierde}break;}}
Esta estructura permite mantener el juego activo, reseteando el proceso cada vez que se alcanza un punto de retorno, ayudando a evitar loops interminables sin resultado.
¿Cómo se utiliza un ciclo do-while para juegos más interactivos?
A diferencia del while, un do-while asegura que el bloque de instrucciones dentro del ciclo se ejecutará al menos una vez antes de evaluar la condición. Esto es muy útil en contextos de juego donde el jugador necesita interactuar antes de que se haga la evaluación de continuación del ciclo.
do{ Console.WriteLine("Toma tu carta, jugador.");int num = random.Next(1,13); totalJugador += num; Console.WriteLine($"Te salió la carta {num}. Deseas otra carta?"); respuesta = Console.ReadLine();}while(respuesta.ToLower()=="sí"|| respuesta.ToLower()=="yes");
A través de do-while, podemos manejar fácilmente juegos interactivos donde se necesita que el jugador participe activamente, como al solicitar cartas en un juego de blackjack.
¿Por qué es importante la correcta instanciación y uso de Random en C#?
La clase Random de C# es utilizada para generar números aleatorios. En el contexto de un juego de cartas, esto permite simular la aleatoriedad del mazo. Para lograr esto, se debe instanciar correctamente la clase Random para garantizar que se comporta como se espera.
Random generadorAleatorio =newRandom();int carta = generadorAleatorio.Next(1,13);// Genera un número entre 1 y 12
Al declarar y utilizar Random de esta forma, se obtiene una difusión equitativa de valores posibles para las cartas, proporcionando un juego más justo y equilibrado. Es crucial hacerlo dentro de un marco adecuado para evitar problemas como la repetición innecesaria de valores.
En resumen, los comandos while y do-while ofrecen un control detallado sobre el flujo de un juego, especialmente en términos de ciclos y bucles, mejorando significativamente la interacción y fluidez del desarrollo de juegos.
Otra forma para validar si el usuario escribe, sin colocar las combinaciones de escribirlo, pueden ser que colocando el resultado que recibes en mayuscula o minuscula. Algo ocmo
resultado.toUpper() o resultado.toLower(), respectivamente
++CICLOS WHILE Y DO WHILE++
La instrucción while ejecuta una instrucción o un bloque de instrucciones mientras que una expresión booleana especificada se evalúa como true. Como esa expresión se evalúa antes de cada ejecución del bucle, un bucle while se ejecuta cero o varias veces. La while instrucción difiere de un bucle do , que se ejecuta una o varias veces.
En el ejemplo siguiente se muestra el uso de la instrucción while:
int n =0;while(n <5){Console.Write(n); n++;}// Output:// 01234
La estructura do while es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia del while o del for que podían no ejecutar el bloque.
Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo.
La condición de la estructura está abajo del bloque a repetir, a diferencia del while o del for que está en la parte superior.
El bloque de operaciones se repite MIENTRAS que la condición sea Verdadera.
Si la condición retorna Falso el ciclo se detiene. En C#, todos los ciclos repiten por verdadero y cortan por falso.
Es importante analizar y ver que las operaciones se ejecutan como mínimo una vez.
Ejemplos de uso de la estructura de iteracion WHILE:
++Estructura repetitiva do while++
La estructura do while es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia del while o del for que podían no ejecutar el bloque.
Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo.
La condición de la estructura está abajo del bloque a repetir, a diferencia del while o del for que está en la parte superior.
El bloque de operaciones se repite MIENTRAS que la condición sea Verdadera.
Si la condición retorna Falso el ciclo se detiene. En C#, todos los ciclos repiten por verdadero y cortan por falso.
Es importante analizar y ver que las operaciones se ejecutan como mínimo una vez.
Ejemplos de uso y funcionamiento de DO WHILE:
Gracias!
se da mucha vuelta en la expicación de un do while, ir haciendolo paso por paso complica su entendimiento, debe comenzar por la estructura,
do
{
} while();
y después como funciona, a decir verdad el while tampoco lo comprendí, aunque ya tengo tiempo programando y puedo rellenar lo que me falta a prueba y error
Cierto, use las IAS para comprender mejor que decia
La declaración de random se hace antes del loop (do) para que no se ejecute la creación del objeto en cada iteración
Ventajas y desventajas de usar while
Ventajas
Flexibilidad: El bucle while permite realizar iteraciones de acuerdo a una condición específica, lo que proporciona flexibilidad en la ejecución del código. Esto significa que puedes repetir un bloque de código mientras se cumpla una determinada condición.
Sencillez: El bucle while es relativamente sencillo de entender y utilizar. Solo requiere una condición de salida y el bloque de código a ejecutar mientras se cumpla esa condición.
Adaptabilidad: El bucle while se puede utilizar en una amplia variedad de situaciones y para diferentes tipos de condicionales . Puedes establecer cualquier tipo de condición que desees , siempre y cuando pueda evaluarse como verdadera o falsa.
Control de flujo: El bucle while te permite tener un mayor control sobre el flujo de ejecución de tu programa. Puedes decidir cuándo y bajo qué condiciones se repite un bloque de código, lo que te da mayor precisión en el control de los procesos.
Desventajas
Posibilidad de bucles infinitos: Si no se establece correctamente una condición de salida, es posible que el bucle while se ejecute infinitamente, lo que puede llevar a un bloqueo del programa o un consumo excesivo de recursos.
Complejidad en el manejo de variables de control: Al utilizar un bucle while, es necesario asegurarse de que las variables de control se actualicen correctamente dentro del bloque de código. Si no se actualizan de manera adecuada, se puede producir un bucle infinito o un comportamiento inesperado.
Menor legibilidad en comparación con otros bucles: A veces, el bucle while puede resultar menos legible que otros bucles, como el bucle for. Esto se debe a que la condición de salida se establece fuera del bucle y puede ser más difícil de seguir para otros desarrolladores.
Aquí mi versión de blackjack 😁
Mejoren mi aporte y me comparten el código para ver de que otra forma se puede hacer mejor. Saludos!!!
int jugador =0;int cartasJugador =0;int puntosJugador =0;int maquina =0;int puntosMaquina =0;string mensaje ="";string salir ="";Random random =newRandom();Console.WriteLine("Welcome to C A S I N O!");Console.WriteLine("¡Vamos a jugar al Blackjack!");Console.WriteLine("Puedes solicitar entre 1 y mas cartas.");Console.WriteLine("Si la suma de tus cartas se pasa de 21, habrás perdido.");Console.WriteLine("¿Estás listo?");Console.WriteLine("Mucha suerte!");while(puntosJugador <=21){Console.WriteLine("¿Cuántas cartas quieres?"); cartasJugador =Convert.ToInt32(Console.ReadLine());for(int i =0; i < cartasJugador; i++){ jugador = random.Next(1,11);// Genera valores entre 1 y 10 puntosJugador += jugador;}if(puntosJugador <21){Console.WriteLine($"Tienes {puntosJugador} puntos con {cartasJugador} cartas.");Console.WriteLine("¿Deseas parar con las cartas que tienes?");Console.WriteLine("Escribe 'si' para parar o cualquier otra tecla para continuar."); salir =Console.ReadLine();if(salir =="si"){break;}}}while(puntosMaquina <=17){ maquina = random.Next(1,11);// Genera valores entre 1 y 10 puntosMaquina += maquina;}Console.WriteLine($"Tus puntos son: {puntosJugador}");if(puntosJugador >21){ mensaje ="Perdiste. Te pasaste de 21 puntos.\n";}elseif(puntosJugador > puntosMaquina){ mensaje ="¡Felicitaciones! Ganaste.\n";}elseif(puntosMaquina > puntosJugador){ mensaje ="Perdiste. El casino ganó.\n";}else{ mensaje ="Empate. La casa gana!\n";}mensaje += $"Tus puntos son: {puntosJugador}\n";mensaje += $"Los puntos del casino son: {puntosMaquina}";Console.WriteLine(mensaje);
C# y JS me parecen muy similares..
el dealer es el de la droga, el de las cartas es el crupier,
apuesto que vive en Sinaloa
Sacado directamente de Wikipedia:
A croupier or dealer is someone appointed at a gambling table to assist in the conduct of the game, especially in the distribution of bets and payouts. Croupiers are typically employed by casinos.
Como podrás ver, es correcto decir dealer al igual que croupier. (por cierto, escribiste crupier, y así está mal escrito). Si asocias dealer a la venta de sustancias ilegales, eso ya va lamentablemente en tu mentalidad y con que lo quieras asociar de forma inadecuada.
¡Que tengas feliz día!
ja, tamblen se le llama dealer, solo que es "mas amateur" o regional
en black jack los números de las cartas se contabilizan normal y las letras "J", "Q" and "K" son equivalentes a 10 y la A puede ser 1 or 11 por eso un A con letra es black jack porque 11 + 10 = 21
No me quedó claro por qué usar el switchControl debajo de cada condición
Yo lo hice así y a mi me funcionó:
using System.Runtime.InteropServices;var totalDealer =0;var totalJugadores =0;string message ="";string switchControl ="menu";while(true){switch(switchControl){case"menu":Console.WriteLine("");Console.WriteLine("");Console.WriteLine("Bienvenido al casino");Console.WriteLine("Escriba '1' para iniciar"); switchControl =Console.ReadLine();break;case"1":Console.WriteLine("");Console.WriteLine("Bienvenido al casino");Console.WriteLine("Introduzca número de jugadores "); totalJugadores =Convert.ToInt16(Console.ReadLine());Console.WriteLine("Ahora introduzca número de Dealers "); totalDealer =Convert.ToInt16(Console.ReadLine());if(totalJugadores > totalDealer){ message ="Venciste al dealer, felicidades";}elseif(totalDealer > totalJugadores){ message ="El dealer te venció";Console.WriteLine("");}elseif(totalDealer == totalJugadores){ message ="Resultado igualado";Console.WriteLine("");}else{ message ="Condición no valida";}Console.WriteLine(message);break;default:Console.WriteLine("Valor ingresado no valido");break;}}
Coloca esa variable para que en las opciones que finalizan la jugada cambie el valor que evalua el swtich y regrese al menú
Aplicando lo aprendido
using System;var(totalJugador, totalDealer, num)=(0,0,0);string message = string.Empty;string switchControl ="menu";int sigueJugando =0;/* Blackjack, Juntar 21 pidiendo, en caso de pasaswte de 21 pierdes.
cartas o en caso de tener menos
de 21 igual tener mayor puntuación que el dealer */while(true){switch(switchControl){case"menu":Console.WriteLine("Welcome al *** C A S I N O ***");Console.WriteLine("Escriba '21' para jugar 21"); switchControl =Console.ReadLine();break;case"21":System.Random random =newSystem.Random(); totalDealer = random.Next(1,21);do{ num = random.Next(1,12); totalJugador = totalJugador + num;Console.WriteLine("Toma tu carta jugador");Console.WriteLine($"Te salió el número: {num}");Console.WriteLine("Deseas seguir jugando?");Console.WriteLine("1-> Si");Console.WriteLine("2-> No"); sigueJugando =Convert.ToInt32(Console.ReadLine());}while(sigueJugando ==1);if(totalJugador <1|| totalJugador >21){ message ="Total jugador no puede ser menor que 1 o mayor a 21"; switchControl ="menu";}elseif(totalDealer <1|| totalDealer >21){ message ="Total dealer no puede ser menor que 1 o mayor a 21"; switchControl ="menu";}else{if(totalJugador > totalDealer){ message ="Felicidades, venciste al dealer"; switchControl ="menu";}elseif(totalJugador <= totalDealer){ message ="Lo siento!... Perdiste vs el dealer"; switchControl ="menu";}else{ message ="Condición no válida"; switchControl ="menu";}}Console.WriteLine($"Total jugador {totalJugador}");Console.WriteLine($"Total dealer {totalDealer}");Console.WriteLine(message);break;default:Console.WriteLine("Valor ingresado no valido en el *** C A S I N O ***"); switchControl ="menu";break;}}
Hay algo malo en tu logica, al quedarme en una baraja digamos de 14, el programa hace mal el calculo.
🔴 La diferencia principal es cuándo se verifica la condición:
✋En while, la condición se verifica antes de ejecutar el bloque de código.
✋En do-while, el bloque de código se ejecuta al menos una vez antes de verificar la condición. Esto puede ser útil cuando deseas que el bloque de código se ejecute al menos una vez, independientemente de la condición.
Así me quedo el código de Ciclo While en C# de otra manera:
int totalJugador = 0;
int totalDealer = 0;
string message = "";
Console.WriteLine("Bienvenido al casino");
Console.WriteLine("Escriba '21' para jugar al 21");
string switchControl = Console.ReadLine();
Console.ReadLine();
while (true)
{
switch (switchControl)
{
case "21":
Console.WriteLine("¿cuál es el total del jugador:");
Me pasó algo curioso: pongo '21' y me dice que gané, pero en el curso veo que debería pasar lo contrario. ¿Me podrían ayudar, por favor?
Para validar la condición del "si" utilicé el método ToLower() para que independientemente si el usuario escribe en mayúsculas o minúsculas siempre se haga la conversión y validación.
while (Console.ReadLine().ToLower() == "si");
aqui esta mi código hay medio solucione el problema sin ir a la siguiente clase
while Loop
Funcionamiento: Evalúa la condición antes de ejecutar el bloque de código. Si la condición es false desde el principio, el bloque de código no se ejecutará ni una sola vez.
do-while Loop
Funcionamiento: Ejecuta el bloque de código al menos una vez antes de evaluar la condición. Luego, sigue ejecutando el bloque mientras la condición sea true.
Diferencia Clave
while: Puede que nunca ejecute el bloque de código si la condición es false desde el principio.
do-while: Siempre ejecuta el bloque de código al menos una vez, independientemente de si la condición es false desde el principio.
Interesante.
System.Random random =newSystem.Random();int Jugador_C=0;int Num=0;string Jugar="Si";string salir="";bool Desidir;switch(Jugar){case"Si":Console.WriteLine("CASINO tu dinero ");Console.WriteLine("TOMA UNA CARTA Y POSIBLEMENTE MI DINERO\n "+" Di que si");Jugar=Console.ReadLine();if(Jugar=="Si"){do{Num= random.Next(1,12);Jugador_C=Jugador_C+Num;if(Jugador_C>21){Console.WriteLine("Perdiste tu dinero");Desidir=false;Jugar="no";}elseif(Jugador_C<21){Console.WriteLine("Tu carta es "+Num);Console.WriteLine("Total "+Jugador_C);Console.WriteLine("Quieres ortra carta?"); salir =Console.ReadLine();}else{Console.WriteLine("Quieres salir?");salir =Console.ReadLine();}if(salir =="Si"){Desidir=true;Console.WriteLine("P1?");}else{Console.WriteLine("P3?");Jugar="no";Desidir=false;};}while(Desidir);};break;default:Console.WriteLine("Miedoso ");break;}
Comparto una calculadora básica, con el ciclo Do - While para repetir la operación:
{ class Program
{staticvoidMain(string[] args){ string repetir;int operacion;do{ Console.WriteLine("Seleccione la operacion que desea realizar:"); Console.WriteLine("1 - Sumar"); Console.WriteLine("2 - Restar"); Console.WriteLine("3 - Multiplicar"); Console.WriteLine("4 - Dividir"); Console.WriteLine(" "); operacion =int.Parse(Console.ReadLine());Calcular(operacion); Console.WriteLine("****************************"); Console.WriteLine("¿Desea realizar otro cálculo?"); Console.WriteLine("1 = Si"); Console.WriteLine("2 = No"); repetir = Console.ReadLine();if(repetir =="1"|| repetir =="SI"|| repetir =="Si"|| repetir =="si"){ Console.Clear();}}while(repetir =="1"|| repetir =="SI"|| repetir =="Si"|| repetir =="si"); Console.WriteLine("Presione una tecla para salir"); Console.ReadKey();} private staticvoidCalcular(int operacion){ Console.Clear();switch(operacion){case1:{ Console.WriteLine("SUMAR"); Console.WriteLine("");CalcularRespuesta(operacion);break;}case2:{ Console.WriteLine("RESTAR"); Console.WriteLine("");CalcularRespuesta(operacion);break;}case3:{ Console.WriteLine("MULTIPLICAR"); Console.WriteLine("");CalcularRespuesta(operacion);break;}case4:{ Console.WriteLine("DIVIDIR"); Console.WriteLine("");CalcularRespuesta(operacion);break;}default:break;}} private staticvoidCalcularRespuesta(int operacion){ Console.Write("Digite el primer número: ");double numero1 =double.Parse(Console.ReadLine()); Console.Write("Digite el segundo número: ");double numero2 =double.Parse(Console.ReadLine());if(operacion ==1){double resultado = numero1 + numero2; Console.WriteLine("El resultado de sumar {0} + {1} = {2}", numero1, numero2, resultado);}if(operacion ==2){double resultado = numero1 - numero2; Console.WriteLine("El resultado de restar {0} - {1} = {2}", numero1, numero2, resultado);}if(operacion ==3){double resultado = numero1 * numero2; Console.WriteLine("El resultado de multiplicar: {0} x {1} = {2}", numero1, numero2, resultado);}if(operacion ==4){if(numero2 !=0){double resultado = numero1 / numero2; Console.WriteLine("El resultado de dividir: {0} / {1} = {2}", numero1, numero2, resultado);}else{ Console.WriteLine("No se puede dividir entre {0}", numero2);}} Console.WriteLine(" ");}}}