{"id":10507,"date":"2021-01-14T19:28:02","date_gmt":"2021-01-14T18:28:02","guid":{"rendered":"https:\/\/perdiendo.org\/museodemetralla\/?p=10507"},"modified":"2021-01-18T09:15:04","modified_gmt":"2021-01-18T08:15:04","slug":"el-ahorcado","status":"publish","type":"post","link":"https:\/\/perdiendo.org\/museodemetralla\/?p=10507","title":{"rendered":"el ahorcado"},"content":{"rendered":"<p>Es divertido, mucho. Pero despu\u00e9s de reventarme contra ello es de esas cosas que s\u00e9 que puedo entender si la reviso, pero no s\u00e9 si ser\u00eda capaz de crearlo por m\u00ed mismo (dudo mucho que fuera capaz). <\/p>\n<pre><code># el famos\u00edsimo internacionalmente juego del ahorcado versi\u00f3n mimismo\r\n\r\nimport random # importamos el m\u00f3dulo para elegir posteriormente entre las palabras de la variable \"palabras\"\r\n\r\n'''\r\nCadena multi-l\u00ednea: comillas triples en una variable permiten meter varias l\u00edneas sin tener que utilizar \\n\r\n\r\nLista: contiene varios valores a los que se puede acudir por n\u00famero de izq a der empezando desde el 0,\r\nen la de abajo IM\u00c1GENES_AHORCADO cada elemento de la lista es una cadena multi-l\u00ednea\r\n\r\nConstantes: para variables constantes como IM\u00c1GENES_AHORCADO la convenci\u00f3n es que vayan escritas en may\u00fascula\r\n(una \"variable constante\" es un contrasentido como un piano, yo dir\u00eda \"constante\" sin m\u00e1s)\r\n\r\n'''\r\n\r\nIM\u00c1GENES_AHORCADO = [''' \r\n\r\n  +---+\r\n  |   |\r\n      |\r\n      |\r\n      |\r\n      |\r\n=========''', '''\r\n\r\n  +---+\r\n  |   |\r\n  O   |\r\n      |\r\n      |\r\n      |\r\n=========''', '''\r\n\r\n  +---+\r\n  |   |\r\n  O   |\r\n  |   |\r\n      |\r\n      |\r\n=========''', '''\r\n\r\n  +---+\r\n  |   |\r\n  O   |\r\n \/|   |\r\n      |\r\n      |\r\n=========''', '''\r\n\r\n  +---+\r\n  |   |\r\n  O   |\r\n \/|\\  |\r\n      |\r\n      |\r\n=========''', '''\r\n\r\n  +---+\r\n  |   |\r\n  O   |\r\n \/|\\  |\r\n \/    |\r\n      |\r\n=========''', '''\r\n\r\n  +---+\r\n  |   |\r\n  O   |\r\n \/|\\  |\r\n \/ \\  |\r\n      |\r\n=========''']\r\n\r\npalabras = 'hormiga babuino tejon murcielago oso castor camello gato almeja cobra pantera coyote cuervo ciervo perro burro pato aguila huron zorro rana cabra ganso halcon leon lagarto llama topo mono alce raton mula salamandra nutria buho panda loro paloma piton conejo carnero rata cuervo rinoceronte salmon foca tiburon oveja mofeta perezoso serpiente ara\u00f1a cig\u00fce\u00f1a cisne tigre sapo trucha pavo tortuga comadreja ballena lobo wombat cebra'.split()\r\n\r\n# el m\u00e9todo .split() devuelve una lista en la que cada palabra en la cadena es un elemento aparte, separa en cada hueco en blanco. \r\n# \"palabras\" pasa a ser una lista igual que si hubi\u00e9ramos escr\r\n# con ListaDePalabras defines un par\u00e1metro, dices que al lanzar la funci\u00f3n obtenerPalabraAlAzar le incluir\u00e1s una lista entre (). ito palabras = ['hormiga', 'babuino'] etcetc.\r\n\r\n# recordatorio personal: definir funciones no pone en marcha nada, simplemente las define para un futuro\r\n\r\n# no es que est\u00e9s creando otra lista, sino que le indicas que trabajar\u00e1 con una lista de palabras que proporcionas, en este caso 'palabras'\r\n# eso mola porque la funci\u00f3n utilizar\u00e1 listaDePalabras para manipularlas se llame como se llame la lista que le metas\r\n# lo que me ha costado comprender esto, todo est\u00e1 relacionado con las variables globales y las variables locales\r\n# si dentro de la funci\u00f3n substituyes listaDePalabras por palabras todo seguir\u00eda funcionando igual, de hecho lo hace en la funci\u00f3n siguiente\r\ndef obtenerPalabraAlAzar(listaDePalabras):\r\n    \u00edndiceDePalabras = random.randint(0, len(listaDePalabras) - 1) # el n\u00famero que se usar\u00e1 para elegir de la lista palabras[x]\r\n# -1 porque el elemento 1 es el 0 en la asignaci\u00f3n, as\u00ed que la cuarta palabra en la lista estar\u00e1 en la posici\u00f3n 3\r\n# elige entre 0 y la longitud de la lista -1\r\n    return listaDePalabras[\u00edndiceDePalabras]\r\n# devuelve listaDePalabras (que en este caso es palabras, el nombre de la lista) y [el \u00edndice]: palabras[x]\r\n\r\n# en esta funci\u00f3n las variables locales se llaman igual que las globales, aunque no son las mismas\r\ndef mostrarTablero(IM\u00c1GENES_AHORCADO, letrasIncorrectas, letrasCorrectas, palabraSecreta):\r\n    print(IM\u00c1GENES_AHORCADO[len(letrasIncorrectas)]) # imprime de la lista de im\u00e1genes la que est\u00e1 en la posici\u00f3n de las letras incorrectas\r\n    print() # imprimimos una l\u00ednea en blanco\r\n\r\n    print('Letras incorrectas:', end=' ') # imprime el texto y no salta a la l\u00ednea de abajo\r\n    for letra in letrasIncorrectas: # letra es una nueva variable for hace que \"deletree\" las letras que pertenecen a incorrectas y las guarda en cada ciclo en letra\r\n        print(letra, end=' ') # la secuencia for imprime letra sin saltar a la linea de abajo\r\n    print() # imprimimos una l\u00ednea en blanco\r\n\r\n    espaciosVac\u00edos = '_' * len(palabraSecreta) # las l\u00edneas de la palabra, imprime tantos _ como su longitud\r\n\r\n    for i in range(len(palabraSecreta)): # nueva variable i en la que se acumula toda la longitud de palabraSecreta, si tiene 7 letras se mover\u00e1 entre el 0-6\r\n        if palabraSecreta[i] in letrasCorrectas: # si la letra que toca est\u00e1 en letras correctas... (cualquier variable es tb una lista de letras, guardas 'hola' y palabraSecreta[0] ser\u00e1 h)\r\n            espaciosVac\u00edos = espaciosVac\u00edos[:i] + palabraSecreta[i] + espaciosVac\u00edos[i+1:]\r\n            ''' vamos a actualizar espaciosVac\u00edos por las letras descubiertas con un corte de lista\r\n                corte de lista [a:c] marca las palabras que se van a incluir con desde-hasta, y el hasta no incluye, en hola[1:3] ser\u00eda ol, las pos 1 y 2\r\n                1. espaciosVac\u00edos[:i] metemos los valores de espacios vac\u00edos hasta i (para no modificar los anteriores bucles de _ vac\u00edos y letras descubiertas)\r\n                el hasta del corte llega hasta justo la posici\u00f3n anterior a i\r\n                2. palabraSecreta[i] metemos la letra que ha sido correcta en i\r\n                3. espaciosVac\u00edos[i+1:] metemos desde i en adelante lo que hubiera (_ vac\u00edos y letras descubiertas)\r\n                de espaciosVac\u00edos nos interesan los _ y las letras descubiertas en bucles anteriores, y de palabraSecreta s\u00f3lo la letra correcta\r\n            '''\r\n\r\n    for letra in espaciosVac\u00edos: # generamos letra con todo lo que est\u00e9 en spaciosVac\u00edos\r\n        print(letra, end=' ') # imprimimos las letras y los _ (letra es la variable que creamos cada ciclo) y no saltamos de l\u00ednea\r\n    print() # imprimimos una l\u00ednea en blanco\r\n\r\n# nueva funci\u00f3n para recibir la nueva letra, le metemos letrasProbadas con las letras que hemos metido con anterioridad como par\u00e1metro\r\ndef obtenerIntento(letrasProbadas):\r\n    while True: # jaja, siempre es true hasta que sales con return\r\n        print('Adivina una letra.') # imprimimos Adivina...\r\n        intento = input() # le pedimos que meta una letra y la guardamos en intento\r\n        intento = intento.lower() # la ponemos en min\u00fascula\r\n        if len(intento) != 1: # si la longitud de intento es m\u00e1s de uno es que ha metido m\u00e1s de una letra y no mola\r\n            print('Por favor, introduce una letra.') # le decimos lo que ha pasado\r\n        elif intento in letrasProbadas: # tb si la letra ya la ha metido antes \r\n            print('Ya has probado esa letra, elige otra.') # le decimos que ya lo ha hecho\r\n        elif intento not in 'abcdefghijklmn\u00f1opqrstuvwxyz': # si no est\u00e1 en el abecedario\r\n            print('Por favor, ingresa una LETRA.') # se lo recordamos\r\n        else: # en cualquier otro caso\r\n            return intento # devolvemos el resultado meti\u00e9ndolo en la variable global intento\r\n\r\n# funci\u00f3n para volver a jugar o salir\r\ndef jugarDeNuevo(): # definimos, no necesita par\u00e1metro\r\n    print('\u00bfQuieres jugar de nuevo (s\u00ed o no)') # imprimimos la pregunta\r\n    return input().lower().startswith('s') # ponemos input en min\u00fasculas, si empieza por s devuelve True (s no es lo mismo que S)\r\n\r\n# y empieza el juego!\r\nprint('A H O R C A D O') # imprimimos el nombre\r\nletrasIncorrectas = '' # creamos la variable letrasIncorrectas\r\nletrasCorrectas = '' # creamos la variable #letrasCorrectas\r\n# la \u00fanica vez que se invoca \"palabras\" es para meterla dentro de la funci\u00f3n obtenerPalabraAlAzar\r\n# le est\u00e1s diciendo a la funci\u00f3n el nombre de la lista que tiene que utilizar\r\npalabraSecreta = obtenerPalabraAlAzar(palabras) # creamos la palabra correcta\r\njuegoTerminado = False # establecemos el status para salir del juego en False\r\n\r\nwhile True: # repite el bucle indefinidamente hasta que algo le saca\r\n    mostrarTablero(IM\u00c1GENES_AHORCADO, letrasIncorrectas, letrasCorrectas, palabraSecreta) # invocas mostrarTablero con sus variables\r\n\r\n    intento = obtenerIntento(letrasIncorrectas + letrasCorrectas) # creas intento invocando a la funci\u00f3n obtenerIntento, con las letrasIncorrectas y las letrasCorrectas como variables que se meter\u00e1n en la variable local letrasProbadas\r\n\r\n    if intento in palabraSecreta: # aqu\u00ed la funci\u00f3n obtenerIntento ya ha devuelto la letra que ha metido el tipo, as\u00ed que si est\u00e1 en la palabraSecreta...\r\n        letrasCorrectas = letrasCorrectas + intento # la a\u00f1adimos a letrasCorrectas manteniendo las anteriores, en intento sigue estando la letra que ha metido el tipo\r\n\r\n        encontradoTodasLasLetras = True # marcamos el status de encontradoTodasLasLetras como verdadero, tendr\u00e1 sentido en el siguiente if\r\n        for i in range(len(palabraSecreta)): # bucle for para testar las letras\r\n            if palabraSecreta[i] not in letrasCorrectas: # si una de las letras de palabraSecreta no est\u00e1 en letrasCorrectas\r\n                encontradoTodasLasLetras = False # cambiamos el status de encontradoTodasLasLetras a False\r\n                break # rompemos el for, as\u00ed que pasar\u00e1 a else:\r\n        if encontradoTodasLasLetras: # si encontradoTodasLasLetras es True\r\n            print('\u00a1S\u00ed! \u00a1La palabra secreta es \"' + palabraSecreta + '\"! \u00a1Has ganado!') # imprimes el final\r\n            juegoTerminado = True # y creas juego terminado y le das valor True\r\n    else:\r\n        letrasIncorrectas = letrasIncorrectas + intento # si la letra no estaba en la palabra secreta, la a\u00f1adimos a letras incorrectas\r\n\r\n        if len(letrasIncorrectas) == len(IM\u00c1GENES_AHORCADO) - 1: # ojo, si la longitud de letrasIncorrectas es igual a IM\u00c1GENES_AHORCADO - 1 (len empieza en 1, las listas en 0)\r\n            mostrarTablero(IM\u00c1GENES_AHORCADO, letrasIncorrectas, letrasCorrectas, palabraSecreta) # invocamos mostrarTablero con sus par\u00e1metros\r\n            print('\u00a1Te has quedado sin intentos!\\nDespu\u00e9s de ' + str(len(letrasIncorrectas)) + ' intentos fallidos y ' + str(len(letrasCorrectas)) + ' aciertos, la palabra era \"' + palabraSecreta + '\"')\r\n            # imprimimos msg + el n\u00famero de letras incorrectas + msg + el n\u00famero de letras correctas + msg + la palabra secreta que hab\u00eda que adivinar\r\n            juegoTerminado = True # y establecemos juegoTerminado en True\r\n\r\n    if juegoTerminado: # invocamos juegoTerminado, y si devuelve True \r\n        if jugarDeNuevo(): # si el tipo ha contestado cualquier cosa que empiece por s, incluido soplapollas\r\n                           # atenci\u00f3n a c\u00f3mo juegoTerminado, que no es una funci\u00f3n, no tiene (), mientras que jugarDeNuevo, que s\u00ed lo es, s\u00ed los tiene\r\n            letrasIncorrectas = '' # ponemos a cero letrasIncorrectas\r\n            letrasCorrectas = '' # ponemos a cero letrasCorrectas\r\n            juegoTerminado = False # convertimos juegoTerminado a False\r\n            palabraSecreta = obtenerPalabraAlAzar(palabras) # obtenemos una nueva palabraSecreta\r\n        else: # si jugarDeNuevo devuelve false\r\n            break # cerramos el programa\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Es divertido, mucho. Pero despu\u00e9s de reventarme contra ello es de esas cosas que s\u00e9 que puedo entender si la reviso, pero no s\u00e9 si ser\u00eda capaz de crearlo por m\u00ed mismo (dudo mucho que fuera capaz). # el famos\u00edsimo internacionalmente juego del ahorcado versi\u00f3n mimismo import random # importamos el m\u00f3dulo para elegir posteriormente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[],"class_list":["post-10507","post","type-post","status-publish","format-standard","hentry","category-python"],"_links":{"self":[{"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=\/wp\/v2\/posts\/10507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10507"}],"version-history":[{"count":0,"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=\/wp\/v2\/posts\/10507\/revisions"}],"wp:attachment":[{"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perdiendo.org\/museodemetralla\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}