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.

def fich_to_dict(ficheiro):
"""Transforma os dados de um ficheiro para um dicionário."""
linhas = ficheiro.readlines()
dicio = {}
for linha in linhas:
nome,jogos,vitorias = linha.split()
dicio.update({nome:[int(jogos),int(vitorias)]})
return dicio

def dict_to_fich(dicio, ficheiro):
"""Transforma os dados de um dicionário para um ficheiro."""
f_out= open(ficheiro,'w')
for chave,valor in dicio.items():
linha = chave + '\t\t' + str(dicio[chave][0]) + '\t' + str(dicio[chave][1]) + '\n'
f_out.write(linha)
f_out.close()
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.

def hang810a(fich_dados):
# Mensagem inicial
print 'Bem Vindo ao Jogo do Enforcado!!!'
print 'Vamos jogar!'
# recupera informação estatística
f_in = open(fich_dados,'r')
dicio_jogadores = fich_to_dict(f_in)
f_in.close()
# identificação do jogador
nome = raw_input('O seu nome por favor: ')
if nome in dicio_jogadores:
print 'Olá de novo!'
print 'O seu desempenho actual é:'
print 'Jogos efectuados: %d \nVitórias: %d' % (dicio_jogadores[nome][0], dicio_jogadores[nome][1])
else:
print 'Bem Vindo pela primeira vez!'
dicio_jogadores[nome]=[0,0]

# jogar
jogar = True
while jogar:
hang810(nome,dicio_jogadores)
jogar = continuar(jogar,dicio_jogadores, fich_dados)


def continuar(jogar,dicio_jogadores,fich_dados):
# Jogar mais??
mais = raw_input('mais? [S/N]: ')
while mais not in ['S','N', 's','n','sim','não']:
mais = raw_input('A resposta tem que ser [S/N]. A sua resposta: ')
if mais in ['N','n','não']:
# Actualiza estatística
dict_to_fich(dicio_jogadores,fich_dados)
print 'Adeus, até à vista...'
jogar = False
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.


def hang810(nome,dicio_jogadores):

# --- palavra secreta
palavras = open('/tempo/data/palavras.txt','r').read().split()
secreta = list(random.choice(palavras))
dicio = seq_to_dict(secreta)

# --- parâmetros
tentativas = len(secreta)
acertou = False
estado = cria_estado(list('_'* len(secreta)), [],tentativas)

# Começa o jogo
for tentativa in range(tentativas):
# Estado actual
mostra_estado(estado)
# joga
letra = adivinha(estado)
# analisa resposta
if letra in dicio:
# --- Acertou na letra!
indices = dicio[letra]
pal_utilizador = get_palavra(estado)
for ind in indices:
pal_utilizador[ind] = letra
estado= set_palavra(estado,pal_utilizador)
# --- Acertou na palavra??
if fim(secreta,pal_utilizador):
acertou = True
mensagem_sim(secreta)
break
# Actualiza estado
estado = actualiza_estado(estado, estado['palavra'],letra, get_tentativas(estado) - 1)
# actualiza estatística
dicio_jogadores[nome][0] = dicio_jogadores[nome][0] + 1
if acertou:
dicio_jogadores[nome][1] = dicio_jogadores[nome][1] + 1
# mensagem final
mensagem_fim(acertou,secreta)

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

Sem comentários:

Enviar um comentário