找回密码
 点一下
查看: 1019|回复: 15

问个触发器里的结构思路

[复制链接]
发表于 2014-6-18 12:57:41 | 显示全部楼层 |阅读模式
抽象出来的情况是这样:
现有函数k1()、k2()、k3()(无返回值、不创建线程)。主函数按顺序运行k1、k2、k3。
函数k1、k2、k3的内容均为(4项内容,不限顺序) :    1、50%概率中断上一层函数   2、50%概率运行k1()  3、50%概率运行k2()  4、50%概率运行k3()
(即有可能进行多重循环,中断的意思是、该函数继续运行完成后、上一层函数终止运行(return())、然后上上层继续运行(若上一层函数没有触发中断))





问题是、这个中断怎么弄?

不知道我是否讲得清楚了,原型是一个连锁触发的系统,每次效果造成N个触发(效果),有可能触发到(终止本效果的触发(效果))。
发表于 2014-6-18 13:42:38 | 显示全部楼层
好复杂的逻辑,理解不能
回复

使用道具 举报

发表于 2014-6-18 14:00:24 | 显示全部楼层
woaibusi 发表于 2014-6-18 13:42
好复杂的逻辑,理解不能

(歪头)心静大大也要吃面包虫吗?
回复

使用道具 举报

 楼主| 发表于 2014-6-18 15:29:59 | 显示全部楼层
不是吧,理解不能那么严重去。
看看换种说法行不行得通

主函数要执行N个步骤,暂定为5个,N1,N2,N3,N4,N5
每个步骤N都会同时触发数个(有50%几率不触发)触发器,暂定为5个,T1,T2,T3,T4,T5。只要其中至少一个触发器给出中断的结果,就暂停执行主函数后面的步骤(如N2触发某个触发器(如T3)给出中断结果,那N3,N4,N5就不执行了)
重点来了,每个触发器T1~T5 的内容也是N个步骤,这些步骤也可能同时触发数个触发器,也是需要判断这些触发器的结果是否为中断。然后这些新的触发器的内容又是数个步骤…………

这次应该清楚点,原来那个不要了(我自己也看糊涂了)

点评

声明布尔型变量 B1 通用函数F1 如果随机整数(0-1)=1,那么 调用触发器T1 如果B1=TRUE,那么 中断 如果随机整数(0-1)=1,那么 调用触发器T2 如果B1=TRU  详情 回复 发表于 2014-6-20 00:06
回复

使用道具 举报

发表于 2014-6-19 23:49:05 | 显示全部楼层
本帖最后由 yxxiaobin 于 2014-6-19 23:54 编辑

给函数一个布尔返回值,如果中断则返回真,否则返回假,上一层函数在调用本函数时作为条件,而不是动作,这样当函数返回真时,中断就可以了。如果你基于某种原因一定不要返回值,那么用一个全局布尔变量也行,在函数中设置变量,调用函数后,判断全局变量是否为真就可以了,但是这样做感觉怪怪的。
另外我很疑惑的是,50%不是最多有两个吗?怎么会有大于100%的总概率呢?还是说如果不发生上一个事件,则有50%的几率发生本事件?如果是这样的话,那么各个事件的概率其实是不同的,第一个是50%,第二个是25%,第三个则是12.5%,以此类推。

点评

50%概率的意思是,每个都是50%概率触发的独立事件(不是从总概率的50%),这不重要 看了你给的例子,感觉好像不太对 这个F1是不是我将的N步骤里面的一个,也就是说还有F2、F3、F4、F5 我的要求的F1要全部运行完  详情 回复 发表于 2014-6-20 00:50
回复

使用道具 举报

发表于 2014-6-20 00:06:32 | 显示全部楼层
本帖最后由 yxxiaobin 于 2014-6-20 00:13 编辑
flylicat 发表于 2014-6-18 15:29
不是吧,理解不能那么严重去。
看看换种说法行不行得通

声明布尔型变量 B1

通用函数F1
    如果随机整数(0-1)=1,那么
        调用触发器T1

    如果B1=TRUE,那么
        中断

    如果随机整数(0-1)=1,那么
        调用触发器T2

    如果B1=TRUE,那么
        中断

    如果随机整数(0-1)=1,那么
        调用触发器T3

    如果B1=TRUE,那么
        中断

    如果随机整数(0-1)=1,那么
        调用触发器T4

    如果B1=TRUE,那么
        中断

    如果随机整数(0-1)=1,那么
        调用触发器T5

通用函数F1结束

主函数Fm
    调用F1
主函数Fm结束

触发器T1
    做某些事1
    如果随机整数(0-1)=1,那么
        设置B1=TRUE
    否则
        设置B1=false
        调用F1

触发器T1结束

触发器T2
    做某些事2
    如果随机整数(0-1)=1,那么
        设置B1=TRUE
    否则
        设置B1=false
        调用F1

触发器T2结束

后边的不写了,你应该明白吧。



回复

使用道具 举报

 楼主| 发表于 2014-6-20 00:50:12 | 显示全部楼层
yxxiaobin 发表于 2014-6-19 23:49
给函数一个布尔返回值,如果中断则返回真,否则返回假,上一层函数在调用本函数时作为条件,而不是动作,这 ...

50%概率的意思是,每个都是50%概率触发的独立事件(不是从总概率的50%),这不重要

看了你给的例子,感觉好像不太对
这个F1是不是我将的N步骤里面的一个,也就是说还有F2、F3、F4、F5
我的要求的F1要全部运行完,只要其中有一个返回false,那F2往后就不运行
只有F1中的5个T都没有返回false,才继续运行F2
这个第一层好做,就是第二层再次调用(也就是T中运行F1、F2……)时没想通
回复

使用道具 举报

 楼主| 发表于 2014-6-20 01:01:19 | 显示全部楼层
本帖最后由 flylicat 于 2014-6-20 01:12 编辑

如果随机整数(0-1)=1,那么
        调用触发器T1

不是50%触发T1
而是T1里面
触发器T1
        如果随机整数(0-1)=1,那么
               返回中断
        如果随机整数(0-1)=1,那么
               运行F1
      如果随机整数(0-1)=1,那么
               运行F2
        如果随机整数(0-1)=1,那么
               运行F3

触发器T1结束

如果返回了中断,那就是上一级中断运行(跳到触发器结尾)(假设这个T1是上一层FF2中T1~T5中的一个,那么中断后上一层的FF3往后就不运行了(而T1~T5是都运行的,就看看是否某个返回中断而已)
如果F2里面某个T给F2返回了中断(F2里面同时运行T21~T25,5个触发,其中某个返回了中断),则中断这个T1(跳到触发器结尾),也就是F2、F3不运行了


这样应该更清楚了,这是中间某层的情况
回复

使用道具 举报

发表于 2014-6-20 08:29:28 | 显示全部楼层
会同时有多个T1运行么?比如T1调用T2然后T2调用T1,甚至直接T1调用T1本身,这是第一个没说清楚的
第二,当一其中的某个调用下一个时,是否停止运行等待结果?
如果这是一个递归调用的树,那么有没有最大递归上限?因为似乎每次是否调用都是相互独立的,那么每次都是1变5,那么几层就会因为过于庞大而死掉。
最好还是直接说你要做什么,抽象的东西我们给出的说明也不一定符合你要做的内容
回复

使用道具 举报

 楼主| 发表于 2014-6-20 10:38:41 | 显示全部楼层
本帖最后由 flylicat 于 2014-6-20 10:40 编辑

有可能出现这种情况:比如T1调用T2然后T2调用T1
全部都是等待结果,包括T和F
不算是专门递归用的,可以把概率极大缩小,比如T里面95%什么都不做,然后5%里面才分(中断、F1、F2等)

我做的是一个卡牌的中断时点响应的系统,每张卡出去后,产生N个时点,每个时点都会同时检索全部卡牌,如果符合触发条件那就会执行相应效果(这个效果里面又有另外N个时点),又有其他卡牌可以响应效果。
相当是个卡牌的连锁系统,这个我全部都做玩了,可以使用一般效果的卡牌对战了。

现在的问题是打算加入一个“无效化”的效果,即某张卡的效果会让上一张卡的效果终止(当然也会有时点给其他卡牌响应(就像无懈可击被无懈可击,或者每当有人打出无懈可击时增加1点攻击等))。就变成我提的问题了。
卡牌效果都封装的是动作,所以没有返回值
虽然这张卡执行了”无效化“的效果,但是同一时点触发的其他卡牌还是会执行完毕

现在考虑的是最普适的情况,复杂连锁的其实概率极低的,我为了将可能性列出来,问的时候把概率平分了,这应该不影响吧
如果难度太大,或者资源吃不消就增加条件来限定”无效化“卡牌的触发(如只允许”无效化“卡牌的发动,不能中断卡牌效果的执行等)
我觉得需要全局变量的布尔数组,控制连锁的层数,不过还没想好

不知道这回讲清楚没有
回复

使用道具 举报

发表于 2014-6-20 21:49:33 | 显示全部楼层
这样就好理解多了,因为卡牌数量有限,不会递归,太多,这就是我说不能抽象着来。
因为可能使用同样的卡牌,所以可能出现自己调用自己的情况,所以这个需要局域化的。

因为你已经做好了,不知道你自己的实现方法是怎样的,我只能说下大概想法。
可能按照我的想法做你的改动会很大,所以只是一个参考

首先是要给每个将要执行的效果一个唯一的ID,用于彼此区分,相同的牌的不同时候的效果的ID也不相同,也就是对应每个执行的效果有个独有的ID
以ID为key存储一些列数据,包括执行的函数(采用函数引用存储)按照次序的上一个和下一个执行的效果的ID,效果指向的其他效果的ID或者其他需要的数据,
这些内容做成一个结构体。
然后当第一个效果还是进行到时点时刻开始,根据效果的次序依据ID指向来形成一个结构体链表。
然后每次时点根据规则插入链表或者其他,效果执行时直接修改效果影响其他效果ID的对应的结构体数据。

比如效果1在效果2之前执行,就将其对应的结构体插入到链表中效果2之前,
然后依据效果发动次序通过链表执行效果具体函数。

点评

虽然有点差别,实现方式不同,思路是一样的。 可是这个方法的带有“无效化”内容卡牌怎么做啊?没理解出来。  详情 回复 发表于 2014-6-21 00:14
回复

使用道具 举报

 楼主| 发表于 2014-6-21 00:14:36 | 显示全部楼层
疯人¢衰人 发表于 2014-6-20 21:49
这样就好理解多了,因为卡牌数量有限,不会递归,太多,这就是我说不能抽象着来。
因为可能使用同样的卡牌 ...

虽然有点差别,实现方式不同,思路是一样的。

可是这个方法的带有“无效化”内容卡牌怎么做啊?没理解出来。
回复

使用道具 举报

发表于 2014-6-21 22:32:38 | 显示全部楼层
本帖最后由 疯人¢衰人 于 2014-6-21 22:34 编辑

无效化是个属性,在结构体中,效果是否发动需要检测这个属性,默认为真,就是执行
子级可以索引到父级的效果,找到对应属性来修改值,
因为只有子级函数会对其进行更改,而且这个是先发动的效果才能修改后发动的
这样,当一个效果发动前,它的这个属性任意修改都无所谓
只有在执行的瞬间才检查
当然,当效果发动时,能够影响这个的已经决定好了,所以互相不会有错误的情况
比如效果A,然后B使A无效,C使B无效,
执行次序是CBA,那么C修改B使B的属性设为假,所以B效果不发动,那么A的属性就不会设为假
那么A照样执行
回复

使用道具 举报

 楼主| 发表于 2014-6-21 23:39:05 | 显示全部楼层
感谢,用属性做无效化是个好方法

能说说复杂点的情况么,我怕我想岔了
例如:效果1启动,里面有4个步骤 A B C D 按顺序运行,然后在B之前触发了其他3个效果 E F G,F的效果又触发了H。
其中G的效果是无效化,即步骤 B C D 被无效化了,只运行了步骤A,H的效果也是无效化,把F的效果无效化了。
按照思路运行顺序反过来应该是 A(G (H)F E )B C D
在这里4个步骤是不是就要4个效果Id了?然后B C D运行前要检查前面是否有无效化的属性,如运行D前检查A B C的无效化属性只要其中有一个无效化属性就把自己也无效了
还是子函数G同时给B C D 加上无效化属性?这样又怎么确定B后面有多少个步骤?

回复

使用道具 举报

发表于 2014-6-23 08:26:57 | 显示全部楼层
你的这个例子里效果和效果内的步骤混了,如果效果是分步执行的话,那么就是每个步骤一个ID,
当一个效果执行到某个步骤时,被无效化,那么具体要怎么样,都是你自己设置的。
如果以万智牌来说,每个牌分为发动前和发动后两个步骤(大约都是这样吧)
中间的间断是用来发动其他效果的,执行次序也是打断的牌优先被打断的牌执行。
这里呢,实际的有效效果是后半段,所以无效化只影响后半段即可。
也就是说,如果一个效果在某个步骤系列中被无效化,那么它在后面未执行的步骤是应该被无效的,
当然一般来说,每个效果产生影响的步骤应该是唯一的,和最后的,一般来说卡牌都是这样,
即使是持续性效果,那么也只是两种情况,一种是周期发动,每次发动是独立的效果(顶多就是数据叠加)
要么是类似游戏王的环境牌,这种不是发动型效果,只是作为一个判断条件,跟系统无关

这样的系统关键问题就是要没有并行执行的效果,无论是效果还是效果的步骤,只要有序就行了。唯一的问题就是在效果执行一半时(如果效果持续两个步骤并且在之间被无效化的特殊情况,一般不会这样设计卡牌效果的)
这种情况就需要你做额外判断了,我说的系统其实就是每个卡牌只对其父级卡牌(目标卡牌)有效,哪怕存在有效化,和无效化两种效果,如果实际产生的步骤是唯一而且最后的步骤的前提下
也是不会影响执行逻辑的。
记住,被无效化的效果并非被踢出链表,只是被跳过执行。

另外ID发布算法可以给你。

回复

使用道具 举报

发表于 2014-6-23 08:49:21 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-7-7 05:49 , Processed in 0.232992 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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