-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathactores.py
177 lines (146 loc) · 5.89 KB
/
actores.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#coding=utf-8
import curses
import random
class Actor(object):
"""Clase base para todas las entidades capaces de ocupar una posicion en el mapa."""
def __init__(self):
"""Inicializa el Actor."""
self.x = 0
self.y = 0
self.vivo = True
def dibujar(self):
"""Devuelve el caracter que representa al Actor."""
return '?'
def jugar_turno(self, juego):
"""Jugar un turno. `juego` es la instancia del `Juego`."""
pass
def interactuar_con_heroe(self, juego):
"""Realiza la accion correspondiente a la interaccion con el heroe (es
decir, cuando el heroe intenta moverse a la posicion ocupada por este actor).
Devuelve True si el heroe realizo alguna accion, False en caso contrario."""
return False
def esta_vivo(self):
"""Devuelve True en caso de estar vivo, False en caso contrario.
Cuando un actor informa que no esta vivo, es eliminado del mapa
automaticamente."""
return self.vivo
def es_heroe(self):
"""Devuelve True si es el heroe del juego (es decir, si es controlado
por la entrada del usuario)."""
return False
class Heroe(Actor):
"""Representa al Heroe del juego."""
direcciones = {
curses.KEY_UP: (0, -1),
curses.KEY_LEFT: (-1, 0),
curses.KEY_DOWN: (0, 1),
curses.KEY_RIGHT: (1, 0),
}
def __init__(self):
"""Crea al Heroe."""
self.monedas = 0
Actor.__init__(self)
def es_heroe(self):
"""Devuelve True si es el heroe del juego (es decir, si es controlado
por la entrada del usuario)."""
return True
def dibujar(self):
"""Devuelve el caracter que representa al Heroe."""
return '@'
def accion(self, dx, dy, juego):
"""Intenta realizar una accion con la celda que esta en la direccion (dx, dy).
Devuelve True si se realizo alguna accion, False en caso contrario."""
mapa = juego.mapa
x = max(0, min(mapa.ancho() - 1, self.x + dx))
y = max(0, min(mapa.alto() - 1, self.y + dy))
if not mapa.posicion_valida(x, y):
return False
actor = mapa.get_celda(x, y)
if actor:
return actor.interactuar_con_heroe(juego)
mapa.mover_actor(self, x, y)
return True
def jugar_turno_heroe(self, evento, juego):
"""Jugar un turno. `evento` es un evento de la libreria `curses` que permite
reaccionar ante la entrada del usuario. `juego` es una instancia `Juego`.
Devuelve True si se hizo alguna accion, False en caso contrario."""
if evento in Heroe.direcciones:
dx, dy = Heroe.direcciones[evento]
return self.accion(dx, dy, juego)
return False
class Enemigo(Actor):
"""Representa a los enemigos del juego"""
def __init__(self):
"""Inicializa a un enemigo"""
Actor.__init__(self)
self.tiene_monedas = random.randint(0,1)
self.nombre = '?'
def interactuar_con_heroe(self,juego):
"""Realiza la accion correspondiente a la interaccion con el heroe (es
decir, cuando el heroe intenta moverse a la posicion ocupada por este actor).
elimina al enemigo del mapa, muestra un mensaje informativo de esto y si
el enemigo tiene en su atributo 'tira_monedas' una referencia al numero
'1', se crea una nueva instancia de la moneda y se agrega donde el enemigo
fue previamente eliminado
"""
mapa = juego.mapa
self.vivo = False
mapa.eliminar_actores_muertos()
juego.msg("Has matado a un {}".format(self.nombre))
if self.tiene_monedas:
moneda = Moneda()
mapa.agregar_actor(moneda,self.x,self.y)
class Goblin(Enemigo):
"""Representa al enemigo Goblin"""
def __init__(self):
Enemigo.__init__(self)
self.nombre = "Goblin"
def dibujar(self):
"""Devuelve el caracter que representa al goblin."""
return 'g'
class Orco(Enemigo):
"""Representa al enemigo Orco"""
def __init__(self):
Enemigo.__init__(self)
self.nombre = "Orco"
def dibujar(self):
"""Devuelve el caracter que presenta al orco"""
return 'o'
class Moneda(Actor):
def dibujar(self):
"""Devuelve el caracter que representa una moneda"""
return '$'
def interactuar_con_heroe(self,juego):
"""Realiza la accion correspondiente a la interaccion con el heroe (es
decir, cuando el heroe intenta moverse a la posicion ocupada por este actor).
se elimina la moneda del mapa, se modifica el atributo monedas del heroe y
se muestra un mensaje por pantalla mostrando la cantidad de monedas que
tiene el heroe
"""
mapa = juego.mapa
self.vivo = False
mapa.eliminar_actores_muertos()
juego.heroe.monedas+=1
juego.msg("Has obtenido una moneda, total de monedas obtenidas:{}".format(juego.heroe.monedas))
class Pared(Actor):
"""Representa a las paredes del juego"""
def dibujar(self):
"""Devuelve el caracter que representa una pared"""
return "#"
class Salida(Actor):
"""Representa a la salida del calabozo"""
def dibujar(self):
"""Devuelve el caracter que representa la salida"""
return "<"
def interactuar_con_heroe(self,juego):
"""Realiza la accion correspondiente a la interaccion con el heroe (es
decir, cuando el heroe intenta moverse a la posicion ocupada por este actor).
se elimina al heroe del mapa, se muestran mensajes por pantalla y se finaliza
el juego
"""
mapa = juego.mapa
juego.heroe.vivo = False
mapa.eliminar_actores_muertos()
juego.msg("Felicidades!, has salido del calabozo!")
juego.msg("El juego ha terminado, presiona Q para volver a la consola")
juego.terminar()