示例#1
0
 def __init__(self):
     self.jogos = {}
     self.jogadores = {}
     self.sist_chat = SistemaChat()
     
     self.central = 'central'
     self.criar_jogo(self.central, None)
示例#2
0
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"