-
Notifications
You must be signed in to change notification settings - Fork 0
/
bg.py
123 lines (93 loc) · 2.43 KB
/
bg.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
# -*- coding: iso-8859-15 -*-
"""
Behavior Tree Example
"""
class WorldStatus(object):
def __init__(self):
self.aperta = False # Porta aperta?
self.step = 3 # Distanza dalla porta
class Task(object):
"""
Classe base per un nodo di un Behavior Tree
"""
def __init__(self):
self._children = []
def run(self):
pass
def add_child(self, c):
self._children.append(c)
class Selector(Task):
"""
Implementazione di un Selector
"""
def __init__(self):
super(Selector, self).__init__()
def run(self):
for c in self._children:
if c.run():
return True
return False
class Sequence(Task):
"""
Implementazione di un Sequence
"""
def __init__(self):
super(Sequence, self).__init__()
def run(self):
for c in self._children:
if not c.run():
return False
return True
class PortaAperta(Task):
def __init__(self, status):
super(PortaAperta, self).__init__()
self._status = status
def run(self):
if self._status.aperta:
print("La Porta è aperta")
else:
print("La Porta è chiusa!")
return self._status.aperta
class Avvicinati(Task):
def __init__(self, status):
super(Avvicinati, self).__init__()
self._status = status
def run(self):
if self._status.step > 0:
print("Mi avvicino!")
self._status.step -= 1
return True
return False
class Apri(Task):
def __init__(self, status):
super(Apri, self).__init__()
self._status = status
def run(self):
if self._status.step != 0:
print("Ancora troppo lontano!")
return False
print("Apro la porta!")
self._status.aperta = True
return True
# MAIN #
def main():
# Definisco i nodi funzionali
root = Sequence()
seq = Sequence()
sel = Selector()
# Creo lo stato del mondo
status = WorldStatus()
# Creo le azioni
checkaperta = PortaAperta(status)
avvicinati = Avvicinati(status)
apri = Apri(status)
# Assemblo l'albero
root.add_child(sel)
sel.add_child(checkaperta)
sel.add_child(seq)
seq.add_child(avvicinati)
seq.add_child(apri)
# Eseguo la radice finché non ritorna vero
while not root.run():
print("---")
main()