`
sonic_yj
  • 浏览: 76224 次
  • 性别: Icon_minigender_1
  • 来自: CD
社区版块
存档分类
最新评论

Drools 3.1M1真的不错 回合制游戏开发原来并不难

阅读更多

     前几天在论坛讨论了Drools后,说到了Drools的问题,根据DaDa老兄的描述,找到了Drools 3.1M1,发现From Collect真的不错。已经试着成功集成到公司开发框架中(现在可以不重新编辑,只是改改文本文件就达到调整Control层的效果),昨晚突发奇想,试着花了几个小时用Drools写了一个Tank自动对打游戏,感觉还不错。打算后续完善一下,集成同事推荐的robocode玩玩。   相信Drools3.2正式版出来以后,用这个搞开发真的会很流行

   Copy一段昨晚Rule上来抛砖引玉,帮助想了解M1却不想看E文的朋友。

  规则代码

  1. package warrule   
  2.   
  3. import warunit.Tank;   
  4. import work.Hit;   
  5. import work.Exp;   
  6. import work.Order;   
  7. import java.util.ArrayList;   
  8.   
  9. rule "destroy"  
  10.   salience 1000  
  11.   when   
  12.     tk:Tank(life <= 0 , $id:id)   
  13.     ht:Hit(to == $id ,$s:soruce)   
  14.     xp:Exp(status ==0)   
  15.   then   
  16.     System.out.println("Tank:"+ $id +" 被"+ $s +"击毁!");   
  17.     xp.setCt(1);   
  18.     xp.setId($s);   
  19.     xp.setStatus(1);   
  20.     retract(tk);   
  21.     modify(xp);   
  22.  end   
  23.     
  24. rule "get exp"  
  25.   salience 950  
  26.   when   
  27.      xp:Exp(status == 1,$id:id,$ct:ct)   
  28.      tk:Tank(id==$id,$xp:exp)   
  29.   then   
  30.      xp.setStatus(0);   
  31.      modify(xp);   
  32.      int nxp =$xp + $ct;   
  33.      tk.setExp(nxp);   
  34.      modify(tk);   
  35.      System.out.println("Tank:"+ $id +" 击毁Tank,获取经验:1,现有经验:"+ nxp);   
  36.  end   
  37.     
  38. rule "hit by enemy"  
  39.  salience 900  
  40.  when   
  41.      ht:Hit(status ==1,$t:to,$ht:hit)   
  42.      tk:Tank(id == $t,$lf:life)   
  43.  then   
  44.      int rm = $lf - $ht;   
  45.     // System.out.println(" 剩余生命:" + rm);   
  46.      ht.setStatus(0);   
  47.      tk.setLife(rm);   
  48.      modify(tk);   
  49.      modify(ht);   
  50. end    
  51.   
  52.   
  53.   
  54. rule "hit enemy right"  
  55.  salience 800  
  56.  when   
  57.     ht:Hit(status ==0 )   
  58.     $tk:Tank(run >0 , $x:x,$y:y,$id:id,$t:team,$r:run,$ht:hit)   
  59.     li:ArrayList(size >0) from collect( Tank(x ==($x+1),y==$y,team != $t))   
  60.  then   
  61.     Tank tk1 = (Tank)li.get(0);   
  62.     System.out.print("Tank:"+ $id +" 打击右侧敌人:" + tk1.getId() );   
  63.     ht.setSoruce($id);   
  64.     ht.setTo(tk1.getId());   
  65.     ht.setHit($ht);   
  66.     ht.setStatus(1);   
  67.     $tk.setRun($r-1);   
  68.     modify($tk);   
  69.     modify(ht);   
  70. end   
  71.   
  72.   
  73.   
  74. rule "hit enemy left"  
  75.  salience 800  
  76.  when   
  77.     ht:Hit(status ==0 )   
  78.     $tk:Tank(run >0 , $x:x,$y:y,$id:id,$t:team,$r:run,$ht:hit)   
  79.     li:ArrayList(size >0) from collect( Tank(x ==($x-1),y==$y,team != $t))   
  80.  then   
  81.     Tank tk1 = (Tank)li.get(0);   
  82.     System.out.print("Tank:"+ $id +" 打击左侧敌人:" + tk1.getId() );   
  83.     ht.setSoruce($id);   
  84.     ht.setTo(tk1.getId());   
  85.     ht.setHit($ht);   
  86.     ht.setStatus(1);   
  87.     $tk.setRun($r-1);   
  88.     modify($tk);   
  89.     modify(ht);   
  90. end   
  91.   
  92.   
  93. rule "hit enemy down"  
  94.  salience 800  
  95.  when   
  96.     ht:Hit(status ==0 )   
  97.     $tk:Tank(run >0 , $x:x,$y:y,$id:id,$t:team,$r:run,$ht:hit)   
  98.     li:ArrayList(size >0) from collect( Tank(x ==$x,y==($y+1),team != $t))   
  99.  then   
  100.     Tank tk1 = (Tank)li.get(0);   
  101.     System.out.print("Tank:"+ $id +" 打击下侧敌人:" + tk1.getId() );   
  102.     ht.setSoruce($id);   
  103.     ht.setTo(tk1.getId());   
  104.     ht.setHit($ht);   
  105.     ht.setStatus(1);   
  106.     $tk.setRun($r-1);   
  107.     modify($tk);   
  108.     modify(ht);   
  109. end   
  110.   
  111. rule "hit enemy up"  
  112.  salience 800  
  113.  when   
  114.     ht:Hit(status ==0 )   
  115.     $tk:Tank(run >0 , $x:x,$y:y,$id:id,$t:team,$r:run,$ht:hit)   
  116.     li:ArrayList(size >0) from collect( Tank(x ==$x,y==($y-1),team != $t))   
  117.  then   
  118.     Tank tk1 = (Tank)li.get(0);   
  119.     System.out.print("Tank:"+ $id +" 打击上侧敌人:" + tk1.getId() );   
  120.     ht.setSoruce($id);   
  121.     ht.setTo(tk1.getId());   
  122.     ht.setHit($ht);   
  123.     ht.setStatus(1);   
  124.     $tk.setRun($r-1);   
  125.     modify($tk);   
  126.     modify(ht);   
  127. end   
  128.   
  129. rule "goRight"  
  130.     salience 100  
  131.     when   
  132.     od:Order(status ==1,px:px,py:py);   
  133.         tk:Tank(x < px, run > 0,$x:x,$y:y,$r:run,$id:id )   
  134.         ArrayList(size == 0) from collect( Tank(x ==($x+1),y==$y))   
  135.     then    
  136.         int $nx = $x +1;   
  137.         //System.out.println("Tank:["+ $id +"]向右移动: ["+ $x +","+ $y +"] => ["+ $nx +","+ $y +"]" );   
  138.         tk.setX($nx);   
  139.         tk.setRun($r-1);           
  140.         modify(tk);        
  141. end   
  142.   
  143. rule "goRightDown"  
  144.     salience 150  
  145.     when   
  146.     od:Order(status ==1,px:px,py:py);   
  147.         tk:Tank(x < px, y < py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  148.         ArrayList(size == 0) from collect( Tank(x ==($x+1),y==($y+1)))   
  149.     then    
  150.         int $nx = $x +1;   
  151.         int $ny = $y +1;   
  152.         //System.out.println("Tank:["+ $id +"]向右下移动: ["+ $x +","+ $y +"] => ["+ $nx +","+ $y +"]" );   
  153.         tk.setX($nx);   
  154.         tk.setY($ny);   
  155.         tk.setRun($r-1);           
  156.         modify(tk);        
  157. end   
  158.   
  159. rule "goLeftDown"  
  160.     salience 150  
  161.     when   
  162.         od:Order(status ==1,px:px,py:py);   
  163.         tk:Tank(x >  px, y < py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  164.         ArrayList(size == 0) from collect( Tank(x ==($x-1),y==($y+1)))   
  165.     then    
  166.         int $nx = $x -1;   
  167.         int $ny = $y +1;   
  168.         //System.out.println("Tank:["+ $id +"]向右下移动: ["+ $x +","+ $y +"] => ["+ $nx +","+ $y +"]" );   
  169.         tk.setX($nx);   
  170.         tk.setY($ny);   
  171.         tk.setRun($r-1);           
  172.         modify(tk);        
  173. end   
  174.   
  175. rule "goLeftUp"  
  176.     salience 150  
  177.     when   
  178.         od:Order(status ==1,px:px,py:py);   
  179.         tk:Tank(x >  px, y > py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  180.         ArrayList(size == 0) from collect( Tank(x ==($x-1),y==($y-1)))   
  181.     then    
  182.         int $nx = $x -1;   
  183.         int $ny = $y -1;   
  184.         //System.out.println("Tank:["+ $id +"]向右下移动: ["+ $x +","+ $y +"] => ["+ $nx +","+ $y +"]" );   
  185.         tk.setX($nx);   
  186.         tk.setY($ny);   
  187.         tk.setRun($r-1);           
  188.         modify(tk);        
  189. end   
  190.   
  191. rule "goRightUp"  
  192.     salience 150  
  193.     when   
  194.     od:Order(status ==1,px:px,py:py);   
  195.         tk:Tank(x < px, y > py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  196.         ArrayList(size == 0) from collect( Tank(x ==($x+1),y==($y-1)))   
  197.     then    
  198.         int $nx = $x + 1;   
  199.         int $ny = $y - 1;   
  200.         //System.out.println("Tank:["+ $id +"]向右移动: ["+ $x +","+ $y +"] => ["+ $nx +","+ $y +"]" );   
  201.         tk.setX($nx);   
  202.         tk.setY($ny);   
  203.         tk.setRun($r-1);           
  204.         modify(tk);        
  205. end   
  206.   
  207.   
  208. rule "goLeft"  
  209.     salience 100  
  210.     when   
  211.         od:Order(status ==1,px:px,py:py);   
  212.         tk:Tank(x > px , run > 0,$x:x,$y:y,$r:run,$id:id )   
  213.         ArrayList(size == 0) from collect( Tank(x == ($x-1),y==$y))   
  214.     then    
  215.         int $nx = $x - 1;   
  216.         //System.out.println("Tank:["+ $id +"]向右移动: ["+ $x +","+ $y +"] => ["+ $nx +","+ $y +"]" );   
  217.         tk.setX($nx);   
  218.         tk.setRun($r-1);           
  219.         modify(tk);        
  220. end   
  221.   
  222.   
  223. rule "goDown"  
  224.     salience 100  
  225.     activation-group "down"  
  226.     when   
  227.         od:Order(status ==1,px:px,py:py);   
  228.         tk:Tank(y < py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  229.         ArrayList(size == 0) from collect( Tank(x == $x,y== ($y+1) ))   
  230.     then    
  231.         int $ny = $y +1;   
  232.         //System.out.println("Tank:["+ $id +"]向下移动: ["+ $x +","+ $y +"] => ["+ $x +","+ $ny +"]");   
  233.         tk.setY($ny);   
  234.         tk.setRun($r-1);           
  235.         modify(tk);        
  236. end   
  237.   
  238. rule "goDownTarget"  
  239.     salience 200  
  240.     activation-group "down"  
  241.     when   
  242.         od:Order(status ==0,tm:team,px:px,py:py);   
  243.         tk:Tank(team ==tm, y < py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  244.         ArrayList(size == 0) from collect( Tank(x == $x,y== ($y+1) ))   
  245.     then    
  246.         int $ny = $y +1;   
  247.         //System.out.println("Tank:["+ $id +"]向下移动: ["+ $x +","+ $y +"] => ["+ $x +","+ $ny +"]");   
  248.         tk.setY($ny);   
  249.         tk.setRun($r-1);           
  250.         modify(tk);        
  251. end   
  252.   
  253. rule "goUp"  
  254.     salience 100  
  255.     when   
  256.     od:Order(status ==1,px:px,py:py);   
  257.         tk:Tank(y > py, run > 0,$x:x,$y:y,$r:run,$id:id )   
  258.         ArrayList(size == 0) from collect( Tank(x == $x,y== ($y-1)))   
  259.     then    
  260.         int $ny = $y - 1;   
  261.         //System.out.println("Tank:["+ $id +"]向上移动: ["+ $x +","+ $y +"] => ["+ $x +","+ $ny +"]");   
  262.         tk.setY($ny);   
  263.         tk.setRun($r-1);           
  264.         modify(tk);        
  265. end   
  266.   
  267. rule "atTarget"  
  268.     salience 0  
  269.     when   
  270.     od:Order(status ==1,px:px,py:py);   
  271.         tk:Tank(x == px, y==py,$x:x,$y:y,$r:run,$id:id)   
  272.     then   
  273.         System.out.println("Tank:["+ $id +"]到达中心["+ $x +","+ $y +"],剩余:"+ $r);   
  274. end    

 

 

分享到:
评论
13 楼 luochao3017 2007-06-20  
怎么不把这个思路发出来我们大家看哈,明白了思路,看起来应该容易些,麻烦了>[color=indigo][/color][size=18][/size]
12 楼 sonic_yj 2007-04-12  
Godlikeme 写道
if else并没有错。
能不能作为策略抽出来业务规则,可以看看oz6以前的文章。


3Q, ozzzzzz老大的Blog, 正在拜读
11 楼 Godlikeme 2007-04-12  
if else并没有错。
能不能作为策略抽出来业务规则,可以看看oz6以前的文章。
10 楼 sonic_yj 2007-04-12  
Godlikeme 写道
sonic_yj 写道
Godlikeme 写道
这么用和脚本语言有什么区别呢?

使用规则引擎的核心问题是那些逻辑可以抽象出来作为策略,使用何种规则实现这种策略。


这位老兄,我写的似乎有些就是规则吧,我并没有贴出java描述基本的Tank类来。和用脚本还是有些差别吧。确实Robocode的自动开火和移动是封装了的。但不能说明这些东西不包含规则。

难道发现敌人就开炮不算策略么?  


在我看来这些只能属于逻辑判断。


   想了解一下你说的规则,能举个例说明并比较一下么?

    我觉得能解决逻辑判断问题也很爽,我最怕的就是调来调去的if else,所以才想到用drools
9 楼 Godlikeme 2007-04-12  
sonic_yj 写道
Godlikeme 写道
这么用和脚本语言有什么区别呢?

使用规则引擎的核心问题是那些逻辑可以抽象出来作为策略,使用何种规则实现这种策略。


这位老兄,我写的似乎有些就是规则吧,我并没有贴出java描述基本的Tank类来。和用脚本还是有些差别吧。确实Robocode的自动开火和移动是封装了的。但不能说明这些东西不包含规则。

难道发现敌人就开炮不算策略么?  


在我看来这些只能属于逻辑判断。
8 楼 sonic_yj 2007-04-12  
dada 写道
sonic_yj 写道
eyejava 写道
引用

现在可以不重新编辑,只是改改文本文件就达到调整Control层的效果

修改drl 后会自动装载?

milestone还是不太敢用,因为是unstable版本,而且他们说根据这些新的features 可以把版本叫做 4.0了。


我的Drl用ReadRule从Reader读进去的,我现在规则没有保持的,用的时候加载。规则下次执行的时候就重新读自然就变了,我打算自己分拆一下,放到数据库里面管理,需要的时候拿出来组合就可以了。


BTW:你们哪位爱好Drools的老大申请一个Drools圈子吧   讨论起来文章看起在一起爽点,我初级会员没资格申请 

我和robbin申请了圈子了


hehe,专家冒出来了,空了开个贴讨论讨论都在怎么用Drools吧,互相启发一下 
7 楼 dada 2007-04-12  
sonic_yj 写道


BTW:你们哪位爱好Drools的老大申请一个Drools圈子吧   讨论起来文章看起在一起爽点,我初级会员没资格申请 


我和robbin申请了圈子了
引用

我的Drl用ReadRule从Reader读进去的,我现在规则没有保持的,用的时候加载。规则下次执行的时候就重新读自然就变了,我打算自己分拆一下,放到数据库里面管理,需要的时候拿出来组合就可以了。

规则运行时重新构建ruleBase,还是在启动时限定ruleBase一直是一个两难的问题。
如果我们采用动态组建规则集,运行时生成ruleBase的时候对性能有较大的影响。
在我的机器上整个构建过程需要大约1-2s的时间,在一个商业规则分解成许多小块规则集的情况下,构建ruleBase对业务响应时间的印象是致命的。
现在项目中我是在构建时产生ruleBase的单例,通过aop拦截规则的修改,从而产生新的ruleBase。
当然这样的做法并不够灵活,你需要预先知道有哪些规则集的组合。
6 楼 sonic_yj 2007-04-12  
eyejava 写道
引用

现在可以不重新编辑,只是改改文本文件就达到调整Control层的效果

修改drl 后会自动装载?

milestone还是不太敢用,因为是unstable版本,而且他们说根据这些新的features 可以把版本叫做 4.0了。


我的Drl用ReadRule从Reader读进去的,我现在规则没有保持的,用的时候加载。规则下次执行的时候就重新读自然就变了,我打算自己分拆一下,放到数据库里面管理,需要的时候拿出来组合就可以了。


BTW:你们哪位爱好Drools的老大申请一个Drools圈子吧   讨论起来文章看起在一起爽点,我初级会员没资格申请 
5 楼 eyejava 2007-04-12  
引用

现在可以不重新编辑,只是改改文本文件就达到调整Control层的效果

修改drl 后会自动装载?

milestone还是不太敢用,因为是unstable版本,而且他们说根据这些新的features 可以把版本叫做 4.0了。
4 楼 sonic_yj 2007-04-11  
Godlikeme 写道
这么用和脚本语言有什么区别呢?

使用规则引擎的核心问题是那些逻辑可以抽象出来作为策略,使用何种规则实现这种策略。


这位老兄,我写的似乎有些就是规则吧,我并没有贴出java描述基本的Tank类来。和用脚本还是有些差别吧。确实Robocode的自动开火和移动是封装了的。但不能说明这些东西不包含规则。

难道发现敌人就开炮不算策略么?  
3 楼 Godlikeme 2007-04-11  
这么用和脚本语言有什么区别呢?

使用规则引擎的核心问题是那些逻辑可以抽象出来作为策略,使用何种规则实现这种策略。
2 楼 sonic_yj 2007-04-10  
本身就是Java的啊,可以直接写Java,无非多了些缩写
1 楼 blackbat 2007-04-09  
可否转译为java?

相关推荐

Global site tag (gtag.js) - Google Analytics