.
我昨天在 PTT 發現了兩篇文章由 ddavid 網友所寫Re: [SC2] AI 腳本開發最簡入門
Re: [SC2] AI 腳本開發最簡入門2
讓我很感興趣,於是就開始著手編寫 星海2 AI
我發現其實可以讓電腦 AI 互打,而自己當裁判觀戰
方法如下方圖片
.
在自己的欄位上按滑鼠右鍵選 "加入裁判"
就會變成下圖
.
成功的讓自己當裁判,看電腦對打!
接著我試著修改目前最著名的 AI : StarCrack AI v6.1.1
成功的控制了電腦神族早期的發展,讓電腦的早期發展路線固定!
接著我想到,我可以在星海2 地圖編輯器發表之前,試著研究跟發表 AI
當然我不能發展目前別人已經發展的路線 ( 最智能的電腦對戰 AI )
我選擇了一個新的方向 --> ( 不開分礦,最強防守 AI )
目標達成如下幾點:
1.電腦不開分礦
2.電腦用最少的資源達到最大的防守效果
3.電腦防守時間越久得分越高
4.玩家在3分鐘內攻下電腦,電腦會打字說:你這次進攻得分 95
玩家在6分鐘內攻下電腦,電腦會打字說:你這次進攻得分 90
玩家在9分鐘內攻下電腦,電腦會打字說:你這次進攻得分 85
依此列推,
( 跟電腦對打,就像在玩 RPG 地圖 )
接著我構思了神族防守型電腦的發展路線:
1.將出口處蓋滿光砲
2.接著發展 高階聖堂武士 跟研發 幽能風暴
3.生產 聖母艦 後接著生產 航空母艦
其實要突破這防守也很簡單,用人類的核彈就能簡單攻入
不過到底最快多久能攻入也不清楚
接著下方是我目前的程式碼,不過目前碰到這幾個問題:
1.目前無法指定電腦蓋光砲的位置
2.無法使用 AISetStock(player, 1, c_PB_TemplarArchive); 要求電腦蓋 聖堂文庫
3.不清楚如何告知電腦升級 光砲防禦
4.如何判斷電腦自己幾分鐘滅亡,並且適當的打字告知玩家得分多少!
.
void ProtossOpenGnd0 (int player) {
int nProbe = AITechCount(player, c_PU_Probe, c_techCountInProgressOrBetter);
int nZealot = AITechCount(player, c_PU_Zealot, c_techCountInProgressOrBetter);
int nStalker = AITechCount(player, c_PU_Stalker, c_techCountInProgressOrBetter);
int nDisruptor = AITechCount(player, c_PU_Disruptor, c_techCountInProgressOrBetter);
int nPylon = AITechCount(player, c_PB_Pylon, c_techCountInProgressOrBetter);
int nGateway = AITechCount(player, c_PB_Gateway, c_techCountInProgressOrBetter);
int nForge = AITechCount(player, c_PB_Forge, c_techCountInProgressOrBetter);
int nCyberneticsCore = AITechCount(player, c_PB_CyberneticsCore, c_techCountInProgressOrBetter);
int nTwilightCouncil = AITechCount(player, c_PB_TwilightCouncil, c_techCountInProgressOrBetter);
AIClearStock(player);
AISetStock(player, 1, c_PB_Nexus);
AISetStock(player, 8, c_PU_Probe);
AISetStock(player, 1, c_PB_Pylon);
// 最基本開始一主堡,八工兵,一水晶
if(nPylon >= 1) {
AISetStock(player, 11, c_PU_Probe);
AISetStock(player, 1, c_PB_Forge); }
// 如果水晶蓋好,就11工兵,一冶煉廠
if(nForge >= 1) {
AISetStock(player, 3, c_PB_PhotonCannon); }
// 如果冶煉廠蓋好,就蓋三個光砲
AISetStock(player, 1, c_PB_Gateway);
// 蓋兵營
if(nGateway >= 1) {
// 如果兵營蓋好
AISetGasPeonCountOverride(player, c_townMain, 3);
if(AIGetBuildingCountInTown(player, c_townMain, c_PB_Assimilator, c_techCountCompleteOnly) > 1) {
AISetGasPeonCountOverride(player, c_townMain, 6); }
// 主堡附近有一瓦斯就派三工兵,如果一瓦斯以上就派六工兵
AISetStock(player, 2, c_PB_Pylon);
AISetStock(player, 19, c_PU_Probe);
AISetStock(player, 1, c_PB_Assimilator);
AISetStock(player, 6, c_PB_PhotonCannon);
AISetStock(player, 1, c_PB_CyberneticsCore);
// 這些是有兵營後會做的,兩水晶,19工兵,一瓦斯,六光砲,一機械控制核心
if(nCyberneticsCore >= 1) {
AISetStock(player, 28, c_PU_Probe);
AISetStock(player, 2, c_PB_Assimilator);
AISetStock(player, 4, c_PB_Pylon);
AISetStock(player, 12, c_PB_PhotonCannon);
AISetStock(player, 1, c_PB_TwilightCouncil);
// 如果機械控制核心蓋好,28工兵,兩瓦斯,四水晶,12光砲,一暮光議會
if(nTwilightCouncil >= 1) {
AISetStock(player, 24, c_PB_PhotonCannon);
AISetStock(player, 6, c_PB_Pylon); }
// 如果暮光議會蓋好,24光砲,6水晶
} // 接如果機械控制核心蓋好
} // 接如果兵營蓋好
AIEnableStock(player);
AIGenericOpen(player, 800, false); // 這行的作用是告知 AI ,在800秒後運作交還給 StarCrack AI v6.1.1 決定
}
下載目前 AI 修改進度 0.01 版 :
[--訊6--] [Xuite] [MediaFire] [Badongo]
--載點請勿轉貼-
.
.
哈囉,我是那個ddavid啦:D
回覆刪除關於你的四個問題也都是我還要研究的,除了第二個問題是不是你c_PB_TemplarArchives最後少打了s啊?(請參考RequirementsAI.galaxy,原名是"TemplarArchive"沒有錯,但它指定的const變數名稱加了s XD)
哈哈,原來如此,搞定了!
回覆刪除相信 0.02 版很快就能發布了!
作者已經移除這則留言。
回覆刪除看到你的文章對於編寫星海AI也產生了一點興趣
回覆刪除但ddavid網友的文章連結好像已經不見了...
上星海版也是沒有看到
上網爬文好像也都是只能下載既有的AI而已...
還請問版主有沒有備份或著是相關連結可以提供?
感謝幫忙!