Primero, en el print
del condicional debe ser:
print(f"Es {self.probar}? Qué bien, lo encontré!")
y no:
print(f"Es {probar}? Qué bien, lo encontré!")
Dicho ésto, para que se ejecute el condicional cuando el número es encontrado antes de pedir al usuario que diga si es menor o mayor, debes colocarlo antes del input
y además romper el ciclo o usar un else
para el input
, por ejemplo:
while True:
self.probar = random.sample(self.numeros_probar,1)[0]
if self.probar == N:
print(f"Es {probar}? Qué bien, lo encontré!")
return
acortar = input(f"¿Es mayor o menor que {self.probar} ::REAL-> {N}? ")
self.__acercarse(acortar)
while True:
self.probar = random.sample(self.numeros_probar,1)[0]
if self.probar == N:
print(f"Es {probar}? Qué bien, lo encontré!")
break
acortar = input(f"¿Es mayor o menor que {self.probar} ::REAL-> {N}? ")
self.__acercarse(acortar)
while self.probar != N:
self.probar = random.sample(self.numeros_probar,1)[0]
if self.probar == N:
print(f"Es {probar}? Qué bien, lo encontré!")
else:
acortar = input(f"¿Es mayor o menor que {self.probar} ::REAL-> {N}? ")
self.__acercarse(acortar)
o en Python >= 3.8, usando una expresión de asignación:
while (probar:= random.sample(self.numeros_probar,1)[0]) != N:
self.probar = probar
acortar = input(f"¿Es mayor o menor que {probar} ::REAL-> {N}? ")
self.__acercarse(acortar)
print(f"Es {probar}? Qué bien, lo encontré!")
Dicho ésto, unas observaciones:
Tus atributos probar
, numeros_probar
y N
son atributos de clase (compartidos por todas las instancias de la clase). Deben ser atributos de instancia, cada objeto Juego tiene los suyos propios:
No debes meter todo el procedimiento del juego en el inicializador, dicho método debe inicializar la clase y retornar, no estar atrapado en un ciclo infinito. Considera agregar otro método que se encargue de ésto.
Los nombres de las clases por convención siguen CamelCase.
No uses if
consecutivos cuando son excluyentes, es ineficiente, usa if-elif-else
:
En vez de random.sample
, usa random.choice
para obtener un único valor directamente. Aunque sería mejor aún si en vez de una lista usaras simplemente dos atributos con el límite inferior y superior y emplearas random.randint
.
import random
class Juego():
def __init__(self):
self._prueba = None
self._limsup = 100
self._liminf = 1
self._n = None
def jugar(self):
self._n = int(input(
"Dime un numero entre el 1 y el 100 para intentar adivinarlo: ")
)
while (prueba:= random.randint(self._liminf, self._limsup)) != self._n:
self._prueba = prueba
self._acercarse()
print(f"Es {prueba}? Qué bien, lo encontré!")
def _acercarse(self):
acortar = input(
f"¿Es mayor o menor que {self._prueba} ::REAL-> {self._n}? "
)
if acortar == "mayor":
self._liminf = self._prueba + 1
elif acortar == "menor":
self._limsup = self._prueba - 1
if __name__ == "__main__":
juego = Juego()
juego.jugar()
Faltaría validar las entradas del usuario, pero eso es otro tema.