1

estoy tratando de hacer un ejercicio sencillo que consiste en crear un juego que intente adivinar un numero, el código es el siguiente:

import random
class juego():
    probar = None
    numeros_probar = range(1,100)
    N = None

    def __init__(self):
        N = int(input("Dime un numero entre el 1 y el 100 para intentar adivinarlo"))
        self.N = N

        while self.probar != N:
            self.probar = random.sample(self.numeros_probar,1)[0]
            acortar = input(f"¿Es mayor o menor que {self.probar} ::REAL-> {N}? ")
            self.__acercarse(acortar)

            if self.probar == N:
                print(f"Es {probar}? Qué bien, lo encontré!")



    def __acercarse(self,acortar):
        nueva_lista = self.numeros_probar
        if acortar == "mayor":
            nueva_lista = [k for k in nueva_lista if k > self.probar]

        if acortar == "menor":
            nueva_lista = [k for k in nueva_lista if k < self.probar]

        self.numeros_probar = nueva_lista

El resultado al ejecutarlo y probarlo es así:

introducir la descripción de la imagen aquí

Como se puede ver en la última linea, cuando el programa encuentra el numero que busca no lo reconoce, es decir probar == N pero aun así el bucle While no se detiene ni se imprime el print ("lo encontré")

Todavía estoy aprendiendo, ¿Alguien tiene alguna idea de donde he metido la pata?

Gracias, un saludo.

Aibloy
  • 148
  • 8
  • Puede ser que esté ejecutando una versión pasada, el código que tienes ejecuta y realiza lo que es esperado. Sin embargo, me parece que habría que adecuar el *print* para cuando lo encuentra, se está llamando **probar** en lugar de ```self.probar``` – Rigoberto Ramirez Cruz May 14 '20 at 14:25

2 Answers2

1

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.

FJSevilla
  • 55,603
  • 7
  • 35
  • 58
0

El proeblema esta en

print(f"Es {probar}? Qué bien, lo encontré!")

pues debe ser self.probar, otras acotaciones, __init__ es usado para asignaciones iniciales de las variables iniciales, algo así como un constructor, sera mejor solo hacer eso y el código restante colocarlo en metodos diferente. y así usar las buenas practicas de programación.

Edw Paucar
  • 11
  • 2