Juego de casino
ResueltoHola,
Necesito ayuda para escribir un programa en Python cuyo enunciado es el siguiente:
Sea un Casino: una ruleta tiene 13 números (0 - 12):

El jugador tiene varios tipos de apuestas posibles:
-
puede elegir apostar al número que salga, y en este caso, si gana, ganará doce veces su apuesta;
-
puede elegir apostar a la paridad del número que salga (par o impar), y en este caso, si gana, ganará dos veces su apuesta;
-
finalmente, puede elegir apostar al color del número que salga (rojo o negro), y en este caso también, si gana, ganará dos veces su apuesta.
Si el jugador pierde su apuesta, no recupera su apuesta.
Para simplificar, suponemos que el número 0 no es ni rojo ni negro, pero es par. Para simplificar aún más, suponemos que el jugador apuesta sistemáticamente 10 euros.
Escribir un programa que ayude al crupier a determinar la cantidad que el casino debe dar al jugador.
El programa leerá, en orden, dos números enteros de entrada: la apuesta del jugador (representada por un número entre 0 y 16, ver descripción más abajo), y el número salido (número entre 0 y 12). El programa mostrará entonces el monto ganado por el jugador.
Entradas para la apuesta del jugador:
-
número entre 0 y 12: el jugador apuesta al número correspondiente
-
13: el jugador apuesta a par
-
14: el jugador apuesta a impar
-
15: el jugador apuesta al color rojo
-
16: el jugador apuesta al color negro
Aquí está mi código:
a = int(input()) b = int(input()) if b == a: print(10 * 12) elif a == 0 or a == 13 or (a == 14 and b % 2 == 1): print(10 * 2) elif (a == 15 and b == 1) or (a == 16 and b == 0): print(10 * 2) else : print(10 * 0)
Este código no funciona con todos los pares de números. ¿Puedes ayudarme a mejorar este programa, por favor?
Muchas gracias.
6 respuestas
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Ambassadeur 1 588
hola, ¿para qué pareja no funciona?
-
Hola,
Gracias por tomarte el tiempo de responderme.
En efecto, pienso que es sobre la prioridad de los operadores lógicos donde fallo.
Mi código funciona para los siguientes pares: (7 y 7: ok) (7 y 9: ok) y (16 y 4: ok).
¿Crees que podrías mejorar el código?
-
Aquí está el nuevo código insertando los paréntesis:
a = int(input()) b = int(input()) if b == a: print(10 * 12) elif (a == 0) or (a == 13) or ((a == 14) and (b % 2 == 0)): print(10 * 2) elif ((a == 15) or (a == 16)) and (b % 2 == 0): print(10 * 2) else : print(10 * 0)
Pero no funciona. Por ejemplo, al ingresar el par 13 y 1 debería devolver 0 y me devuelve 20. Creo que es la línea 2 (par e impar) la que causa el problema.
¿Qué piensas?
Gracias por la ayuda
-
Hola,
Varias recomendaciones:
- En lugar de usar a y b, podrías usar nombres de variables más descriptivos (por ejemplo apuesta y importe). También se recomienda comprobar si los parámetros ingresados son correctos.
apuesta = int(input("Apuesta [0-16] ?")) if not 0 <= apuesta <= 16: raise ValueError(f"Apuesta inválida: {apuesta}") sorteo = int(input("Sorteo [0-16] ?")) if not 0 <= sorteo <= 16: raise ValueError(f"Sorteo inválido: {sorteo}")- Para mejorar la legibilidad de tu programa, puedes definir "constantes" (en realidad no hay constantes en Python, pero es la idea) que permitan abstraer las apuestas especiales:
APUESTA_PAR = 13 APUESTA_IMPAR = 14 APUESTA_ROJO = 15 APUESTA_NEGRO = 16
... o de manera más concisa:
(APUESTA_PAR, APUESTA_IMPAR, APUESTA_ROJO, APUESTA_NEGRO) = range(13, 17)
- Puedes escribir una función que, dado una apuesta, determine si el sorteo corresponde a una casilla roja (respectivamente a una casilla negra, respectivamente a un número par, respectivamente a un número impar).
def es_par(sorteo): return sorteo % 2 == 0 def es_rojo(sorteo): return sorteo in {1, 3, 5, 7, 9, 12} # etc...- Las pruebas aplicadas permitirán determinar el multiplicador de ganancia (*2, *12, *0) según la naturaleza de la apuesta y si esta ha sido exitosa.
if apuesta == APUESTA_ROJO and es_rojo(sorteo): multiplicador = 2 elif apuesta == APUESTA_PAR and es_par(sorteo): multiplicador = 2 ...
- Puedes factorizar las pruebas que conducen al mismo multiplicador, pero ten cuidado, ya que el operador lógico Y tiene prioridad sobre el operador lógico O:
if ( (apuesta == APUESTA_ROJO and es_rojo(sorteo)) or (apuesta == APUESTA_PAR and es_par(sorteo)) or ... ): multiplicador = 2 elif ...: ... ...
- Puedes definir una variable ganancia que se calcula en función de importe y multiplicador.
Buena suerte
-
Hola @mamiemando EstadoModerador
Primero, gracias por tu respuesta muy completa y rica en detalles. Anoto que tienes un nivel demasiado avanzado para mí. Lamentablemente no entiendo todo.
Estoy de acuerdo con el efecto de nombrar directamente el nombre de las variables que son a y b, y lo tengo en cuenta.
Para ser totalmente transparente, estoy en un MOOC Aprender a programar con Python para principiantes. Estoy descubriendo el tema paso a paso y en cada ejercicio tengo la restricción de aplicar las nociones abordadas hasta ahora. Por eso dije que no comprendía todos los detalles en tu respuesta, aunque he captado algunas matices, por ejemplo, sobre la prioridad de los operadores lógicos.
Así que mejoré mi código. Pero sigue sin funcionar. ¿Puedes por favor corregirlo con nociones simples?
a = int(input()) b = int(input()) if b == a: print(10 * 12) elif (a == 0 and b % 2 == 0) or (a == 14 and b % 2 == 0) or (a == 14 and b % 2 == 1): print(10 * 2) elif (a == 13) and b % 2 == 0: print(10 * 2) elif (a == 15) or (a == 16) and b % 2 == 0: print(10 * 2) else : print(10 * 0)
¿Cómo expresar la paridad de impar con el módulo %, es decir, ¿se puede escribir: b % 2 == 1 para expresar IMPAR?
Gracias de nuevo por tu ayuda
-
- l1 à l5 : ok
- l6 : supongo que a designa la apuesta y que b designa el sorteo ?
- El test parece falso porque b es necesariamente par o impar, por lo tanto el test se simplifica en :
if (a == 0 and b % 2 == 0) or (a == 14)
... es decir "el jugador apuesta por 0 y saca un número par, o bien el jugador apuesta impar". En particular, si el jugador apuesta impar, entra en esta prueba sin importar el valor del sorteo. Dudo que eso sea lo que quieres escribir.
- El test parece falso porque b es necesariamente par o impar, por lo tanto el test se simplifica en :
-
l8 : la prueba significa "el jugador apuesta par" y obtiene un número par, por lo que parece correcto
-
l10 : la prueba significa "el jugador apuesta rojo, o apuesta negro y el sorteo es par". También es dudoso, ya que entramos en esta prueba tan pronto como la apuesta es roja, sin importar el sorteo. Además, el color y la paridad no coinciden, por lo que la segunda parte de la prueba también parece incorrecta.
¿Cómo expresar la paridad en impar con el módulo %, es decir para impar, podemos escribir : b % 2 == 1 para expresar IMPAR?
Sí. El operador x % y devuelve el resto de la división euclidiana x / y y siempre está comprendido entre 0 y y - 1.
Para escribir tu programa, te recomiendo hacer una prueba por situación (los pares, los impares, los rojos, los negros) incluso si eso significa agrupar algunas pruebas en una segunda etapa.
Buena suerte
@mamiemando EstadoModerador
Mi código funciona con persistencia y sobre todo gracias a su ayuda, que ha sido muy valiosa. realmente, muchas gracias por su amabilidad, ayuda y paciencia, aquí está el código :
a = int(input()) b = int(input()) if b == a: print(10 * 12) elif (a == 14) and b % 2 == 1: print(10 * 2) elif (a == 13 and b % 2 == 0): print(10 * 2) elif (a == 15) and (b == 1 or b == 3 or b == 5 or b == 7 or b == 9 or b == 12): print(10 * 2) elif (a == 16) and (b == 2 or b == 4 or b == 8 or b == 11 or b == 10): print(10 * 2) else : print(10 * 0)
De hecho, era necesario comparar con cada valor. En el estado actual, sé que este código aún se puede mejorar y ser más conciso con las nociones mencionadas anteriormente en sus explicaciones. Hasta la fecha, todavía no estoy en condiciones de entender todas estas sutilezas y no domino todo esto.
Realmente quería agradecerle por su pedagogía demostrada aquí.
También me gustaría preguntarle si usted mismo era desarrollador(a) informático o si trabaja en este campo?
¿Puedo pedirle su tarjeta de visita? (¿correo?)
Por adelantado, gracias.
-
-
Hola,
Primero que nada, muchas felicidades, el código parece correcto ahora.
Algunos paréntesis pueden omitirse (notablemente los de l6, l8 + los que conciernen al operando izquierdo del and en las líneas 10 y 12).
Aquí tienes cómo podría lucir el programa una vez formateado según las recomendaciones que te hice:
#!/usr/bin/env python3 PARI_PAIR = 13 PARI_IMPAIR = 14 PARI_ROUGE = 15 PARI_NOIR = 16 def est_pair(n: int) -> bool: return n % 2 == 0 def est_impair(n: int) -> bool: return n % 2 == 1 def est_rouge(n: int) -> bool: return n in {1, 3, 5, 7, 9, 12} def est_noir(n: int) -> bool: return n in {2, 4, 5, 6, 8, 10, 11} def saisie(): pari = int(input("¿Apuesta [0-16]?")) if not 0 <= pari <= 16: raise ValueError(f"Apuesta inválida: {pari}") tirage = int(input("¿Sorteo [0-12]?")) if not 0 <= tirage <= 12: raise ValueError(f"Sorteo inválido: {tirage}") return (pari, tirage) def calculer_multiplicateur(pari: int, tirage: int) -> int: if ( (pari == PARI_PAIR and est_pair(tirage)) or (pari == PARI_IMPAIR and est_impair(tirage)) or (pari == PARI_ROUGE and est_rouge(tirage)) or (pari == PARI_NOIR and est_noir(tirage)) ): return 2 elif pari == tirage: return 12 else: return 0 return 69 def main(): (pari, tirage) = saisie() multiplicateur = calculer_multiplicateur(pari, tirage) mise = 10 gains = multiplicateur * mise print(f"Apuesta: {pari} sorteo: {tirage} --> Ganancias = {multiplicateur} * {mise}€ = {gains}€") def test(): for pari in range(0, 17): for tirage in range(0, 13): multiplicateur = calculer_multiplicateur(pari, tirage) print(f"Apuesta: {pari}, sorteo: {tirage} --> multiplicador: {multiplicateur}") main()Realmente quería agradecerles por su pedagogía demostrada aquí.
Gracias, siempre es un placer recibir cumplidos y parte de la pedagogía también se debe a yg_be.
¿También me gustaría preguntar si usted mismo es desarrollador (a) de informática o trabaja en este campo?
Sí, trabajo en el campo.
¿Puedo pedirle su tarjeta de visita? (¿correo?)
Perdona, pero nunca comparto información personal a través del foro. Sin embargo, puedes escribirme por mensaje privado o hacer otras preguntas en el foro si lo necesitas.
Te deseo una excelente continuación y un buen aprendizaje de Python ;-)