撕裂天堂 发表于 2021-8-2 10:09:55

求助,树结构



最近在写一个酒馆战旗计算胜率的算法,最基础的,不考虑英雄和特殊技能,但是要求用树来写,能精确计算出胜率,不能用蒙特卡洛随机模拟来写
我觉得就是要写出每种情况以及对应的概率,最后都加起来就行
求助求助

nahongyan1997 发表于 2021-8-5 10:15:09

打工人,打工魂,打工都是人上人。

撕裂天堂 发表于 2021-8-10 15:42:01

nahongyan1997 发表于 2021-8-5 10:15
打工人,打工魂,打工都是人上人。

我这不算打工吧,只是我导师想让我练一下写这种结构,就拿酒馆战旗这个运算模式当例子让我练

撕裂天堂 发表于 2021-8-10 16:34:44

我从网上查了一个,树结构,但是我主要是不会 给一个初始条件输出最后就是那个树结构,中间计算各个棋子的状态以及自动递归到下一层不知道怎么套进去

这是那个结构
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 16:36:29

我之前尝试过在 树结构外面 写那些计算的函数,但是最后都不能实现递归,都只有一层

撕裂天堂 发表于 2021-8-10 17:16:33

我感觉就是,每个节点都有数据,然后父节点的数据会影响子节点的个数和数据,这个所谓的影响就是 计算棋子之间相互攻击的函数,然后每层节点都是这样,直到某一方棋子都没了

nahongyan1997 发表于 2021-8-11 08:17:12

撕裂天堂 发表于 2021-8-10 17:16
我感觉就是,每个节点都有数据,然后父节点的数据会影响子节点的个数和数据,这个所谓的影响就是 计算棋子 ...

论坛里有个叫皮卡丘的写了一个五子棋的程序

nahongyan1997 发表于 2021-8-11 08:19:02

支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)

撕裂天堂 发表于 2021-8-12 15:00:37

nahongyan1997 发表于 2021-8-11 08:19
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)

我看看啊

撕裂天堂 发表于 2021-8-12 18:48:18

nahongyan1997 发表于 2021-8-11 08:19
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)

感谢大佬,我看看了很有用,主要是要用博弈树搜索,比我之前单纯想的树结构更细化了,也有资料和例子可查,非常感谢!!!

撕裂天堂 发表于 2021-8-12 18:48:50

如果我能写出来我会发到论坛里,如果能写的出来的话!!!
页: [1]
查看完整版本: 求助,树结构