翔鹰帝国网|帝国时代论坛|帝国时代系列|神话时代
 找回密码
 注册翔鹰会员(昵称)
搜索
查看: 2764|回复: 15

[教程] 1.4 AI 練習實例:遮蔽建築效果

 关闭 [复制链接]

109

主题

14

精华

6万

积分

教皇

特洛伊大叔

耕战
10480
鹰币
1610
天龙币
126
回帖
2347

翔鹰建站十周年纪念章二级帝国勋章一级翔鹰勋章二级嘉禾勋章大评论家小评论家创意工坊通行证第十一届火箭筒杯最佳战役

附庸关系10
发表于 2016-3-23 01:48:12 | 显示全部楼层 |阅读模式
本帖最后由 这只话唠菜鹰是路人 于 2016-11-22 00:40 编辑

前言:

在製作傭兵的歲月裡的某一天,(帥氣的)哈羅德在QQ上問了一個問題:可否用1.4的AI寫出類似以下的判斷語句,這裡我用一個生活化的例子來說明:

在遙遠的未來,狂熊終於交了一個女友。

但是這個女友相當霸道,不准狂熊繼續打帝國和上翔鷹。

可憐的狂熊只好在女友視線看不到的地方打帝國。

一日,這對情侶來到一個環型的公園,

公園中間樹木茂盛,看不到對面。

狂熊就趁這個機會逃到了對面:


A:狂熊女友,B:狂熊



現在狀況是:因為中間樹木茂密遮住視野的關係,狂熊女友看不到狂熊


但是萬一狂熊或是他女友移動了相對位置,造成狂熊和女友間沒有遮蔽物:


那麼狂熊就會被女友發現,再也不能玩帝國了。




這就是(帥氣的)哈羅德當時所問的問題核心。雖然他當時沒有想到這麼完美的例子。



當時Ru和我提出了不同的想法,而我簡略的動手寫了一下AI來測試。當時的效果並不太理想,加上因為在趕火十一截止的關係,最後不了了之。因此這個想法一直到現在才發表出來。我必須強調的是,這個AI語句可能還有相當大的改進空間,所以也許有更多戰役制作者看完後可以嘗試改良。

(本文基礎建立於條頓武士的[教程] 闪闪发光新时代——翔鹰1.4版 新AI效果示例(第二弹)一文。請初學者先學習該文內容再閱讀本文。此外,本文需要一些基礎數學知識。國小學生可以請教年長的朋友關於其中的知識,以達到寓教於樂的雙重效果。)


想法:


我的想法如下:我們先假設中間的遮蔽物(綠色區域)為圓形,圓心為P,半徑為1單位。並同時假設狂熊位置為Q、狂熊女友位置為R。則我們可以假設三角形PQR的各邊為A、B和C,如下面的簡圖所示:


對於Q點而言,除非R落入下圖所畫的灰色區域,不然必定會被R察覺:


因此Q被R"發現"的充要條件為:1. 角PQR>角PQS 或 2. QR<QS。假設角PQR=θ1、角PQS=θ2,則θ1>θ2在皆為銳角的條件之下,當且僅當

cosθ1< cosθ2;

因此使用餘弦定理加上AI的計算距離語句,我們就可以寫出這個AI。


AI碼:

下面這一段是AI碼,我會逐一解說每段的意義。以下我們假設這堆障礙物的半徑為2格(設為一格會有點問題,這我們之後在予以討論)。原始碼如下



  1. (defconst position-object 12)
  2. (defconst P-1 100)
  3. (defconst P-2 101)
  4. (defconst Q-1 102)
  5. (defconst Q-2 103)
  6. (defconst R-1 104)
  7. (defconst R-2 105)
  8. (defconst Asq 201)
  9. (defconst Bsq 202)
  10. (defconst Csq 203)
  11. (defconst ABsq 204)
  12. (defconst AXsq 205)
  13. (defconst nu-1 206)
  14. (defconst nu-2 207)
  15. (defconst k-1 208)
  16. (defconst k-2 209)
复制代码


我們一段段來看:首先第一段是定義一些變數:


  1. (defconst position-object 12)
  2. (defconst P-1 100)
  3. (defconst P-2 101)
  4. (defconst Q-1 102)
  5. (defconst Q-2 103)
  6. (defconst R-1 104)
  7. (defconst R-2 105)
  8. (defconst Asq 201)
  9. (defconst Bsq 202)
  10. (defconst Csq 203)
  11. (defconst ABsq 204)
  12. (defconst AXsq 205)
  13. (defconst nu-1 206)
  14. (defconst nu-2 207)
  15. (defconst k-1 208)
  16. (defconst k-2 209)
复制代码

(P-1,P-2) 為 P 點座標,(Q-1,Q-2)為Q點座標,(R-1,R-2)為R點座標。我們要計算的cosθ1根據餘弦定理為

cosθ1=(A^2+B^2-C^2)/2AB;
另一方面,由於cosθ2可以直接由直角三角形QPS得到,我們有
(cosθ2)^2=A^2-4/A^2。
這裡一個小問題是,1.4的AI只能記憶整數,因此像是除法這類會造成小數的運算都必須避免。因此我們假設
Asq=A^2;
Bsq=B^2;
Csq=C^2;
ABsq=(2AB)^2;
AXsq=A^2;
nu-1=A^2-4;
nu-2=(A^+B^2-C^2)^2;
k-3=A^2-4=QS距離;
則不等式 cosθ1> cosθ2的充要條件為 nu-2/ABsq > nu-1/AXsq。為了避免除法,兩邊通分得到:
(nu-2)*(AXsq)>(nu-1)*(ABsq)。
我們假設式子兩邊的量為k-1和k-2。這就是這一段代碼的變數定義。

  1. (defrule
  2. (true)
  3. =>
  4. (set-goal 1 0)
  5. (disable-self)
  6. )

  7. (defrule
  8. (true)
  9. =>
  10. (up-set-target-by-id c: 0)
  11. (up-get-point position-object P-1)
  12. (up-set-target-by-id c: 1)
  13. (up-get-point position-object Q-1)
  14. (up-set-target-by-id c: 2)
  15. (up-get-point position-object R-1)
  16. )

  17. (defrule
  18. (true)
  19. =>
  20. (up-get-point-distance P-1 Q-1 Asq)
  21. (up-get-point-distance Q-1 R-1 Bsq)
  22. (up-get-point-distance P-1 R-1 Csq)
  23. )

  24. (defrule
  25. (true)
  26. =>
  27. (up-modify-goal ABsq g:= Asq)
  28. (up-modify-goal ABsq g:* Bsq)
  29. (up-modify-goal ABsq g:* ABsq)
  30. (up-modify-goal ABsq c:* 4)
  31. (up-modify-goal Asq g:* Asq)
  32. (up-modify-goal Bsq g:* Bsq)
  33. (up-modify-goal Csq g:* Csq)
  34. )
复制代码




這一段是在計算Asq、Bsq、Csq。首先,(set-goal 1 0)這一段是在設置默認狀態,不懂的可以參考條頓武士的那篇文章。第二段是記憶 P、Q、R的座標。然後 "(up-get-point-distance P-1 Q-1 Asq)" 是指把P到Q的距離記錄為Asq。到此為止都是根據參考條頓武士的文章直接應用。


現在,記得我們的Asq是A平方。所以我們記得在最後必須再把這些數值都平方一遍。ABsq則是(2AB)^2,所以就是如下運算:
(up-modify-goal ABsq g:= Asq)

(up-modify-goal ABsq g:* Bsq)

(up-modify-goal ABsq g:* ABsq)

(up-modify-goal ABsq c:* 4)



  1. (defrule
  2.              (true)
  3. =>
  4. (up-modify-goal nu-1 g:= Asq)
  5. (up-modify-goal nu-1 g:+ Bsq)
  6. (up-modify-goal nu-1 g:- Csq)
  7. (up-modify-goal nu-1 g:* nu-1)
  8. (up-modify-goal nu-2 g:= Asq)
  9. (up-modify-goal nu-2 c:- 4)
  10. (up-modify-goal AXsq g:= Asq)
  11. )
复制代码

這段很容易理解,基本上我們以經有所有nu-1、nu-2 所需要的數值了,只要計算即可。然後,把k-1、k-2計算出來並且比較大小,最後記得考慮QS與QR的距離關係,也就是k-3與Bsq的大小關係。(cc-add-resource ... )只是用於外部觸發方便,等到需要製做戰役時可以用這些資源編寫觸發。

結語:
這個AI目前還有許多可以探討的層面。有一個方面是"區域可否再縮小"。這個我覺得很難,原因是因為AI記算距離仍舊以格為單位。因此小範圍的情況下在一格範圍裡的資訊對於AI來說是沒有差別的。但是在玩家眼中可能有非常大的差距。



附上狂熊與女友的小劇場,用上述AI製成的小演示場景。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册翔鹰会员(昵称)

x

评分

参与人数 1耕战 +50 鹰币 +200 收起 理由
一窍不开 + 50 + 200 原创精华

查看全部评分

傭兵外傳-安帝哥崛起 2020十二月發表
傭兵-完整版已公佈下載請點此處
回复

使用道具 举报

109

主题

14

精华

6万

积分

教皇

特洛伊大叔

耕战
10480
鹰币
1610
天龙币
126
回帖
2347

翔鹰建站十周年纪念章二级帝国勋章一级翔鹰勋章二级嘉禾勋章大评论家小评论家创意工坊通行证第十一届火箭筒杯最佳战役

附庸关系10
 楼主| 发表于 2016-3-23 02:04:17 | 显示全部楼层
本帖最后由 tryotryotryo 于 2016-3-24 00:23 编辑

感謝一竅不開找到一個距離檢測的問題,已修正。
祝狂熊幸福。以上AI碼可以自由取用,版權沒有,抄襲不究。
傭兵外傳-安帝哥崛起 2020十二月發表
傭兵-完整版已公佈下載請點此處
回复

使用道具 举报

454

主题

65

精华

25万

积分

教皇

耕战
42935
鹰币
1441115
天龙币
10
回帖
5687

翔鹰建站十周年大纪念章特级帝国勋章特级翔鹰勋章特级嘉禾勋章一级皇家勋章鹰之智者蛟龙勋章十字军勋章大冒险家狂熊勋章

附庸关系2
发表于 2016-3-23 02:40:34 | 显示全部楼层
為什麼又是我中槍……
除了 set-goal 1 和 di 外, 其他似乎都應該用 up-modify-goal g:=

点评

晚點改。  发表于 2016-3-23 11:37
回复

使用道具 举报

144

主题

4

精华

1万

积分

宗主教

耕战
2738
鹰币
531028
天龙币
47
回帖
14734

翔鹰建站十周年纪念章二级帝国勋章一级嘉禾勋章翔六水王创意工坊通行证

附庸关系12
发表于 2016-3-23 05:01:39 | 显示全部楼层
本帖最后由 一窍不开 于 2016-3-23 05:10 编辑

如果只是比较k-1与k-2的大小的话,完全可以用(up-compare-goal k-1 g:< k-2)替代加减步骤。

还有就是楼上狂叔说的小问题,以及似乎有一点小小的计算错误?

我试着改了改,并且加上了距离检测,弄成了完整的AI,或许可以参考一下?(并未测试,并且默认狂叔不会躲在树林里打帝国)
  1. (defconst position-object 12)
  2. (defconst P-1 100)
  3. (defconst P-2 101)
  4. (defconst Q-1 102)
  5. (defconst Q-2 103)
  6. (defconst R-1 104)
  7. (defconst R-2 105)
  8. (defconst A 201)
  9. (defconst B 202)
  10. (defconst C 203)
  11. (defconst AB 204)
  12. (defconst nu-1 206)
  13. (defconst nu-2 207)
  14. (defconst k-1 208)
  15. (defconst k-2 209)
  16. (defconst tan 300)


  17. (defrule
  18.         (true)
  19. =>
  20.         (set-goal 1 0)
  21.         (disable-self)
  22. )

  23. (defrule
  24.         (true)
  25. =>
  26. (up-set-target-by-id c: 0)
  27. (up-get-point position-object P-1)
  28. (up-set-target-by-id c: 1)
  29. (up-get-point position-object Q-1)
  30. (up-set-target-by-id c: 2)
  31. (up-get-point position-object R-1)
  32. )

  33. (defrule
  34.         (true)
  35. =>
  36. (up-get-point-distance P-1 Q-1 A)
  37. (up-get-point-distance Q-1 R-1 B)
  38. (up-get-point-distance P-1 R-1 C)
  39. )

  40. (defrule
  41.         (true)
  42. =>
  43. (up-modify-goal AB g:= A)
  44. (up-modify-goal AB g:* B)
  45. (up-modify-goal AB g:* AB)
  46. (up-modify-goal A g:* A)
  47. (up-modify-goal B g:* B)
  48. (up-modify-goal C g:* C)
  49. )

  50. (defrule
  51.         (true)
  52. =>
  53. (up-modify-goal nu-1 g:= A)
  54. (up-modify-goal nu-1 g:+ B)
  55. (up-modify-goal nu-1 g:- C)
  56. (up-modify-goal nu-1 g:* nu-1)
  57. (up-modify-goal nu-2 g:= A)
  58. (up-modify-goal nu-2 g:+ A)
  59. (up-modify-goal nu-2 c:- 2)
  60. (up-modify-goal nu-2 g:* nu-2)
  61. )

  62. (defrule
  63.         (true)
  64. =>
  65. (up-modify-goal k-1 g:= nu-1)
  66. (up-modify-goal k-1 g:* A)
  67. (up-modify-goal k-2 g:= AB)
  68. (up-modify-goal k-2 g:* nu-2)
  69. )

  70. (defrule
  71.         (true)
  72. =>
  73.         (up-modify-goal tan g:= A)
  74.         (up-modify-goal tan c:- 1)
  75. )

  76. (defrule
  77.         (goal 1 0)
  78.         (or
  79.                 (up-compare-goal k-1 g:< k-2)
  80.                 (up-compare-goal B g:< tan )
  81.         )
  82. =>
  83.         (chat-to-all "Be DETECTED!")
  84.         (cc-add-resource gold 1)
  85.         (set-goal 1 1)
  86. )

  87. (defrule
  88.         (goal 1 1)
  89.         (up-compare-goal k-1 g:>= k-2)
  90.         (up-compare-goal B g:>= tan )
  91. =>
  92.         (chat-to-all "In the shadow...")
  93.         (cc-add-resource wood 1)
  94.         (set-goal 1 0)
  95. )
复制代码


当然如果是方形的建筑这个AI就不适用了,还需要另建模型。

点评

你是對的,需要檢測距離。  发表于 2016-3-23 23:49
你可以測試。但我覺得距離檢測是畫蛇添足。  发表于 2016-3-23 11:36
回复

使用道具 举报

125

主题

1

精华

1万

积分

圣徒

耕战
1482
鹰币
2260
天龙币
0
回帖
1518

三级帝国勋章创意工坊通行证翔鹰建站十周年纪念章活跃者

附庸关系0
发表于 2016-3-23 12:43:19 | 显示全部楼层
这个未来,遥不可及啊,23333
回复

使用道具 举报

83

主题

9

精华

11万

积分

宗主教

耕战
21563
鹰币
10968
天龙币
281
回帖
2821

翔鹰建站十周年纪念章三级帝国勋章特级翔鹰勋章三级嘉禾勋章雄鹰勋章第九届火箭筒杯优秀战役第九届火箭筒杯最佳新人第十届火箭筒杯最佳战役第十二届火箭筒杯最佳战役

附庸关系2
发表于 2016-3-23 13:46:56 | 显示全部楼层
非常不错!理论上实现的算法有很多,比如检测圆心到两人连线的距离小于半径,也是挺复杂的,不过最关键的是“精确度”的问题,ai貌似是四舍五入到个位的……我觉得最好是能找到精确度最高的算法(不知道理论可不可行)……

点评

ai 只能存整數位。  发表于 2016-3-23 13:51
Annie's Wonderland
第一章:海与山(已发布,点击进入)
第二章:杏花宵(已发布,点击进入)
第三章:沙漠之星(先行版已发布,点击进入)
终章:风神的歌谣(地图0% 触发0/1000 状态:未开始)
回复

使用道具 举报

7

主题

0

精华

127

积分

男爵

耕战
0
鹰币
131
天龙币
0
回帖
53
附庸关系0
发表于 2016-3-23 15:32:18 | 显示全部楼层
Howerds 发表于 2016-3-23 13:46
非常不错!理论上实现的算法有很多,比如检测圆心到两人连线的距离小于半径,也是挺复杂的,不过最关键的是 ...

昨晚玩海与山差点玩通宵,惊为天作,给萌萌哒的作者点赞

点评

不胜荣幸XD  发表于 2016-3-25 13:19
回复

使用道具 举报

109

主题

14

精华

6万

积分

教皇

特洛伊大叔

耕战
10480
鹰币
1610
天龙币
126
回帖
2347

翔鹰建站十周年纪念章二级帝国勋章一级翔鹰勋章二级嘉禾勋章大评论家小评论家创意工坊通行证第十一届火箭筒杯最佳战役

附庸关系10
 楼主| 发表于 2016-3-23 22:11:26 | 显示全部楼层
258791 发表于 2016-3-23 15:32
昨晚玩海与山差点玩通宵,惊为天作,给萌萌哒的作者点赞

哈羅德先生、哈羅德先生,請到七樓櫃台領回你走失的粉絲 @Howerds

评分

参与人数 1鹰币 +1 收起 理由
Howerds + 1 Tips

查看全部评分

傭兵外傳-安帝哥崛起 2020十二月發表
傭兵-完整版已公佈下載請點此處
回复

使用道具 举报

76

主题

3

精华

7352

积分

圣徒

耕战
923
鹰币
2341
天龙币
254
回帖
1297

十字军勋章翔鹰建站十周年纪念章一级翔鹰勋章二级帝国勋章雄鹰勋章

附庸关系0
发表于 2016-3-23 22:57:29 本帖来自手机 | 显示全部楼层
实在太屌
回复

使用道具 举报

109

主题

14

精华

6万

积分

教皇

特洛伊大叔

耕战
10480
鹰币
1610
天龙币
126
回帖
2347

翔鹰建站十周年纪念章二级帝国勋章一级翔鹰勋章二级嘉禾勋章大评论家小评论家创意工坊通行证第十一届火箭筒杯最佳战役

附庸关系10
 楼主| 发表于 2016-3-26 01:29:31 | 显示全部楼层
是不是寫太難都乏人問津。
傭兵外傳-安帝哥崛起 2020十二月發表
傭兵-完整版已公佈下載請點此處
回复

使用道具 举报

14

主题

0

精华

742

积分

伯爵

耕战
92
鹰币
460
天龙币
0
回帖
158

翔鹰建站十周年纪念章

附庸关系1
发表于 2016-4-9 14:27:55 | 显示全部楼层
回复

使用道具 举报

本版积分规则

排行榜|小黑屋|翔鹰帝国

GMT+8, 2024-3-28 23:33 , Processed in 0.152901 second(s), 128 queries , File On.

Powered by Hawk Studio  QS Security Corp.® Licensed

Copyright © 2001-2023, Hawkaoe.net All Rights Reserved

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