骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 8026|回复: 7

[版主推荐] 【代码】自动生成完美对称的3分支树形图

[复制链接]

949

主题

1万

回帖

1万

积分

侯爵[超级版主]

枢机主教

Rank: 8Rank: 8Rank: 8Rank: 8

UID
45575
第纳尔
41708
精华
20
互助
1060
荣誉
584
贡献
1796
魅力
1700
注册时间
2007-10-24

骑砍中文站APP会员勋章元老骑士勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之大无畏勋章[杰出会员高级活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之侠义勋章[杰出会员高级互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之忠诚勋章[杰出会员精华勋章]骑士美德之正义勋章[杰出会员荣誉勋章]骑士美德之荣耀勋章[杰出会员高级荣誉勋章]骑士美德之圣洁勋章[杰出会员高级精华勋章]杰出汉化小组成员勋章骑士美德之慷慨勋章骑士荣誉之原版汉化勋章骑士荣誉之战团汉化勋章骑士美德之高贵勋章骑士美德之奉献勋章汉匈决战正版勋章

鲜花(2609) 鸡蛋(8)
发表于 2016-9-15 09:29:53 | 显示全部楼层 |阅读模式
本帖最后由 rubik 于 2016-9-15 09:43 编辑

先上图:


这个帖子的代码是我写的自动生成兵种升级树图谱的拓展,从2分支拓展到3分支的情况。
自动生成兵种升级树图谱的帖子:
http://bbs.mountblade.com.cn/thread-520151-1-1.html

代码如下:
这一段作为一个菜单项加入某个菜单里,比如module_game_menus.py里的"reports"菜单。
      ("action_view_tri_branch",[],"Tri-Branch.",
      [
        (call_script, "script_tri_branch_troop_data_test"),
        (start_presentation, "prsnt_tri_branch"),
      ]
       ), # test code

这一段代码是一个完整的presentation,加入到module_presentations.py里面。
  ("tri_branch",0,0,[
    (ti_on_presentation_load,
      [
        (presentation_set_duration, 999999),
        (set_fixed_point_multiplier, 1000),
        
        (assign, ":root_troop", 0),
        
        (create_mesh_overlay, reg1, "mesh_load_window"),
        (position_set_x, pos1, 0),
        (position_set_y, pos1, 0),
        (overlay_set_position, reg1, pos1),
        
        ## back
        (create_game_button_overlay, "$g_presentation_obj_admin_panel_1", "@Done"),
        (position_set_x, pos1, 900),
        (position_set_y, pos1, 25),
        (overlay_set_position, "$g_presentation_obj_admin_panel_1", pos1),

        (str_clear, s0),
        (create_text_overlay, reg1, s0, tf_scrollable),
        (position_set_x, pos1, 15),
        (position_set_y, pos1, 80),
        (overlay_set_position, reg1, pos1),
        (position_set_x, pos1, 950),
        (position_set_y, pos1, 600),
        (overlay_set_area_size, reg1, pos1),
        (set_container_overlay, reg1),
        
        (assign, reg2, 100),
        (call_script, "script_tri_branch_recursive_backtracking", ":root_troop", 50, reg2, 150),
        
        (set_container_overlay, -1),

      ]),
         
    (ti_on_presentation_event_state_change,
      [
        (store_trigger_param_1, ":object"),
        
        (try_begin),
          (eq, ":object", "$g_presentation_obj_admin_panel_1"),
          (presentation_set_duration, 0),
        (try_end),
      ]),
    ]),

这2个script加入到module_scripts.py里面。
前一个是定义树形图的分支关系,后一个就是核心的“递归-回溯”逻辑代码。
  ("tri_branch_troop_data_test",
    [
      (troop_set_slot, 0, 0, 1),
      (troop_set_slot, 0, 1, 2),
      (troop_set_slot, 0, 2, 3),
      
      (troop_set_slot, 1, 0, 4),
      (troop_set_slot, 1, 1, 5),
      (troop_set_slot, 1, 2, 0),
      
      (troop_set_slot, 2, 0, 6),
      (troop_set_slot, 2, 1, 7),
      (troop_set_slot, 2, 2, 8),
      
      (troop_set_slot, 3, 0, 0),
      (troop_set_slot, 3, 1, 0),
      (troop_set_slot, 3, 2, 0),
      
      (troop_set_slot, 4, 0, 0),
      (troop_set_slot, 4, 1, 0),
      (troop_set_slot, 4, 2, 0),
      
      (troop_set_slot, 5, 0, 9),
      (troop_set_slot, 5, 1, 10),
      (troop_set_slot, 5, 2, 0),
      
      (troop_set_slot, 6, 0, 0),
      (troop_set_slot, 6, 1, 0),
      (troop_set_slot, 6, 2, 0),
      
      (troop_set_slot, 7, 0, 0),
      (troop_set_slot, 7, 1, 0),
      (troop_set_slot, 7, 2, 0),
      
      (troop_set_slot, 8, 0, 0),
      (troop_set_slot, 8, 1, 0),
      (troop_set_slot, 8, 2, 0),
      
      (troop_set_slot, 9, 0, 0),
      (troop_set_slot, 9, 1, 0),
      (troop_set_slot, 9, 2, 0),
      
      (troop_set_slot, 10, 0, 0),
      (troop_set_slot, 10, 1, 0),
      (troop_set_slot, 10, 2, 0),
    ]),
   
   ("tri_branch_recursive_backtracking",
    [
      (store_script_param, ":troop_no", 1),
      (store_script_param, ":cur_x", 2),
      (store_script_param, ":cur_y", 3),
      (store_script_param, ":offset_x", 4),
      
      (store_add, ":next_x", ":cur_x", ":offset_x"),
      # upgrade_troop
      (troop_get_slot, ":upgrade_troop_1", ":troop_no", 0),
      (troop_get_slot, ":upgrade_troop_2", ":troop_no", 1),
      (troop_get_slot, ":upgrade_troop_3", ":troop_no", 2),
      (try_begin),
        (gt,  ":upgrade_troop_3", 0),
        (call_script, "script_tri_branch_recursive_backtracking", ":upgrade_troop_3", ":next_x", reg2, ":offset_x"),
        (assign, ":upgrade_troop_3_y", reg0),
        (val_add, reg2, 50), # current global y
        (call_script, "script_tri_branch_recursive_backtracking", ":upgrade_troop_2", ":next_x", reg2, ":offset_x"),
        (assign, ":upgrade_troop_2_y", reg0),
        (val_add, reg2, 50), # current global y
        (call_script, "script_tri_branch_recursive_backtracking", ":upgrade_troop_1", ":next_x", reg2, ":offset_x"),
        (assign, ":upgrade_troop_1_y", reg0),
      (else_try),
        (gt,  ":upgrade_troop_2", 0),
        (call_script, "script_tri_branch_recursive_backtracking", ":upgrade_troop_2", ":next_x", reg2, ":offset_x"),
        (assign, ":upgrade_troop_2_y", reg0),
        (val_add, reg2, 50), # current global y
        (call_script, "script_tri_branch_recursive_backtracking", ":upgrade_troop_1", ":next_x", reg2, ":offset_x"),
        (assign, ":upgrade_troop_1_y", reg0),
      (else_try),
        (gt,  ":upgrade_troop_1", 0),
        (call_script, "script_tri_branch_recursive_backtracking", ":upgrade_troop_1", ":next_x", reg2, ":offset_x"),
        (assign, ":upgrade_troop_1_y", reg0),
      (try_end),
      
      # troop_tree_line
      (try_begin),
        (gt,  ":upgrade_troop_3", 0),
        (store_add, reg0, ":upgrade_troop_1_y", ":upgrade_troop_3_y"),
        (val_div, reg0, 2),
        #               ---- upgrade_troop_1
        #              |
        # troop_no --------- upgrade_troop_2
        #              |
        #               ---- upgrade_troop_3
        (store_div, ":half_offset_x", ":offset_x", 2),
        (store_add, ":middle_x", ":cur_x", ":half_offset_x"),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":cur_x", reg0, 0),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":middle_x", ":upgrade_troop_1_y", 0),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":middle_x", ":upgrade_troop_2_y", 0),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":middle_x", ":upgrade_troop_3_y", 0),
        (store_sub, ":size_y", ":upgrade_troop_1_y", ":upgrade_troop_3_y"),
        (val_add, ":size_y", 4),
        (call_script, "script_prsnt_line", 4, ":size_y", ":middle_x", ":upgrade_troop_3_y", 0),
      (else_try),
        (gt,  ":upgrade_troop_2", 0),
        (store_add, reg0, ":upgrade_troop_1_y", ":upgrade_troop_2_y"),
        (val_div, reg0, 2),
        #               ---- upgrade_troop_1
        #              |
        # troop_no ----
        #              |
        #               ---- upgrade_troop_2
        (store_div, ":half_offset_x", ":offset_x", 2),
        (store_add, ":middle_x", ":cur_x", ":half_offset_x"),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":cur_x", reg0, 0),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":middle_x", ":upgrade_troop_1_y", 0),
        (call_script, "script_prsnt_line", ":half_offset_x", 4, ":middle_x", ":upgrade_troop_2_y", 0),
        (store_sub, ":size_y", ":upgrade_troop_1_y", ":upgrade_troop_2_y"),
        (val_add, ":size_y", 4),
        (call_script, "script_prsnt_line", 4, ":size_y", ":middle_x", ":upgrade_troop_2_y", 0),
      (else_try),
        (gt,  ":upgrade_troop_1", 0),
        (assign, reg0, ":upgrade_troop_1_y"),
        #
        # troop_no -------- upgrade_troop_1
        #
        (call_script, "script_prsnt_line", ":offset_x", 4, ":cur_x", ":upgrade_troop_1_y", 0),
      (else_try),
        (assign, reg0, ":cur_y"),
      (try_end),
      
      # troop block
      (create_mesh_overlay, reg1, "mesh_white_plane"),
      (position_set_x, pos0, 40*50),
      (position_set_y, pos0, 40*50),
      (overlay_set_size, reg1, pos0),
      (store_sub, ":block_x", ":cur_x", 20),
      (store_sub, ":block_y", reg0, 20),
      (position_set_x, pos0, ":block_x"),
      (position_set_y, pos0, ":block_y"),
      (overlay_set_position, reg1, pos0),
      
      # troop id
      (assign, reg3, ":troop_no"),
      (create_text_overlay, reg1, "@{reg3}", tf_center_justify|tf_vertical_align_center),
      (position_set_x, pos0, ":cur_x"),
      (position_set_y, pos0, reg0),
      (overlay_set_position, reg1, pos0),
    ]),

评分

参与人数 1第纳尔 +75 互助 +3 收起 理由
海涵狮心王理查 + 75 + 3 原创内容,值得鼓励!

查看全部评分

鲜花鸡蛋

达尔克内斯  在2016-9-15 19:27  送朵鲜花  并说:r大辛苦了。
xuecan  在2016-9-15 18:22  送朵鲜花  并说:r大威武!
yk199810  在2016-9-15 12:11  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
rubik

949

主题

1万

回帖

1万

积分

侯爵[超级版主]

枢机主教

Rank: 8Rank: 8Rank: 8Rank: 8

UID
45575
第纳尔
41708
精华
20
互助
1060
荣誉
584
贡献
1796
魅力
1700
注册时间
2007-10-24

骑砍中文站APP会员勋章元老骑士勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之大无畏勋章[杰出会员高级活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之侠义勋章[杰出会员高级互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之忠诚勋章[杰出会员精华勋章]骑士美德之正义勋章[杰出会员荣誉勋章]骑士美德之荣耀勋章[杰出会员高级荣誉勋章]骑士美德之圣洁勋章[杰出会员高级精华勋章]杰出汉化小组成员勋章骑士美德之慷慨勋章骑士荣誉之原版汉化勋章骑士荣誉之战团汉化勋章骑士美德之高贵勋章骑士美德之奉献勋章汉匈决战正版勋章

鲜花(2609) 鸡蛋(8)
 楼主| 发表于 2016-9-15 09:37:38 | 显示全部楼层
本帖最后由 rubik 于 2016-9-15 10:05 编辑

截图和代码已经把实际的效果演示出来。 这段代码并没有特指对象的类型,虽然用的是troop的slot,但适应于任何类型,比如技能升级树,建筑升级树等等。各MOD制作者把代码复制回去之后,需要套上自己MOD相关的分支设定,行距什么的也可能需要调整。这里的对象外在表现形式是方块,具体到MOD里面就换成某种图标。 名字这里是数字,具体到MOD里面就换成对象的名字,坐标也需要调一下。

这里是横向形式,稍作修改就可以变成纵向形式。 另外,这段代码也很容易拓展到4分支的情况,只是“递归-回溯”逻辑的代码看起来就不那么精炼,多一个分支就多两段else_try分支代码,有点简单铺陈的感觉。但3~4个分支就用循环来处理,必要性也不大。
rubik

18

主题

1129

回帖

344

积分

见习骑士

Rank: 3

UID
70724
第纳尔
6110
精华
0
互助
0
荣誉
0
贡献
0
魅力
3
注册时间
2008-3-14
鲜花(3) 鸡蛋(0)
发表于 2016-9-15 17:32:12 | 显示全部楼层
R大又脑洞大开了

168

主题

1815

回帖

1165

积分

贵族[MOD作者]

中级术士

Rank: 7Rank: 7Rank: 7

UID
69266
第纳尔
3592
精华
1
互助
46
荣誉
24
贡献
0
魅力
144
注册时间
2008-2-28

骑砍中文站APP会员勋章有生之年勋章元老骑士勋章战团正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]

QQ
鲜花(401) 鸡蛋(0)
发表于 2016-9-15 19:51:46 | 显示全部楼层
引擎指导的 升级 线路不是只有两条吗?  虽然图可以这画,但是实际的升级线路却不能选多条吧!

949

主题

1万

回帖

1万

积分

侯爵[超级版主]

枢机主教

Rank: 8Rank: 8Rank: 8Rank: 8

UID
45575
第纳尔
41708
精华
20
互助
1060
荣誉
584
贡献
1796
魅力
1700
注册时间
2007-10-24

骑砍中文站APP会员勋章元老骑士勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之大无畏勋章[杰出会员高级活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之侠义勋章[杰出会员高级互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之忠诚勋章[杰出会员精华勋章]骑士美德之正义勋章[杰出会员荣誉勋章]骑士美德之荣耀勋章[杰出会员高级荣誉勋章]骑士美德之圣洁勋章[杰出会员高级精华勋章]杰出汉化小组成员勋章骑士美德之慷慨勋章骑士荣誉之原版汉化勋章骑士荣誉之战团汉化勋章骑士美德之高贵勋章骑士美德之奉献勋章汉匈决战正版勋章

鲜花(2609) 鸡蛋(8)
 楼主| 发表于 2016-9-15 21:57:14 | 显示全部楼层
hushuailiner2 发表于 2016-9-15 19:51
引擎指导的 升级 线路不是只有两条吗?  虽然图可以这画,但是实际的升级线路却不能选多条吧!

2楼已经解释了。所以标题里用的是树形图这个词,而不是兵种升级树。树形图可以应用于很多方面,比如技能升级树,换兵的分支树等。
rubik

11

主题

92

回帖

41

积分

扈从

自由骑士
战团ID:Poweredby

Rank: 2Rank: 2

UID
2419530
第纳尔
1831
精华
0
互助
2
荣誉
0
贡献
0
魅力
0
注册时间
2015-1-16

战团正版勋章拿破仑正版勋章维京征服正版勋章骑砍中文站微博会员勋章汉匈决战正版勋章元老骑士勋章

鲜花(6) 鸡蛋(0)
发表于 2016-9-15 23:51:12 | 显示全部楼层
R大辛苦了  ~

7

主题

4177

回帖

1298

积分

骑士长

Rank: 5Rank: 5Rank: 5

UID
1622393
第纳尔
545
精华
0
互助
4
荣誉
2
贡献
0
魅力
45
注册时间
2013-10-23

骑士美德之英勇勋章[杰出会员活跃勋章]骑砍中文站微博会员勋章骑砍中文站微信会员勋章汉匈决战正版勋章

鲜花(165) 鸡蛋(8)
发表于 2016-9-16 13:59:21 | 显示全部楼层
R大辛苦了

224

主题

6034

回帖

2982

积分

男爵[离任版主]

Rank: 5Rank: 5Rank: 5

UID
169987
第纳尔
15231
精华
1
互助
101
荣誉
50
贡献
1605
魅力
252
注册时间
2009-11-28

元老骑士勋章汉匈决战正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之大无畏勋章[杰出会员高级活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之奉献勋章骑士美德之高贵勋章骑砍中文站微博会员勋章

鲜花(1473) 鸡蛋(56)
发表于 2016-9-16 20:06:55 | 显示全部楼层
我在想这东西能不能通过try for range一步到位
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-12-29 10:33 , Processed in 0.361204 second(s), 33 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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