96 lines
2.7 KiB
Python
96 lines
2.7 KiB
Python
|
||
#叶结点
|
||
class Leaf:
|
||
def __init__(self,type,content,mincost=0):
|
||
self.type=type
|
||
self.content=content #conditionset or action
|
||
self.parent=None
|
||
self.parent_index=0
|
||
self.mincost=mincost
|
||
|
||
# tick 叶节点,返回返回值以及对应的条件或行动对象self.content
|
||
def tick(self,state):
|
||
if self.type=='cond':
|
||
if self.content <= state:
|
||
return 'success',self.content
|
||
else:
|
||
return 'failure',self.content
|
||
if self.type=='act':
|
||
if self.content.pre<=state:
|
||
return 'running',self.content #action
|
||
else:
|
||
return 'failure',self.content
|
||
|
||
def __str__(self):
|
||
print( self.content)
|
||
return ''
|
||
|
||
def print_nodes(self):
|
||
print(self.content)
|
||
|
||
def count_size(self):
|
||
return 1
|
||
|
||
|
||
#可能包含控制结点的行为树
|
||
class ControlBT:
|
||
def __init__(self,type):
|
||
self.type=type
|
||
self.children=[]
|
||
self.parent=None
|
||
self.parent_index=0
|
||
|
||
|
||
def add_child(self,subtree_list):
|
||
for subtree in subtree_list:
|
||
self.children.append(subtree)
|
||
subtree.parent=self
|
||
subtree.parent_index=len(self.children)-1
|
||
|
||
# tick行为树,根据不同控制结点逻辑tick子结点
|
||
def tick(self,state):
|
||
if len(self.children) < 1:
|
||
print("error,no child")
|
||
if self.type =='?':#选择结点,即或结点
|
||
for child in self.children:
|
||
val,obj=child.tick(state)
|
||
if val=='success':
|
||
return val,obj
|
||
if val=='running':
|
||
return val,obj
|
||
return 'failure','?fails'
|
||
if self.type =='>':#顺序结点,即与结点
|
||
for child in self.children:
|
||
val,obj=child.tick(state)
|
||
if val=='failure':
|
||
return val,obj
|
||
if val=='running':
|
||
return val,obj
|
||
return 'success', '>success'
|
||
if self.type =='act':#行动结点
|
||
return self.children[0].tick(state)
|
||
if self.type =='cond':#条件结点
|
||
return self.children[0].tick(state)
|
||
|
||
def getFirstChild(self):
|
||
return self.children[0]
|
||
|
||
def __str__(self):
|
||
print(self.type+'\n')
|
||
for child in self.children:
|
||
print (child)
|
||
return ''
|
||
|
||
def print_nodes(self):
|
||
print(self.type)
|
||
for child in self.children:
|
||
child.print_nodes()
|
||
|
||
# 递归统计树中结点数
|
||
def count_size(self):
|
||
result=1
|
||
for child in self.children:
|
||
result+= child.count_size()
|
||
return result
|
||
|