sábado, 28 de novembro de 2009

Problema 8.7

Vamos apresentar uma solução básica para esta questão ... básica. O leitor é chamado a estudar o resultado e tentar entender como, e porque, funciona. Ter feito os problemas 8.1 a 8.7 ajuda! O mais importante a reter é que usamos diferentes representações internas (o que é manipulado no interior pelo programa) e externas (o que é visualizado no écran). Refira-se ainda que a palavra secreta é guardada na forma de um dicionário, onde as chaves são os caracteres e os valores os índices na cadeia onde esses caracteres ocorrem. É usada para alterar de modo expedito o estado da palavra que o utilizador vai construindo.

01.import random
02. 
03.def hang87():
04.    # inicialização
05.    # --- palavra secreta
06.    palavras = open('/tempo/data/palavras.txt').read().split()
07.    secreta = list(random.choice(palavras))
08.    dicio = seq_to_dict(secreta)
09.    # --- parâmetros
10.    TAMANHO = len(secreta)
11.    LIMITE = limite(TAMANHO)
12. 
13.    pal_utilizador = list('_'* TAMANHO)
14.    acertou = False
15.    letras_usadas = []
16.     
17.    # Entra no jogo
18.    for tentativa in range(LIMITE):
19.        # estado actual
20.        mostra_palavra(pal_utilizador)
21.        # joga
22.        letra = adivinha(letras_usadas)
23.        # analisa resposta
24.        if letra in dicio:
25.            # --- Acertou na letra!
26.            indices = dicio[letra]
27.            for ind in indices:
28.                pal_utilizador[ind] = letra
29.            # --- Acertou na palavra??
30.            if fim(secreta,pal_utilizador):
31.                acertou = True
32.                mensagem_sim(secreta)
33.                break
34.        # actualiza estado
35.        letras_usadas.append(letra)
36.    # mensagem final
37.    mensagem_fim(acertou,secreta)
38.     
39.         
40. 
41.# Auxiliares
42. 
43.def adivinha(letras_usadas):
44.    """Tenta mais uma letra."""
45.    letra = raw_input('Escolha uma letra: ')
46.    # verifica letra - ciclo
47.    while letra in letras_usadas:
48.        print
49.        print '*** Letra já usada. Escolha outra sff!***'
50.        print
51.        letra = raw_input('Escolha uma letra: ')
52.    return letra
53.     
54.def limite(tam_palavra):
55.    """ para mais tarde se poder generalizar..."""
56.    return tam_palavra
57. 
58.def mensagem_sim(secreta):
59.    print
60.    print 'Uau! Acertou!'
61.    mostra_palavra(secreta)
62.    print
63.     
64.def mensagem_fim(acertou,secreta):
65.    if not acertou:
66.        print 'Oops! Esgotaram-se as suas hipóteses...'
67.        print 'A palavra secreta era: '
68.        mostra_palavra(secreta)
69.        print 'See you!'
70. 
71.def mostra_palavra(palavra):
72.    """ mostra uma plavra formada por caracteres guardados numa lista."""
73.    pal = ' '.join(palavra)
74.    print 'Palavra:'
75.    print pal
76.    print
77. 
78.def fim(secreta, utilizador):
79.    return secreta == utilizador
80. 
81. 
82.# --- Importante       
83.def seq_to_dict(palavra):
84.    """
85.    Transforma uma palavra num dicionário de chave os caracteres e
86.    valores a lista dos índices.
87.    """
88.    dicio = {}
89.    for indice,letra in enumerate(palavra):
90.        dicio[letra] = dicio.get(letra,[])+[indice]
91.    return dicio
92. 
93.if __name__ == '__main__':
94.    hang87()

Sem comentários:

Enviar um comentário