domingo, 6 de dezembro de 2009

Problema 8.9

No jogo do Enforcado existe um conceito importante que é o conceito de estado, conceito esse que traduz a situação do jogo num dado momento. Jogar significa provocar uma mudança de estado. Um outro aspecto neste jogo é o da comunicação entre o programa e o utilizador. Para que essa comunicação seja efectiva deve ser implementado um bom interface entre ambos. É o que vamos mostrar usando precisamente a noção de estado. Isso vai-nos levar a alterar o programa hang87(), mostrando que a nossa análise inicial não foi a melhor. Concentrar tudo no estado vai ser benéfico, permitindo mais tarde alterar o programa de modo mais fácil, caso a especificação seja alterada.


Para já decidimos incluir no estado a palavra que o utilizador está a construir, as letras já tentadas e o número de tentativas de que ainda dispõe. Não é difícil aceitar que a melhor estrutura para guardar esta informação será um dicionário. As operações sobre o estado serão as operações de consulta e de alteração de componentes. Apresentamos a nova versão de hang87.
01.def hang89():
02.    # inicialização
03.    # --- palavra secreta
04.    palavras = open('/tempo/data/palavras.txt').read().split()
05.    secreta = list(random.choice(palavras))
06.    dicio = seq_to_dict(secreta)
07.    # --- parâmetros
08.    TAMANHO = len(secreta)
09.    LIMITE = limite(TAMANHO)
10. 
11.    estado = {'palavra':list('_'* TAMANHO),'usadas':[],'tentativas':LIMITE}
12.    acertou = False
13.    # Entra no jogo
14.    for tentativa in range(LIMITE):
15.        # estado actual
16.        mostra_estado(estado)
17.        # joga
18.        letra = adivinha(estado['usadas'])
19.        # analisa resposta
20.        if letra in dicio:
21.            # --- Acertou na letra!
22.            indices = dicio[letra]
23.            for ind in indices:
24.                estado['palavra'][ind] = letra
25.            # --- Acertou na palavra??
26.            if fim(secreta,estado['palavra']):
27.                acertou = True
28.                mensagem_sim(secreta)
29.                break
30.        # actualiza estado
31.        estado['usadas'] = estado['usadas'] + [letra]
32.        estado['tentativas'] = estado['tentativas'] - 1
33.    # mensagem final
34.    mensagem_fim(acertou,secreta)

Sem comentários:

Enviar um comentário