SlideShare una empresa de Scribd logo
TECNOLOGÍA DE LA INFORMACIÓN           CURSO: 1 BACH




Python (Práctica 4)
Objetivo
Se trata de abordar un programa algo más serio, en el que las entradas del usuario in-
fluyen en el curso de la ejecución. Se usan, también, procedimientos de manipulación de
cadenas de texto.

Programa 6: Ahorcado
La cosa se complica. El siguiente es el clásico juego del ahorcado. Pero fíjate que un
buen programador debe escribir su código de forma que sea ampliable en el futuro. De
ahí el uso intensivo de las funciones.


# -*- coding: utf-8 -*-

import random

DIBUJOS = [’’’
    +------+
    |      |
    |      |
           |
           |
           |
           |
           |
           |
           |
           |
==============’’’, ’’’
    +------+
    |      |
    |      |
    O      |
           |
           |
           |
           |
           |
           |
           |
==============’’’, ’’’
    +------+
    |      |
    |      |
    O      |
    |      |
    |      |
    |      |
           |
           |
==============’’’, ’’’
    +------+
    |      |
    |      |
    O      |
   /|      |
  / |      |
    |      |
           |
TECNOLOGÍA DE LA INFORMACIÓN           CURSO: 1 BACH
             |
             |
             |
==============’’’, ’’’
      +------+
      |      |
      |      |
      O      |
    /|      |
  / |       |
      |      |
             |
             |
             |
             |
==============’’’, ’’’
      +------+
      |      |
      |      |
      O      |
    /|      |
  / |       |
      |      |
    /        |
  /          |
             |
             |
==============’’’, ’’’
      +------+
      |      |
      |      |
      O      |
    /|      |
  / |       |
      |      |
    /       |
  /         |
             |
             |
==============’’’]

palabras = ’hormiga perro canario oso abeja caballo camello gato tigre mofeta cobra ’ + 
’chica coyote ojo cuervo mano perro mono pato cuervo coche pez zorro rana pastel ’ + 
’bizcocho tomate iguana chacal koala leche agua mago burro amigo miel gorila rata ’ + 
’boca mula red fuerza lechuza tren metro loro pigmeo python camino conejo charco ’ + 
’buitre rinoceronte ballena medusa cordero ternera estrella nube nariz vientre ’ + 
’piedra pantano cisne trucha avispa caballero verdad inglaterra tortuga tortilla ’ + 
’placton huesca vampiro normando vikingo cebra’.split()

def palabraAleatoria(listaPalabras):
    # Esta función devuelve una palabra aleatoria entre un conjunto de palabras.
    cual = random.randint(0, len(listaPalabras) - 1)
    return listaPalabras[cual]

def mostrarAhorcado(DIBUJOS, letrasMalas, letrasBuenas, palabraSecreta):
    print DIBUJOS[len(letrasMalas)]
    print
    print ’Errores:’,
    for letra in letrasMalas:
        print letra,
    print
    huecos = ’_’ * len(palabraSecreta)
    for i in range(len(palabraSecreta)): # reemplazar huecos con letras acertadas
        if palabraSecreta[i] in letrasBuenas:
            huecos = huecos[:i] + palabraSecreta[i] + huecos[i+1:]
    for letra in huecos: # mostrar palabra secreta con huecos entre letras
        print letra,
    print

def intento(yaIntentado):
    # Devuelve la letra intentada. Se asegura que se introduce una letra y no otra cosa.

    while True:
TECNOLOGÍA DE LA INFORMACIÓN           CURSO: 1 BACH
        print ’Intenta con una letra.’
        candidata = raw_input()
        candidata = candidata.lower()
        if len(candidata) != 1:
            print ’Por favor, introduce sólo una letra.’
        elif candidata in yaIntentado:
            print ’Ya has intentado esa letra. Elige otra.’
        elif candidata not in ’abcdefghijklmnñopqrstuvwxyz’:
            print ’Por favor, introduce una LETRA.’
        else:
            return candidata

def jugarOtraVez():
    # Esta función devuelve True si el jugador quiere jugar otra vez.
    print ’¿Quieres jugar otra vez? (s ó n)’
    return raw_input().lower().startswith(’s’)

print ’A H O R C A D O’

letrasFalladas = ’’
letrasAcertadas = ’’
palabraSecreta = palabraAleatoria(palabras)
juegoTerminado = False

while True:
    mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta)

    # Pedir al jugador que introduzca una letra.
    pruebaLetra = intento(letrasFalladas + letrasAcertadas)

    if pruebaLetra in palabraSecreta:
        letrasAcertadas = letrasAcertadas + pruebaLetra
        # Mirar si el jugador ha ganado
        encontradasTodas = True
        for i in range(len(palabraSecreta)):
            if palabraSecreta[i] not in letrasAcertadas:
                encontradasTodas = False
                break
        if encontradasTodas:
            print ’¡Sí! ¡La palabra secreta es "’ + palabraSecreta + ’"! ¡Has ganado!’
            juegoTerminado = True
    else:
        letrasFalladas = letrasFalladas + pruebaLetra
        # Mirar si son demasiados intentos y el jugador pierde
        if len(letrasFalladas) == len(DIBUJOS) - 1:
            mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta)
            print ’¡Demasiados intentos!nDespués de ’ + str(len(letrasFalladas)) + 
            ’ intentos fallidos y ’ + str(len(letrasAcertadas)) + 
            ’ intentos correctos, la palabra era "’ + palabraSecreta + ’"’
            juegoTerminado = True

    # Preguntar al jugador si quiere jugar otra vez (pero sólo si se ha terminado).
    if juegoTerminado:
        if jugarOtraVez():
            letrasFalladas = ’’
            letrasAcertadas = ’’
            juegoTerminado = False
            palabraSecreta = palabraAleatoria(palabras)
        else:
            break


Como viene siendo habitual, una vez que compruebes que funciona, modifica el programa
y mejóralo (incluso puedes cambiarlo por completo). Envía tu nuevo programa por correo
electrónico con el nombre de ahorcado.py junto con su diagrama de flujo y el resultado
de su ejecución. Pero...


                                       ¡¡Detente!!
TECNOLOGÍA DE LA INFORMACIÓN            CURSO: 1 BACH



La complejidad de este guión es mucho mayor, así que muy probablemente necesitarás
un poco de orientación para comprenderlo:



Comprendiendo el juego del Ahorcado

En este juego empleamos multitud de elementos del lenguaje Python. Es interesante que
analices el código con detenimiento antes de seguir. Responde para ello al siguiente
cuestionario; te ayudará a progresar como programador o programadora... Hazlo en un
documento de Google Docs (identifícalo con tu nick y Cuestinario Python Práctica 4) y
compártelo con tu profesor.




 1
En primer lugar, el código del juego está dividido en dos partes claramente diferenciadas.
La primera se encarga de realizar las definiciones necesarias y, en ella, Python no hace
nada en concreto, sólo toma nota de variables y definiciones.
Indica de qué tipo son los siguientes objetos y de qué se encargan:


• DIBUJOS
• palabras
• palabraAleatoria()
• mostrarAhorcado()
• intento()
• jugarOtraVez()




 2
La segunda parte es la acción de verdad y comienza después de todas las definiciones de
las funciones. El código implicado es, fundamentalmente, el siguiente:
TECNOLOGÍA DE LA INFORMACIÓN           CURSO: 1 BACH
....

print ’A H O R C A D O’

letrasFalladas = ’’
letrasAcertadas = ’’
palabraSecreta = palabraAleatoria(palabras)
juegoTerminado = False

while True:
    ...


¿Para qué sirve cada una de esas cuatro variables que se definen? Por cierto, la
condición del bucle while es siempre verdadera. ¿Cómo se las arregla entonces el
juego para terminar?




 3
Explica cómo trabaja (es decir, qué argumentos toma, qué hace con ellos y qué de-
vuelve) la función palabraAleatoria().


def palabraAleatoria(listaPalabras):
    # Esta función devuelve una palabra aleatoria entre un conjunto de palabras.
    cual = random.randint(0, len(listaPalabras) - 1)
    return listaPalabras[cual]


Sugerencia: Observa cada linea, pregúntate y apúntate qué hace cada instrucción y para
qué. Una vez que comprendas todas las líneas del cuerpo de la función, será fácil com-
prender el conjunto. Puedes incluso hacerte un mini-diagrama de flujo para ayudarte.
Hazte preguntas, al mismo tiempo, del estilo de ¿qué tipo de dato es listaPalabras? ¿qué
hace len()?...




 4

Explica, de la misma forma, cómo trabaja la función mostrarAhorcado().
TECNOLOGÍA DE LA INFORMACIÓN           CURSO: 1 BACH
def mostrarAhorcado(DIBUJOS, letrasMalas, letrasBuenas, palabraSecreta):
    print DIBUJOS[len(letrasMalas)]
    print
    print ’Errores:’,
    for letra in letrasMalas:
        print letra,
    print
    huecos = ’_’ * len(palabraSecreta)
    for i in range(len(palabraSecreta)): # reemplazar huecos con letras acertadas
        if palabraSecreta[i] in letrasBuenas:
            huecos = huecos[:i] + palabraSecreta[i] + huecos[i+1:]
    for letra in huecos: # mostrar palabra secreta con huecos entre letras
        print letra,
    print




 5

Y, análogamente, ¿cómo trabaja la función intento()?


def intento(yaIntentado):
    # Devuelve la letra intentada. Se asegura que se introduce una letra y no otra cosa.

    while True:
        print ’Intenta con una letra.’
        candidata = raw_input()
        candidata = candidata.lower()
        if len(candidata) != 1:
            print ’Por favor, introduce sólo una letra.’
        elif candidata in yaIntentado:
            print ’Ya has intentado esa letra. Elige otra.’
        elif candidata not in ’abcdefghijklmnñopqrstuvwxyz’:
            print ’Por favor, introduce una LETRA.’
        else:
            return candidata




 6
Para acabar con las funciones, explica la última, jugarOtraVez().


def jugarOtraVez():
    # Esta función devuelve True si el jugador quiere jugar otra vez.
    print ’¿Quieres jugar otra vez? (s ó n)’
    return raw_input().lower().startswith(’s’)
TECNOLOGÍA DE LA INFORMACIÓN            CURSO: 1 BACH




  7
Fijémonos ahora en el bucle while, que se encarga del ensamblar todas las partes y hacer
que el juego funcione:


while True:
    mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta)

    # Pedir al jugador que introduzca una letra.
    pruebaLetra = intento(letrasFalladas + letrasAcertadas)

    if pruebaLetra in palabraSecreta:
        letrasAcertadas = letrasAcertadas + pruebaLetra
        # Mirar si el jugador ha ganado
        encontradasTodas = True
        for i in range(len(palabraSecreta)):
            if palabraSecreta[i] not in letrasAcertadas:
                encontradasTodas = False
                break
        if encontradasTodas:
            print ’¡Sí! ¡La palabra secreta es "’ + palabraSecreta + ’"! ¡Has ganado!’
            juegoTerminado = True
    else:
        letrasFalladas = letrasFalladas + pruebaLetra
        # Mirar si son demasiados intentos y el jugador pierde
        if len(letrasFalladas) == len(DIBUJOS) - 1:
            mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta)
            print ’¡Demasiados intentos!nDespués de ’ + str(len(letrasFalladas)) + 
            ’ intentos fallidos y ’ + str(len(letrasAcertadas)) + 
            ’ intentos correctos, la palabra era "’ + palabraSecreta + ’"’
            juegoTerminado = True

    # Preguntar al jugador si quiere jugar otra vez (pero sólo si se ha terminado).
    if juegoTerminado:
        if jugarOtraVez():
            letrasFalladas = ’’
            letrasAcertadas = ’’
            juegoTerminado = False
            palabraSecreta = palabraAleatoria(palabras)
        else:
            break




El bucle realiza tareas que pueden dividirse en cuatro partes. Escribe el código de cada
una de ellas y explica cómo funciona (desglosando cada una de sus líneas):


• Dibujar el ahorcado
• Pedir al jugador que introduzca una letra
• Mirar si esa letra es correcta o no
• Comprobar si el juego ha de finalizarse
TECNOLOGÍA DE LA INFORMACIÓN           CURSO: 1 BACH




                                   Recapitulación

Independientemente del cuestionario anterior y como hemos hecho en cada práctica, aquí
tienes un listado de algunas de las nuevas características de Python que han aparecido o
están relacionadas:


• ¿Qué diferencias hay entre las listas y las tuplas? ¿Para qué sirven?
• ¿De qué formas pueden extraerse los elementos de las listas y las tuplas?
• ¿Qué son los diccionarios en Python? ¿Cómo se usan?
• Las funciones split() y len().
• ¿Qué son los métodos? ¿Qué diferencia hay con las funciones?
• ¿Qué son los atributos? ¿Qué diferencia hay entre una clase y un objeto?
• Otras operaciones con cadenas de texto. ¿Funcionan, también, como listas?
• El bloque for . ¿Qué son los iterables?
• ¿Qué son los argumentos o parámetros de una función?
• ¿Para qué sirve el else en un if ? ¿Cuál es su forma general?
• El operador in ¿dónde puede usarse? ¿Qué otros tipos de operadores conoces?


     Documéntate y pregunta todo lo que necesites... ¡No te quedes con dudas!

Más contenido relacionado

PDF
Python básico II
PDF
Python (práctica 2)
PDF
Python (práctica 3)
PDF
Python (ejercicios)
PDF
Python (práctica 1)
PDF
Python básico I
PDF
Programación de Videojuegos con Python y Pilas (III)
PDF
Programación de Videojuegos con Python y Pilas (II)
Python básico II
Python (práctica 2)
Python (práctica 3)
Python (ejercicios)
Python (práctica 1)
Python básico I
Programación de Videojuegos con Python y Pilas (III)
Programación de Videojuegos con Python y Pilas (II)

La actualidad más candente (20)

PDF
Programación de Videojuegos con Python y Pilas (I)
ODP
Python básico
PDF
Semana 3 Fundamentos de Python(Funciones y Métodos)
PPT
Operaciones entre cadenas y valores numéricos en lenguaje C
PDF
03 - Entrada y salida en lenguaje C
PPT
Entrada y salida de datos en c
ODP
ITSCH Taller Python by Uriel C.H.
PPT
Python02
ODP
Introducción a Python
PPT
Python04
PPTX
Programación en c++
PDF
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
PDF
Ejercicios de programacion if - switch-case
PPTX
Conceptos básicos de un lenguaje de programación
PDF
ODP
Introduccion a Python por Facundo Batista
PDF
Guía de Python
PDF
Qué es un algoritmo
PDF
Generacion codigomaquina
Programación de Videojuegos con Python y Pilas (I)
Python básico
Semana 3 Fundamentos de Python(Funciones y Métodos)
Operaciones entre cadenas y valores numéricos en lenguaje C
03 - Entrada y salida en lenguaje C
Entrada y salida de datos en c
ITSCH Taller Python by Uriel C.H.
Python02
Introducción a Python
Python04
Programación en c++
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Ejercicios de programacion if - switch-case
Conceptos básicos de un lenguaje de programación
Introduccion a Python por Facundo Batista
Guía de Python
Qué es un algoritmo
Generacion codigomaquina
Publicidad

Destacado (9)

PDF
Taller de Pilas Engine, un motor de juegos en Python - PyConES 2014
PDF
Programación de Videojuegos con Python y Pilas (IX)
PDF
Programación de Videojuegos con Python y Pilas (X)
PDF
Programación de Videojuegos con Python y Pilas (VII)
PDF
Programación de Videojuegos con Python y Pilas (VIII)
PDF
Programación de Videojuegos con Python y Pilas (V)
PDF
(Sin anotaciones) - En busca de la Física
PDF
Iniciación a python
PDF
Programación de Videojuegos con Python y Pilas (VI)
Taller de Pilas Engine, un motor de juegos en Python - PyConES 2014
Programación de Videojuegos con Python y Pilas (IX)
Programación de Videojuegos con Python y Pilas (X)
Programación de Videojuegos con Python y Pilas (VII)
Programación de Videojuegos con Python y Pilas (VIII)
Programación de Videojuegos con Python y Pilas (V)
(Sin anotaciones) - En busca de la Física
Iniciación a python
Programación de Videojuegos con Python y Pilas (VI)
Publicidad

Similar a Python (práctica 4) (20)

PPTX
Python_Slides.pptx
PPTX
IntroducciónPHP.pptx
ODP
01 el lenguaje Python
PDF
Ejercicios Python - con soluciones.pdf
DOCX
Hacer un programa que lea un año y que el mismo determine si el año es bisiesto
PDF
Ruby
PPTX
Python boloñesa
PPTX
Ejercicios con Python parte 3
KEY
Ruby Latin Developer20012010
PPTX
Fundamentos de programación 1. diseño de algoritmos
PPT
Python05
PPT
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
PPT
Tipos basicos
PDF
Taller listasyeasygui
PDF
Idiomatic Ruby
PPSX
if-while-for.ppsx
PPT
Python Tercera Sesion de Clases
PDF
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
PDF
curso_programacion_python3.pdf
Python_Slides.pptx
IntroducciónPHP.pptx
01 el lenguaje Python
Ejercicios Python - con soluciones.pdf
Hacer un programa que lea un año y que el mismo determine si el año es bisiesto
Ruby
Python boloñesa
Ejercicios con Python parte 3
Ruby Latin Developer20012010
Fundamentos de programación 1. diseño de algoritmos
Python05
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Tipos basicos
Taller listasyeasygui
Idiomatic Ruby
if-while-for.ppsx
Python Tercera Sesion de Clases
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
curso_programacion_python3.pdf

Más de Fernando Salamero (12)

PDF
En la orilla del océano cósmico. Siglo XX.
PDF
El tejido del cosmos. Ciclo Estival de Astronomía.
PDF
Astronomía y Matemáticas para Principiantes .pdf
PDF
Ciencia y Revolución .Pensando las revoluciones.
PDF
Gravedad y Ondas Gravitacionales - Fernando Salamero
PDF
(Anotaciones) Ciencia (Cuestiones) que la tiza no propone
PDF
Ciencia (Cuestiones) que la tiza no propone
PDF
(Con anotaciones) En busca de la Física
PDF
Timeline - En busca de la Física
PDF
Jovenes físicos
PDF
Programación con Pygame VII
PDF
Programación con Pygame IX
En la orilla del océano cósmico. Siglo XX.
El tejido del cosmos. Ciclo Estival de Astronomía.
Astronomía y Matemáticas para Principiantes .pdf
Ciencia y Revolución .Pensando las revoluciones.
Gravedad y Ondas Gravitacionales - Fernando Salamero
(Anotaciones) Ciencia (Cuestiones) que la tiza no propone
Ciencia (Cuestiones) que la tiza no propone
(Con anotaciones) En busca de la Física
Timeline - En busca de la Física
Jovenes físicos
Programación con Pygame VII
Programación con Pygame IX

Último (20)

PDF
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
DOCX
V UNIDAD - PRIMER GRADO. del mes de agosto
PPTX
Presentación de la Cetoacidosis diabetica.pptx
PDF
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
PDF
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
PDF
5°-UNIDAD 5 - 2025.pdf aprendizaje 5tooo
PDF
La Evaluacion Formativa en Nuevos Escenarios de Aprendizaje UGEL03 Ccesa007.pdf
PDF
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
DOCX
2 GRADO UNIDAD 5 - 2025.docx para primaria
PDF
COMUNICACION EFECTIVA PARA LA EDUCACION .pdf
PDF
Tomo 1 de biologia gratis ultra plusenmas
PDF
CONFERENCIA-Deep Research en el aula universitaria-UPeU-EduTech360.pdf
PDF
biología es un libro sobre casi todo el tema de biología
PDF
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
PPTX
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
DOCX
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
PDF
Didactica de la Investigacion Educativa SUE Ccesa007.pdf
PPTX
Doctrina 1 Soteriologuia y sus diferente
PDF
Romper el Circulo de la Creatividad - Colleen Hoover Ccesa007.pdf
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
V UNIDAD - PRIMER GRADO. del mes de agosto
Presentación de la Cetoacidosis diabetica.pptx
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
5°-UNIDAD 5 - 2025.pdf aprendizaje 5tooo
La Evaluacion Formativa en Nuevos Escenarios de Aprendizaje UGEL03 Ccesa007.pdf
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
2 GRADO UNIDAD 5 - 2025.docx para primaria
COMUNICACION EFECTIVA PARA LA EDUCACION .pdf
Tomo 1 de biologia gratis ultra plusenmas
CONFERENCIA-Deep Research en el aula universitaria-UPeU-EduTech360.pdf
biología es un libro sobre casi todo el tema de biología
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
Didactica de la Investigacion Educativa SUE Ccesa007.pdf
Doctrina 1 Soteriologuia y sus diferente
Romper el Circulo de la Creatividad - Colleen Hoover Ccesa007.pdf

Python (práctica 4)

  • 1. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH Python (Práctica 4) Objetivo Se trata de abordar un programa algo más serio, en el que las entradas del usuario in- fluyen en el curso de la ejecución. Se usan, también, procedimientos de manipulación de cadenas de texto. Programa 6: Ahorcado La cosa se complica. El siguiente es el clásico juego del ahorcado. Pero fíjate que un buen programador debe escribir su código de forma que sea ampliable en el futuro. De ahí el uso intensivo de las funciones. # -*- coding: utf-8 -*- import random DIBUJOS = [’’’ +------+ | | | | | | | | | | | | ==============’’’, ’’’ +------+ | | | | O | | | | | | | | ==============’’’, ’’’ +------+ | | | | O | | | | | | | | | ==============’’’, ’’’ +------+ | | | | O | /| | / | | | | |
  • 2. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH | | | ==============’’’, ’’’ +------+ | | | | O | /| | / | | | | | | | | ==============’’’, ’’’ +------+ | | | | O | /| | / | | | | / | / | | | ==============’’’, ’’’ +------+ | | | | O | /| | / | | | | / | / | | | ==============’’’] palabras = ’hormiga perro canario oso abeja caballo camello gato tigre mofeta cobra ’ + ’chica coyote ojo cuervo mano perro mono pato cuervo coche pez zorro rana pastel ’ + ’bizcocho tomate iguana chacal koala leche agua mago burro amigo miel gorila rata ’ + ’boca mula red fuerza lechuza tren metro loro pigmeo python camino conejo charco ’ + ’buitre rinoceronte ballena medusa cordero ternera estrella nube nariz vientre ’ + ’piedra pantano cisne trucha avispa caballero verdad inglaterra tortuga tortilla ’ + ’placton huesca vampiro normando vikingo cebra’.split() def palabraAleatoria(listaPalabras): # Esta función devuelve una palabra aleatoria entre un conjunto de palabras. cual = random.randint(0, len(listaPalabras) - 1) return listaPalabras[cual] def mostrarAhorcado(DIBUJOS, letrasMalas, letrasBuenas, palabraSecreta): print DIBUJOS[len(letrasMalas)] print print ’Errores:’, for letra in letrasMalas: print letra, print huecos = ’_’ * len(palabraSecreta) for i in range(len(palabraSecreta)): # reemplazar huecos con letras acertadas if palabraSecreta[i] in letrasBuenas: huecos = huecos[:i] + palabraSecreta[i] + huecos[i+1:] for letra in huecos: # mostrar palabra secreta con huecos entre letras print letra, print def intento(yaIntentado): # Devuelve la letra intentada. Se asegura que se introduce una letra y no otra cosa. while True:
  • 3. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH print ’Intenta con una letra.’ candidata = raw_input() candidata = candidata.lower() if len(candidata) != 1: print ’Por favor, introduce sólo una letra.’ elif candidata in yaIntentado: print ’Ya has intentado esa letra. Elige otra.’ elif candidata not in ’abcdefghijklmnñopqrstuvwxyz’: print ’Por favor, introduce una LETRA.’ else: return candidata def jugarOtraVez(): # Esta función devuelve True si el jugador quiere jugar otra vez. print ’¿Quieres jugar otra vez? (s ó n)’ return raw_input().lower().startswith(’s’) print ’A H O R C A D O’ letrasFalladas = ’’ letrasAcertadas = ’’ palabraSecreta = palabraAleatoria(palabras) juegoTerminado = False while True: mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta) # Pedir al jugador que introduzca una letra. pruebaLetra = intento(letrasFalladas + letrasAcertadas) if pruebaLetra in palabraSecreta: letrasAcertadas = letrasAcertadas + pruebaLetra # Mirar si el jugador ha ganado encontradasTodas = True for i in range(len(palabraSecreta)): if palabraSecreta[i] not in letrasAcertadas: encontradasTodas = False break if encontradasTodas: print ’¡Sí! ¡La palabra secreta es "’ + palabraSecreta + ’"! ¡Has ganado!’ juegoTerminado = True else: letrasFalladas = letrasFalladas + pruebaLetra # Mirar si son demasiados intentos y el jugador pierde if len(letrasFalladas) == len(DIBUJOS) - 1: mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta) print ’¡Demasiados intentos!nDespués de ’ + str(len(letrasFalladas)) + ’ intentos fallidos y ’ + str(len(letrasAcertadas)) + ’ intentos correctos, la palabra era "’ + palabraSecreta + ’"’ juegoTerminado = True # Preguntar al jugador si quiere jugar otra vez (pero sólo si se ha terminado). if juegoTerminado: if jugarOtraVez(): letrasFalladas = ’’ letrasAcertadas = ’’ juegoTerminado = False palabraSecreta = palabraAleatoria(palabras) else: break Como viene siendo habitual, una vez que compruebes que funciona, modifica el programa y mejóralo (incluso puedes cambiarlo por completo). Envía tu nuevo programa por correo electrónico con el nombre de ahorcado.py junto con su diagrama de flujo y el resultado de su ejecución. Pero... ¡¡Detente!!
  • 4. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH La complejidad de este guión es mucho mayor, así que muy probablemente necesitarás un poco de orientación para comprenderlo: Comprendiendo el juego del Ahorcado En este juego empleamos multitud de elementos del lenguaje Python. Es interesante que analices el código con detenimiento antes de seguir. Responde para ello al siguiente cuestionario; te ayudará a progresar como programador o programadora... Hazlo en un documento de Google Docs (identifícalo con tu nick y Cuestinario Python Práctica 4) y compártelo con tu profesor. 1 En primer lugar, el código del juego está dividido en dos partes claramente diferenciadas. La primera se encarga de realizar las definiciones necesarias y, en ella, Python no hace nada en concreto, sólo toma nota de variables y definiciones. Indica de qué tipo son los siguientes objetos y de qué se encargan: • DIBUJOS • palabras • palabraAleatoria() • mostrarAhorcado() • intento() • jugarOtraVez() 2 La segunda parte es la acción de verdad y comienza después de todas las definiciones de las funciones. El código implicado es, fundamentalmente, el siguiente:
  • 5. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH .... print ’A H O R C A D O’ letrasFalladas = ’’ letrasAcertadas = ’’ palabraSecreta = palabraAleatoria(palabras) juegoTerminado = False while True: ... ¿Para qué sirve cada una de esas cuatro variables que se definen? Por cierto, la condición del bucle while es siempre verdadera. ¿Cómo se las arregla entonces el juego para terminar? 3 Explica cómo trabaja (es decir, qué argumentos toma, qué hace con ellos y qué de- vuelve) la función palabraAleatoria(). def palabraAleatoria(listaPalabras): # Esta función devuelve una palabra aleatoria entre un conjunto de palabras. cual = random.randint(0, len(listaPalabras) - 1) return listaPalabras[cual] Sugerencia: Observa cada linea, pregúntate y apúntate qué hace cada instrucción y para qué. Una vez que comprendas todas las líneas del cuerpo de la función, será fácil com- prender el conjunto. Puedes incluso hacerte un mini-diagrama de flujo para ayudarte. Hazte preguntas, al mismo tiempo, del estilo de ¿qué tipo de dato es listaPalabras? ¿qué hace len()?... 4 Explica, de la misma forma, cómo trabaja la función mostrarAhorcado().
  • 6. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH def mostrarAhorcado(DIBUJOS, letrasMalas, letrasBuenas, palabraSecreta): print DIBUJOS[len(letrasMalas)] print print ’Errores:’, for letra in letrasMalas: print letra, print huecos = ’_’ * len(palabraSecreta) for i in range(len(palabraSecreta)): # reemplazar huecos con letras acertadas if palabraSecreta[i] in letrasBuenas: huecos = huecos[:i] + palabraSecreta[i] + huecos[i+1:] for letra in huecos: # mostrar palabra secreta con huecos entre letras print letra, print 5 Y, análogamente, ¿cómo trabaja la función intento()? def intento(yaIntentado): # Devuelve la letra intentada. Se asegura que se introduce una letra y no otra cosa. while True: print ’Intenta con una letra.’ candidata = raw_input() candidata = candidata.lower() if len(candidata) != 1: print ’Por favor, introduce sólo una letra.’ elif candidata in yaIntentado: print ’Ya has intentado esa letra. Elige otra.’ elif candidata not in ’abcdefghijklmnñopqrstuvwxyz’: print ’Por favor, introduce una LETRA.’ else: return candidata 6 Para acabar con las funciones, explica la última, jugarOtraVez(). def jugarOtraVez(): # Esta función devuelve True si el jugador quiere jugar otra vez. print ’¿Quieres jugar otra vez? (s ó n)’ return raw_input().lower().startswith(’s’)
  • 7. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH 7 Fijémonos ahora en el bucle while, que se encarga del ensamblar todas las partes y hacer que el juego funcione: while True: mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta) # Pedir al jugador que introduzca una letra. pruebaLetra = intento(letrasFalladas + letrasAcertadas) if pruebaLetra in palabraSecreta: letrasAcertadas = letrasAcertadas + pruebaLetra # Mirar si el jugador ha ganado encontradasTodas = True for i in range(len(palabraSecreta)): if palabraSecreta[i] not in letrasAcertadas: encontradasTodas = False break if encontradasTodas: print ’¡Sí! ¡La palabra secreta es "’ + palabraSecreta + ’"! ¡Has ganado!’ juegoTerminado = True else: letrasFalladas = letrasFalladas + pruebaLetra # Mirar si son demasiados intentos y el jugador pierde if len(letrasFalladas) == len(DIBUJOS) - 1: mostrarAhorcado(DIBUJOS, letrasFalladas, letrasAcertadas, palabraSecreta) print ’¡Demasiados intentos!nDespués de ’ + str(len(letrasFalladas)) + ’ intentos fallidos y ’ + str(len(letrasAcertadas)) + ’ intentos correctos, la palabra era "’ + palabraSecreta + ’"’ juegoTerminado = True # Preguntar al jugador si quiere jugar otra vez (pero sólo si se ha terminado). if juegoTerminado: if jugarOtraVez(): letrasFalladas = ’’ letrasAcertadas = ’’ juegoTerminado = False palabraSecreta = palabraAleatoria(palabras) else: break El bucle realiza tareas que pueden dividirse en cuatro partes. Escribe el código de cada una de ellas y explica cómo funciona (desglosando cada una de sus líneas): • Dibujar el ahorcado • Pedir al jugador que introduzca una letra • Mirar si esa letra es correcta o no • Comprobar si el juego ha de finalizarse
  • 8. TECNOLOGÍA DE LA INFORMACIÓN CURSO: 1 BACH Recapitulación Independientemente del cuestionario anterior y como hemos hecho en cada práctica, aquí tienes un listado de algunas de las nuevas características de Python que han aparecido o están relacionadas: • ¿Qué diferencias hay entre las listas y las tuplas? ¿Para qué sirven? • ¿De qué formas pueden extraerse los elementos de las listas y las tuplas? • ¿Qué son los diccionarios en Python? ¿Cómo se usan? • Las funciones split() y len(). • ¿Qué son los métodos? ¿Qué diferencia hay con las funciones? • ¿Qué son los atributos? ¿Qué diferencia hay entre una clase y un objeto? • Otras operaciones con cadenas de texto. ¿Funcionan, también, como listas? • El bloque for . ¿Qué son los iterables? • ¿Qué son los argumentos o parámetros de una función? • ¿Para qué sirve el else en un if ? ¿Cuál es su forma general? • El operador in ¿dónde puede usarse? ¿Qué otros tipos de operadores conoces? Documéntate y pregunta todo lo que necesites... ¡No te quedes con dudas!