def __init__(self): self.jogos = {} self.jogadores = {} self.sist_chat = SistemaChat() self.central = 'central' self.criar_jogo(self.central, None)
class SistemaPreJogo(): """Reúne e organiza os jogos""" def __init__(self): self.jogos = {} self.jogadores = {} self.sist_chat = SistemaChat() self.central = 'central' self.criar_jogo(self.central, None) def adi_msg(self, nome_jogo, nome_jogador, msg): """Adiciona 'msg' ao jogo 'nome_jogo' com autoria de 'nome_jogador' e retorna o número de mensagens nesse jogo""" return self.sist_chat.adi_msg(nome_jogo, nome_jogador, msg) def ret_msgs(self, nome_jogo): """Retorna mensagens do jogo 'nome_jogo'""" return self.sist_chat.ret_msgs(nome_jogo) def criar_jogo(self, nome_jogo, nome_jogador): """Cria um jogo 'nome_jogo' e adiciona o jogador 'nome_jogador'""" r = False # Caso jogo não exista if self.jogos.get(nome_jogo) == None: s = Jogo(nome_jogo, self.sist_chat) self.jogos[nome_jogo] = s r = True # Caso deve colocar um jogador dentro da sala if nome_jogador: r = self.colocar_jogador_jogo(nome_jogo, nome_jogador) return r def ret_jogo(self, nome_jogo): """Retorna o jogo de nome 'nome_jogo'""" return self.jogos.get(nome_jogo) def ret_jogos(self): """Retorna os jogos abertos""" r = [] for s in self.jogos.values(): if s.nome != 'central': r.append(s) return r def colocar_jogador_jogo(self, nome_jogo, nome_jogador): """Coloca um jogador em uma determinada sala""" if not nome_jogo: self.jogadores[nome_jogador] = None return True s = self.jogos.get(nome_jogo) # Verifica se a sala existe if not s: return False return "ERRO: Sala nao existe!" # Verifica se jogo tem espaço para mais um jogador if len(s.ret_jogadores())+1 > s.max_num_jogadores: return False return "ERRO: Sala cheia!" j = self.jogadores.get(nome_jogador) # Caso jogador ainda não exista if not j: j = Jogador(nome_jogador, s) self.jogadores[nome_jogador] = j s.adi_jogador(j) elif j.jogo and j.jogo != s: self.rem_jogador(j.jogo.nome, j) s.adi_jogador(j) j.trocar_jogo(s) j.pronto = False return True def rem_jogador(self, nome_jogo, nome_jogador): """Remove um jogador de uma sala""" s = self.jogos.get(nome_jogo) if s: s.rem_jogador(nome_jogador) if s.vazio() and nome_jogo != self.central: self.fechar_jogo(nome_jogo) def ret_jogador(self, nome): """Retorna uma jogador pelo nome""" return self.jogadores.get(nome) def ret_jogadores(self, nome_jogo): """Retorna os jogadores de um jogo""" return self.jogos[nome_jogo].ret_jogadores() def ret_jogadores_dicio(self, jogo): """Retorna uma lista com os dados dos jogadores em dicionarios""" jogs = [ jog.__dict__ for jog in jogo.ret_jogadores()] for j in jogs: j["tam_mao"] = len(j["mao"]) if j["nome"] == jogo.nome_jogador_atual: j["atual"] = True else: j["atual"] = False return jogs def ret_todos_jogadores(self): """Retorna todos os jogadores""" return self.jogadores.values() def validar_jogador(self, nome_jog): """Verifica se um jogador existe""" jog = self.jogadores.get(nome_jog) if jog == None: return "ERRO: Jogador nao encontrado!" #if jog.cod != cod: # return "ERRO: Codigo nao bate!" return True def fechar_jogo(self, nome): """Fecha um jogo""" s = self.jogos[nome] jogadores = s.ret_jogadores() for jog in jogadores: self.jogadores[jog].trocar_jogo(self.central) self.jogos.pop(nome) self.sist_chat.fechar_sala(nome) def iniciar_jogo(self, nome_jogo): """Inicia o jogo de nome 'nome_jogo'""" j = self.jogos.get(nome_jogo) if j: j.iniciar() return True else: return False def executar(self,nome_jog, jogada): """Exucuta uma jogada de um jogador""" resposta = self.validar_jogador(nome_jog) if resposta != True: return resposta jog = self.jogadores[nome_jog] jogo = jog.jogo if jog.nome != jogo.nome_jogador_atual: return "ERRO: Nao e a sua vez de jogar!" if len(jogada) < 2: return "ERRO: Jogada muito curta para processar!" #exp = "^(?P<tipo>\w)(?P<iden>\d+)(\-(?P<param>\d+))*$" exp = "^(\w)(\d+)(?:\-(\d+))?(?:\-(\d+))?(?:\-(\d+))?(?:\-(\d+))?$" print(jogada) bateu = re.match(exp, jogada) if bateu: tipo, iden = bateu.groups()[:2] if tipo == 'J': params = [] for p in bateu.groups()[2:]: if p: params.append(p) return jog.jogar_carta(iden, params) elif tipo == 'C': return jog.comprar_carta(iden) elif tipo == 'D': return jog.descartar_carta(iden) elif tipo == 'G': return jog.pegar_dinheiro() elif tipo == 'M': return jog.mais_carta() return "ERRO: Jogada nao identificada!" def nova_pagina(self, nome_jogador): """Prepara dados para a visualização da página de jogo""" jogador = self.jogadores.get(nome_jogador) if jogador: jogo = jogador.jogo jogadores = self.ret_jogadores_dicio(jogo) descarte = jogo.descarte baralho = jogo.baralho return {'jogadores':jogadores, 'descarte':descarte, 'baralho':baralho, 'jogo':jogo.nome} else: return {} def nova_atualizacao(self, nome_jogador, num): """Retorna dicionario com atualizacoes a serem feitas na interface""" try: num = int(num) except: return "ERRO: Numero da jogada nao e numero valido!" jogador = self.jogadores.get(nome_jogador) if jogador: jogo = jogador.jogo if num == jogo.num_jogada and not jogo.fim: # Nada para ser atualizado return "0" dicio = {} dicio["num_jogada"] = jogo.num_jogada dicio["mao"] = jogador.mao dicio["mesas"] = "A" dicio["fim"] = jogo.fim j = self.ret_jogadores_dicio(jogo) b = jogo.baralho d = jogo.descarte return [dicio, j, b, d] else: return "0"