求助,树结构
最近在写一个酒馆战旗计算胜率的算法,最基础的,不考虑英雄和特殊技能,但是要求用树来写,能精确计算出胜率,不能用蒙特卡洛随机模拟来写
我觉得就是要写出每种情况以及对应的概率,最后都加起来就行
求助求助 打工人,打工魂,打工都是人上人。 nahongyan1997 发表于 2021-8-5 10:15
打工人,打工魂,打工都是人上人。
我这不算打工吧,只是我导师想让我练一下写这种结构,就拿酒馆战旗这个运算模式当例子让我练 我从网上查了一个,树结构,但是我主要是不会 给一个初始条件输出最后就是那个树结构,中间计算各个棋子的状态以及自动递归到下一层不知道怎么套进去
这是那个结构
class TreeNode(object):
"""树节点类"""
def __init__(self, name, parent=None):
super(TreeNode, self).__init__()
self.name = name
self.parent = parent
self.child = {}
def __repr__(self) :
return 'TreeNode(%s)' % self.name
def __contains__(self, item):
return item in self.child
def __len__(self):
"""返回子节点长度"""
return len(self.child)
def __bool__(self, item):
"""对存在的节点返回true"""
return True
def path(self):
"""返回路径字符串(从根节点到当前节点)"""
if self.parent:
return '%s %s' % (self.parent.path.strip(), self.name)
else:
return self.name
def get_child(self, name, defval=None):
"""获取当前节点的子节点"""
return self.child.get(name, defval)
def add_child(self, name, obj=None):
"""对当前节点增加一个子节点"""
if obj and not isinstance(obj, TreeNode):
raise ValueError('TreeNode only add another TreeNode obj as child')
if obj is None:
obj = TreeNode(name)
obj.parent = self
self.child = obj
return obj
def del_child(self, name):
"""从当前节点删除一个子节点"""
if name in self.child:
del self.child
def find_child(self, path, create=False):
"""通过路径或名字找到子节点, 如果没找到返回None"""
# 如果输入是字符串,将路径转换为列表
path = path if isinstance(path, list) else path.split() #如果不是则分割为列表
cur = self
for sub in path:
# 搜索
obj = cur.get_child(sub)
if obj is None and create:
#可以增加需要的新节点
obj = cur.add_child(sub)
# 检查搜索是否完成
if obj is None:
break
cur = obj
return obj
def items(self):
return self.child.items()
def dump(self, indent=0):
"""将树转存为字符串,输出树状结构 """
tab = ' '*(indent-1) + ' |- ' if indent > 0 else ''
print('%s%s' % (tab, self.name))
for name, obj in self.items():
obj.dump(indent+1)
def preorder(self,tier=0):
"""先序遍历输出"""
print('%s' % (self.name))
for name, obj in self.items():
obj.preorder(tier+1)
if __name__ == '__main__':
root = TreeNode('tree') #'tree'
a1 = root.add_child('a1')
a1.add_child('b1')
a1.add_child('b2')
a1.add_child('b3')
a1.add_child('b4')
b3 = a1.add_child('b3')
b3.add_child('c1')
b3.add_child('c2')
c1 = b3.add_child('c1')
c1.add_child('d1')
b4 = a1.add_child('b4')
b4.add_child('c3')
root.dump()
root.preorder() 我之前尝试过在 树结构外面 写那些计算的函数,但是最后都不能实现递归,都只有一层 我感觉就是,每个节点都有数据,然后父节点的数据会影响子节点的个数和数据,这个所谓的影响就是 计算棋子之间相互攻击的函数,然后每层节点都是这样,直到某一方棋子都没了 撕裂天堂 发表于 2021-8-10 17:16
我感觉就是,每个节点都有数据,然后父节点的数据会影响子节点的个数和数据,这个所谓的影响就是 计算棋子 ...
论坛里有个叫皮卡丘的写了一个五子棋的程序 支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)
nahongyan1997 发表于 2021-8-11 08:19
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)
我看看啊 nahongyan1997 发表于 2021-8-11 08:19
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)
感谢大佬,我看看了很有用,主要是要用博弈树搜索,比我之前单纯想的树结构更细化了,也有资料和例子可查,非常感谢!!! 如果我能写出来我会发到论坛里,如果能写的出来的话!!!
页:
[1]