鱼C论坛

 找回密码
 立即注册
查看: 1501|回复: 10

求助,树结构

[复制链接]
发表于 2021-8-2 10:09:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


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

使用道具 举报

发表于 2021-8-5 10:15:09 | 显示全部楼层
打工人,打工魂,打工都是人上人。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-10 15:42:01 | 显示全部楼层
nahongyan1997 发表于 2021-8-5 10:15
打工人,打工魂,打工都是人上人。

我这不算打工吧,只是我导师想让我练一下写这种结构,就拿酒馆战旗这个运算模式当例子让我练
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-10 16:34:44 | 显示全部楼层
我从网上查了一个,树结构,但是我主要是不会 给一个初始条件  输出最后就是那个树结构,中间计算各个棋子的状态以及自动递归到下一层不知道怎么套进去

这是那个结构
  1. class TreeNode(object):
  2.     """树节点类"""

  3.     def __init__(self, name, parent=None):
  4.         super(TreeNode, self).__init__()
  5.         self.name = name
  6.         self.parent = parent
  7.         self.child = {}

  8.     def __repr__(self) :
  9.         return 'TreeNode(%s)' % self.name


  10.     def __contains__(self, item):
  11.         return item in self.child


  12.     def __len__(self):
  13.         """返回子节点长度"""
  14.         return len(self.child)

  15.     def __bool__(self, item):
  16.         """对存在的节点返回true"""
  17.         return True


  18.     def path(self):
  19.         """返回路径字符串(从根节点到当前节点)"""
  20.         if self.parent:
  21.             return '%s %s' % (self.parent.path.strip(), self.name)
  22.         else:
  23.             return self.name

  24.     def get_child(self, name, defval=None):
  25.         """获取当前节点的子节点"""
  26.         return self.child.get(name, defval)

  27.     def add_child(self, name, obj=None):
  28.         """对当前节点增加一个子节点"""
  29.         if obj and not isinstance(obj, TreeNode):
  30.             raise ValueError('TreeNode only add another TreeNode obj as child')
  31.         if obj is None:
  32.             obj = TreeNode(name)
  33.         obj.parent = self
  34.         self.child[name] = obj
  35.         return obj

  36.     def del_child(self, name):
  37.         """从当前节点删除一个子节点"""
  38.         if name in self.child:
  39.             del self.child[name]

  40.     def find_child(self, path, create=False):
  41.         """通过路径或名字找到子节点, 如果没找到返回None"""
  42.         # 如果输入是字符串,将路径转换为列表
  43.         path = path if isinstance(path, list) else path.split() #如果不是则分割为列表
  44.         cur = self
  45.         for sub in path:
  46.             # 搜索
  47.             obj = cur.get_child(sub)
  48.             if obj is None and create:
  49.                 #可以增加需要的新节点
  50.                 obj = cur.add_child(sub)
  51.             # 检查搜索是否完成
  52.             if obj is None:
  53.                 break
  54.             cur = obj
  55.         return obj

  56.     def items(self):
  57.         return self.child.items()

  58.     def dump(self, indent=0):
  59.         """将树转存为字符串,输出树状结构 """
  60.         tab = '    '*(indent-1) + ' |- ' if indent > 0 else ''
  61.         print('%s%s' % (tab, self.name))
  62.         for name, obj in self.items():
  63.             obj.dump(indent+1)

  64.     def preorder(self,tier=0):
  65.         """先序遍历输出"""
  66.         print('%s' % (self.name))
  67.         for name, obj in self.items():
  68.             obj.preorder(tier+1)


  69. if __name__ == '__main__':
  70.     root = TreeNode('tree') #'tree'
  71.     a1 = root.add_child('a1')
  72.     a1.add_child('b1')
  73.     a1.add_child('b2')
  74.     a1.add_child('b3')
  75.     a1.add_child('b4')
  76.     b3 = a1.add_child('b3')
  77.     b3.add_child('c1')
  78.     b3.add_child('c2')
  79.     c1 = b3.add_child('c1')
  80.     c1.add_child('d1')
  81.     b4 = a1.add_child('b4')
  82.     b4.add_child('c3')
  83.     root.dump()
  84.     root.preorder()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-10 16:36:29 | 显示全部楼层
我之前尝试过在 树结构外面 写那些计算的函数  ,但是最后都不能实现递归,都只有一层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-10 17:16:33 | 显示全部楼层
我感觉就是,每个节点都有数据,然后父节点的数据会影响子节点的个数和数据,这个所谓的影响就是 计算棋子之间相互攻击的函数,然后每层节点都是这样,直到某一方棋子都没了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

论坛里有个叫皮卡丘的写了一个五子棋的程序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-11 08:19:02 | 显示全部楼层
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-12 15:00:37 | 显示全部楼层
nahongyan1997 发表于 2021-8-11 08:19
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)

我看看啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-12 18:48:18 | 显示全部楼层
nahongyan1997 发表于 2021-8-11 08:19
支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)

感谢大佬,我看看了很有用,主要是要用博弈树搜索,比我之前单纯想的树结构更细化了,也有资料和例子可查,非常感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-12 18:48:50 | 显示全部楼层
如果我能写出来我会发到论坛里,如果能写的出来的话!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表