设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4054|回复: 13
打印 上一主题 下一主题

[已经过期] SLG的敵人AI 偽代碼算法,求個優化思路

[复制链接]

Lv4.逐梦者

水月·镜花

梦石
10
星屑
403
在线时间
1181 小时
注册时间
2005-10-22
帖子
1183

开拓者

跳转到指定楼层
1
发表于 2013-8-1 16:22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 电子最终龙 于 2013-8-1 18:52 编辑

每次寫AI的時候都會覺得自己的遊戲AI課程白上了……orz
這次要做SLG,寫了遍歷之後發現技能多移動範圍廣的單位行動居然能卡個兩三秒
無奈之下暫時模仿貪婪算法寫了個最弱目標優先
運算時間沒錯是最小化了……
但是少了技能預讀,AI不會找人多的位置放技能傷害最大化,不會補刀,也不會卡敵人的攻擊距離……
總之趕腳好低端{:2_271:}

求吐槽,求指點,求優化,各種求{:2_272:}
  1. # AI主流程。battler: 行動方,map: 當前地圖站位分佈集
  2. def 最弱優先攻擊(battler, map)
  3.   route = move_to(battler, 搜索防禦最低目標(battler))
  4.   if battler.未施放增益法術?
  5.     skill_id = battler.增益法術id
  6.        return 生成行動(route, 增益法術id)
  7.   elsif battler.生命小於10%?
  8.       if battler.能治療?
  9.         return 生成行動(route, 治療id)
  10.       end
  11.       if battler.有藥吃?
  12.         return 生成行動(route, 吃藥id)
  13.       end
  14.   end
  15.   if 範圍內無可用目標
  16.   return 生成行動(route, 加速技能id)
  17.   end
  18.   skill_id, target_pos = 計算攻擊技能和落點(battler, 搜索防禦最低目標(battler))
  19.   return 生成行動(route, skill_id, target_pos)
  20. end

  21. # 搜索battler的移動+攻擊範圍內防禦最低的敵人,返回最接近目標的可移動座標
  22. # battler: 當前行動方,map: 地圖站位分佈集
  23. def 搜索防禦最低目標(battler, map)
  24.     if 範圍內無可用目標
  25.     # 搜索最近目標target,算法略
  26.     return target.x, target.y
  27.   else # 範圍內有可用目標時
  28.   # 計算範圍內所有目標中防禦最低的target, 算法略
  29.   return target.x, target.y
  30. end

  31. # 貪婪尋路計算移動路點集
  32. # battler: 行動方,x, y: 目標路點座標
  33. def move_to(battler, x, y)
  34.   #創建路點集route
  35.   route = []
  36.   # 計算路點集,算法略
  37.   return route
  38. end
复制代码

Lv2.观梦者

梦石
0
星屑
687
在线时间
791 小时
注册时间
2011-10-20
帖子
2394

开拓者

2
发表于 2013-8-1 16:40:31 | 只看该作者
应该首先考虑找小孩和女人,为啥,TM最弱。
                                      -------------------------图灵原理
欢迎点此进入我的egames.wink.ws,有RMQQ堂等

[url=http://rpg.blue/thread-317273-1-1.html]短篇八-赶选

http://yun.baidu.com/share/link?shareid=2158225779&uk=169642147&third=0


历险ARPG赢回你的疆域新的战斗模式?…………点击这里:[宋乱贼狂 for QQ堂]
http://rpg.blue/group-368-1.html
programing ....?
[url=http://rpg.blue/thrd-234658-1-1.html]
回复 支持 反对

使用道具 举报

Lv4.逐梦者

水月·镜花

梦石
10
星屑
403
在线时间
1181 小时
注册时间
2005-10-22
帖子
1183

开拓者

3
 楼主| 发表于 2013-8-1 16:49:40 | 只看该作者
end55rpg 发表于 2013-8-1 18:40
应该首先考虑找小孩和女人,为啥,TM最弱。
                                      --------------------- ...

已經包含搜索最弱目標的方法了,現在缺的是傷害最大化以及補刀的計算……
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

4
发表于 2013-8-1 17:13:08 | 只看该作者
得把每个行动都遍历一遍,记录下每个行动的结果(包含移动、伤害与目标等信息),按行动的目标来分组。
然后在计算每个目标所受到的所有行动组合能得到的最大伤害(通常就选取敌方单位造成最高伤害的技能就行了),如果伤害足够死亡的话,AI就集体采取这种行动。
不过这样集火玩家,玩家会火大的吧。

点评

似乎忽略了卡位的影响,再加这个计算量就大了 - -b  发表于 2013-8-1 17:16
回复 支持 反对

使用道具 举报

Lv4.逐梦者

水月·镜花

梦石
10
星屑
403
在线时间
1181 小时
注册时间
2005-10-22
帖子
1183

开拓者

5
 楼主| 发表于 2013-8-1 18:01:06 | 只看该作者
Sion 发表于 2013-8-1 19:13
得把每个行动都遍历一遍,记录下每个行动的结果(包含移动、伤害与目标等信息),按行动的目标来分组。
然 ...

讓AI卡玩家的攻擊距離運算量就真的喪心病狂了
行動遍歷的話……
假設敵人有3個範圍攻擊技能,遊戲設定技能允許打空氣
技能的選取距離是3,傷害範圍是2,那麼一個技能的有效落點就有25個座標
3個技能就是25*3=75個座標
然後敵人移動範圍是5且無不可通行路點,則可移動座標有(1+3+5+7+9)*2+11=61個
那麼有效行動組合就有75*61=4575個……
於是AI要運算4575種走法再選取最優解

所以才希望有比遍歷更效率的算法啊

点评

卡位是指敌方单位行动之后,可能对敌方其它单位造成阻碍。因此不能简单的先遍历所有敌军的行动。  发表于 2013-8-1 18:48
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

6
发表于 2013-8-1 18:39:14 | 只看该作者
本帖最后由 Sion 于 2013-8-1 18:42 编辑

AOE释放思路

技能伤害范围为2,应该指包含中心以及周围4点的,一个十字形的伤害吧?
如果友军的数目不是太多,可以这样(假设20个)
1、先绘制移动路径,记录下可以抵达的点。(一次绘制路径计算消耗)
2、每个友军加上它周围4个点(就是跟技能范围一样的图形)在这些点上测试技能伤害。测试之前先排除不
     可能释放技能的点。大概就是看技能释放点周围,根据技能射程划定的范围内,是否包含可以抵达的点。
     (计算次数为 20*5*3,其实可以根据距离先排除一些肯定够不到的目标。)
3、选择伤害量最高的行动即可。

点评

对了,友军周围的点可能会有重叠的,也可以直接排除掉。  发表于 2013-8-1 18:44
回复 支持 反对

使用道具 举报

Lv4.逐梦者

水月·镜花

梦石
10
星屑
403
在线时间
1181 小时
注册时间
2005-10-22
帖子
1183

开拓者

7
 楼主| 发表于 2013-8-1 19:43:41 | 只看该作者
本帖最后由 电子最终龙 于 2013-8-1 22:17 编辑
Sion 发表于 2013-8-1 20:39
AOE释放思路

技能伤害范围为2,应该指包含中心以及周围4点的,一个十字形的伤害吧?


選取有效目標為中心,傷害範圍為半徑的座標集,計算座標集中最優落點,然後以最優落點為中心計算有效移動座標,無有效移動座標則返回,排除最優落點重新搜索最優落點這樣?
唔……假設AI有3個射程3範圍2的技能,有效範圍內目標有10個,則需要模擬運算40*3=120次并進行排序,再進行最多120次的移動路點匹配
運算量確實少了,受教

PS:因為遊戲是半即時讀條,不考慮AI互相配合的話也沒有卡位不卡位的問題了。
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

8
发表于 2013-8-1 20:13:39 | 只看该作者
本帖最后由 Sion 于 2013-8-1 20:17 编辑
电子最终龙 发表于 2013-8-1 19:43
選取有效目標為中心,傷害範圍為半徑的座標集,計算座標集中最優落點,然後以最優落點為中心計算有效移動 ...


计算伤害之前先计算是否可以对该点释放,最坏的情况每个技能释放点要遍历移动路径点 25 次。
可以根据你的需要来选择,通常就把路径点集按照移动的步数排序,优先尝试移动距离比较短的那些点。
只要可以释放技能,就终止尝试,记录当前路径点的坐标。
这样,先得到可以释放技能的点,然后再计算伤害,把<伤害、移动目标点、技能释放点>捆绑存储。
然后找出伤害最高的,同时就可以读取到移动的目标点与技能释放的坐标。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

水月·镜花

梦石
10
星屑
403
在线时间
1181 小时
注册时间
2005-10-22
帖子
1183

开拓者

9
 楼主| 发表于 2013-8-1 23:02:18 | 只看该作者
Sion 发表于 2013-8-1 22:13
计算伤害之前先计算是否可以对该点释放,最坏的情况每个技能释放点要遍历移动路径点 25 次。
可以根据你 ...

如果 補刀 > 最大傷害 > 最近距離 這個優先等級呢?
那麼還是應該先做傷害模擬,再賦值選施放點集吧

点评

不可能释放技能的点不用计算伤害,上面那个应该没有逻辑问题。  发表于 2013-8-1 23:10
那捆绑存储的数据再代入是否杀死单位好了。优先判断是否有单位死亡,然后就是最大伤害。  发表于 2013-8-1 23:08
回复 支持 反对

使用道具 举报

Lv2.观梦者


  • 更新完成啦

梦石
0
星屑
799
在线时间
6267 小时
注册时间
2006-6-7
帖子
8462
10
发表于 2013-8-2 15:07:01 | 只看该作者
我觉得SLG好多AI都大同小异,没什么比较特别的地方,我觉得应该加一个统一的“点杀” “团护”这样的分歧判断,利用多种AI结合的力量的话,AI的难度会提高好几个档次,也会让玩家觉得更有趣
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 10:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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