Esempio n. 1
0
class Jogo(cocos.scene.Scene):
    def __init__(self):
        super(Jogo, self).__init__()

        self.estado = {
            'linhas': 0,
            'colunas': 0,
            'pontuacao': 0,
            'robo': None,
            'meta': None,
            'pedras': [],
            'pontos': []
        }
        self.inicializarEstado()

        self.teclado = None
        self.inicializarTeclado()

        self.mapa = None
        self.inicializarMapa()

        self.painel = None
        self.inicializarPainel()

    # O Estado vem todo a partir de um ficheiro de inicialização.
    def inicializarEstado(self):

        # Vai abrir a ficheiro  'informacao_inicial.txt' e dividir o
        # conteúdo em vários pedaços de texto.
        file = open("info-inicial.txt", "r")
        content = file.read()
        tokens = content.split()

        # Extrair o tamanho do mapa.
        self.estado['linhas'] = int(tokens[0])
        self.estado['colunas'] = int(tokens[1])

        # Extrair a posição do robo
        xRobo = int(tokens[2])
        yRobo = int(tokens[3])
        self.robo = Unidade('robo', (xRobo, yRobo))

        # Extrair a posição da meta
        xMeta = int(tokens[4])
        yMeta = int(tokens[5])
        self.meta = Unidade('meta', (xRobo, xMeta))

        # Extrair a quantidade de pedras e posiciona-las.
        # @TODO: Ainda pode gerar por cima do robo ou outras unidades.
        numeroPedras = int(tokens[6])
        for l in range(1, numeroPedras + 1):
            xPedra = random.randint(1, self.estado['linhas'])
            yPedra = random.randint(1, self.estado['colunas'])
            novaPedra = Unidade('pedra', (xPedra, yPedra))
            self.estado['pedras'].append(novaPedra)

        # Extrair a quantidade de pontos e posiciona-las.
        # @TODO: Ainda pode gerar por cima do robo ou outras unidades.
        numeroPontos = int(tokens[7])
        for l in range(1, numeroPontos + 1):
            xPonto = random.randint(1, self.estado['linhas'])
            yPonto = random.randint(1, self.estado['colunas'])
            novoPonto = Unidade('ponto', (xPonto, yPonto))
            self.estado['pontos'].append(novoPonto)

    def inicializarTeclado(self):
        self.teclado = Teclado(self)
        self.add(self.teclado)

    def inicializarMapa(self):
        self.mapa = Mapa(self.estado['linhas'], self.estado['colunas'])

        # Temos que adicionar todas as unidades ao mapa, para que ele
        # as possa desenhar
        self.mapa.inserirUnidade(self.robo)
        self.mapa.inserirUnidade(self.meta)
        for p in self.estado['pedras']:
            self.mapa.inserirUnidade(p)
        for p in self.estado['pontos']:
            self.mapa.inserirUnidade(p)

        # Por final é preciso adicionar o mapa ao cenário do Jogo, para
        # que o jogo decidir desenhar o mapa.
        self.add(self.mapa)

    def inicializarPainel(self):
        self.painel = Painel()
        self.add(self.painel)

    # Move o robo e executa o método de actualizão.
    def moverRobo(self, movimento):
        posicaoDesejada = (self.robo.posicao[0] + movimento[0],
                           self.robo.posicao[1] + movimento[1])
        if (self.podeMover(posicaoDesejada)):
            self.robo.posicao = posicaoDesejada
            # É necessário actualizar sempre a unidade no mapa
            # depois de mexer nela.
            self.mapa.actualizarUnidade(self.robo)
            self.aposMover()

    # Verifica se o robo se pode mover para a posicaoDesejada.
    # Aqui é importante ver se um robo pode mover para cima de
    # uma pedra ou assim.
    def podeMover(self, posicaoDesejada):
        # @TODO preencher
        return True

    # Esta função faz acontecer coisas depois do movimento do
    # robo. Por exemplo, as coisas que acontecem quando um robo
    # está por cima de uma moeda ou de uma meta.
    def aposMover(self):
        # @TODO preencher
        return