-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregras_jogo.py
135 lines (111 loc) · 4.72 KB
/
regras_jogo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from abc import ABC, abstractmethod
import Labirintite
import agentes
"""Interface com metodos abstratos. Deve ser herdada e sobrecarregada."""
class RegrasJogo(ABC):
""" Interface mínima para implementar um jogo interativo e modular. Não
tente instanciar objetos dessa classe, ela deve ser herdada e seus métodos
abstratos sobrecarregados.
"""
@abstractmethod
def registrarAgenteJogador(self, elemAgente):
""" Cria ou recupera id de um elemento de jogo agente.
"""
return
@abstractmethod
def isFim(self):
""" Boolean indicando fim de jogo em True.
"""
return
@abstractmethod
def gerarCampoVisao(self, idAgente):
""" Retorna um EstadoJogoView para ser consumido por um agente
específico. Objeto deve conter apenas descrição de elementos visíveis
para este agente.
EstadoJogoView é um objeto imutável ou uma cópia do jogo, de forma que
sua manipulação direta não tem nenhum efeito no mundo de jogo real.
"""
return
@abstractmethod
def registrarProximaAcao(self, id_jogador, acao):
""" Informa ao jogo qual a ação de um jogador especificamente.
Neste momento, o jogo ainda não é transformado em seu próximo estado,
isso é feito no método de atualização do mundo.
"""
return
@abstractmethod
def atualizarEstado(self, diferencial_tempo):
""" Apenas neste momento o jogo é atualizado para seu próximo estado
de acordo com as ações de cada jogador registradas anteriormente.
"""
return
"""Implementação da interface *RegrasJogo*, aqui os metodos são sobrecarregados."""
class Labirinto(RegrasJogo):
def __init__(self):
self.jogavel = None #É um objeto LabirintiteGame
self.jogador = None
self.espaco_estados = None
self.objetivo = None
#Lista no formato [jogador, direção]
self.historico_estados = []
def registrarAgenteJogador(self, elemAgente):
""" Cria ou recupera id de um elemento de jogo agente.
Tem como retorno o ID do jogador
"""
id_agente_registrado = elemAgente.get_id()
self.jogador = elemAgente
elemAgente.jogo = self
return id_agente_registrado
def isFim(self):
""" Boolean indicando fim de jogo em True.
"""
fim = self.jogavel.verifica_fim()
return fim
def gerarCampoVisao(self):
""" Retorna um EstadoJogoView para ser consumido por um agente
específico. Objeto deve conter apenas descrição de elementos visíveis
para este agente.
EstadoJogoView é um objeto imutável ou uma cópia do jogo, de forma que
sua manipulação direta não tem nenhum efeito no mundo de jogo real.
"""
tipo_jogador = self.jogador.tipo_agente
if tipo_jogador == 'HUMANO':
# Basta o humano olhar para a tela
return self.jogavel.labirinto
elif tipo_jogador == 'ROBO':
return self.jogavel.labirinto
else:
return self.jogavel.labirinto
#raise print("Não foi possivel gerar o campo de visão, tipo de agente desconhecido.")
return
def registrarProximaAcao(self, id_jogador, acao):
""" Informa ao jogo qual a ação de um jogador especificamente.
Neste momento, o jogo ainda não é transformado em seu próximo estado,
isso é feito no método de atualização do mundo.
"""
# False significa que ainda nao foi passada para o jogo
registro_acao = [id_jogador, acao, False]
self.historico_estados.append(registro_acao)
return
def atualizarEstado(self, diferencial_tempo):
""" Apenas neste momento o jogo é atualizado para seu próximo estado
de acordo com as ações de cada jogador registradas anteriormente.
"""
#Objeto que contém [Jogador, Movimento, ifExecutada]
ultima_acao = self.historico_estados[ len(self.historico_estados) - 1 ]
#Executa caso ainda nao tenha sido executada
if (ultima_acao[2] == False):
self.jogavel.atualiza_estado( ultima_acao[1], diferencial_tempo )
ultima_acao[2] = True
self.historico_estados.pop()
self.historico_estados.append(ultima_acao)
return
def iniciaJogo(self):
jogavel = Labirintite.construtor()
self.jogavel = jogavel
self.objetivo = jogavel.saida
def construir_jogo(*args,**kwargs):
""" Método factory para uma instância Jogavel arbitrária, de acordo com os
paraâmetros. Pode-se mudar à vontade a assinatura do método.
"""
return Labirinto()