segunda-feira, 7 de dezembro de 2009

Problema 8.10

É-nos pedido uma alteração ao programa de base (problema 8.7), por forma a ser possível ter informação estatística. Vamos discutir o princípio, e não vamos estar preocupados com definir informação detalhada do jogador e seu desempenho. Assim ,o que vamos querer sobretudo é que a informação sobreviva, mesmo depois de o jogador ter terminado de jogar. Isso significa ter a informação armazenada externamente, logo significa usar ficheiros. No entanto, pode ser conveniente internamente ao programa usar outra organização. Como vamos ter vários jogadores, cada um deles com informação estatística associada, o uso de dicionários surge como a forma mais natural de guardar a informação. Para tudo isto ser possível teremos que definir duas operações de interface: uma que converte do ficheiro para o dicionário e, uma segunda, que faz o inverso (nota para o programador savvy: também pode usar o módulo pickle e, neste caso não é preciso preocupar-se com as conversões!). São essas definições que apresentamos de seguida.
01.def fich_to_dict(ficheiro):
02.    """Transforma os dados de um ficheiro para um dicionário."""
03.    linhas = ficheiro.readlines()
04.    dicio = {}
05.    for linha in linhas:
06.        nome,jogos,vitorias = linha.split()
07.        dicio.update({nome:[int(jogos),int(vitorias)]})
08.    return dicio
09. 
10.def dict_to_fich(dicio, ficheiro):
11.    """Transforma os dados de um dicionário para um ficheiro."""
12.    f_out= open(ficheiro,'w')
13.    for chave,valor in dicio.items():
14.        linha = chave + '\t\t' + str(dicio[chave][0]) + '\t' + str(dicio[chave][1]) + '\n'
15.        f_out.write(linha)
16.    f_out.close()
17.    return dicio   

Por outro lado, a parte inicial do programa também deve ser alterada, de modo a identificar o jogador e saber como actualizar os dados no final de cada jogo. Vejamos como.
01.def hang810a(fich_dados):
02.    # Mensagem inicial
03.    print 'Bem Vindo ao Jogo do Enforcado!!!'
04.    print 'Vamos jogar!'
05.    # recupera informação estatística
06.    f_in = open(fich_dados,'r')
07.    dicio_jogadores = fich_to_dict(f_in)
08.    f_in.close()
09.    # identificação do jogador
10.    nome = raw_input('O seu nome por favor: ')
11.    if nome in dicio_jogadores:
12.        print 'Olá de novo!'
13.        print 'O seu desempenho actual é:'
14.        print 'Jogos efectuados: %d \nVitórias: %d' % (dicio_jogadores[nome][0], dicio_jogadores[nome][1])
15.    else:
16.        print 'Bem Vindo pela primeira vez!'
17.        dicio_jogadores[nome]=[0,0]
18.         
19.    # jogar
20.    jogar = True
21.    while jogar:
22.        hang810(nome,dicio_jogadores)
23.        jogar = continuar(jogar,dicio_jogadores, fich_dados)
24.         
25.             
26.def continuar(jogar,dicio_jogadores,fich_dados):
27.    # Jogar mais??
28.    mais = raw_input('mais? [S/N]: ')
29.    while mais not in ['S','N', 's','n','sim','não']:
30.        mais = raw_input('A resposta tem que ser [S/N]. A sua  resposta: ')
31.    if mais in ['N','n','não']:
32.        # Actualiza estatística
33.        dict_to_fich(dicio_jogadores,fich_dados)
34.        print 'Adeus, até à vista...'
35.        jogar = False
36.    return jogar    

Como se pode ver o programa depois de fazer a inicialização necessária, chama o programa que efectivamente joga. Aqui tivemos que fazer as alterações que envolvem a actualização da parte estatística no final de cada jogo. Por outro lado, mantivemos a parte do programa que permite jogar mais do que uma vez.

01.def hang810(nome,dicio_jogadores):
02. 
03.    # --- palavra secreta
04.    palavras = open('/tempo/data/palavras.txt','r').read().split()
05.    secreta = list(random.choice(palavras))
06.    dicio = seq_to_dict(secreta)
07. 
08.    # --- parâmetros
09.    tentativas = len(secreta)
10.    acertou = False
11.    estado = cria_estado(list('_'* len(secreta)), [],tentativas)
12. 
13.    # Começa o jogo
14.    for tentativa in range(tentativas):
15.        # Estado actual
16.        mostra_estado(estado)
17.        # joga
18.        letra = adivinha(estado)
19.        # analisa resposta
20.        if letra in dicio:
21.            # --- Acertou na letra!
22.            indices = dicio[letra]
23.            pal_utilizador = get_palavra(estado)
24.            for ind in indices:
25.                pal_utilizador[ind] = letra
26.            estado= set_palavra(estado,pal_utilizador)
27.            # --- Acertou na palavra??
28.            if fim(secreta,pal_utilizador):
29.                acertou = True
30.                mensagem_sim(secreta)
31.                break
32.        # Actualiza estado
33.        estado = actualiza_estado(estado, estado['palavra'],letra, get_tentativas(estado) - 1)
34.    # actualiza estatística
35.    dicio_jogadores[nome][0] = dicio_jogadores[nome][0] + 1
36.    if acertou:
37.        dicio_jogadores[nome][1] = dicio_jogadores[nome][1] + 1
38.    # mensagem final
39.    mensagem_fim(acertou,secreta)

Falta apenas incluir as definições auxiliares introduzidas nas versões anteriores.

Sem comentários:

Enviar um comentário