From 6ecfd6593ae4fa1fc512e0c126d0f79e01da2f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Wed, 13 Nov 2024 22:06:42 +0800 Subject: [PATCH 1/6] fix --- lua/server/ai/skill.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lua/server/ai/skill.lua b/lua/server/ai/skill.lua index 9553a8f..8705597 100644 --- a/lua/server/ai/skill.lua +++ b/lua/server/ai/skill.lua @@ -80,32 +80,36 @@ function SkillAI:searchCardSelections(smart_ai) local searched = {} local function search() local selected = smart_ai:getSelectedCards() -- 搜索起点 - local to_remove = selected[#selected] + -- local to_remove = selected[#selected] -- 空情况也考虑一下 + verbose(1, "当前已选:%s", table.concat(selected, "|")) if #selected == 0 and not searched[""] and cardsAcceptable(smart_ai) then + searched[""] = true return {} end + verbose(1, "当前可选:%s", table.concat(smart_ai:getEnabledCards(), "|")) -- 从所有可能的下一步找 for _, cid in ipairs(smart_ai:getEnabledCards()) do smart_ai:selectCard(cid, true) + table.insert(selected, cid) if cardsAcceptable(smart_ai) then - table.insert(selected, cid) local str = cardsString(selected) if not searched[str] then searched[str] = true return smart_ai:getSelectedCards() end - table.removeOne(selected, cid) end local ret = search() if ret then return ret end smart_ai:selectCard(cid, false) + table.removeOne(selected, cid) end -- 返回上一步,考虑再次搜索 - if not to_remove then return nil end - smart_ai:selectCard(to_remove, false) - return search() + -- if not to_remove then return nil end + -- smart_ai:selectCard(to_remove, false) + -- return search() + return nil end return search end -- Gitee From 5bf08c7b8e3f4616f154c1c00b8a5df05b3feb11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Thu, 14 Nov 2024 01:10:08 +0800 Subject: [PATCH 2/6] fix --- lua/server/ai/skill.lua | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/lua/server/ai/skill.lua b/lua/server/ai/skill.lua index 8705597..6e1b065 100644 --- a/lua/server/ai/skill.lua +++ b/lua/server/ai/skill.lua @@ -90,19 +90,19 @@ function SkillAI:searchCardSelections(smart_ai) verbose(1, "当前可选:%s", table.concat(smart_ai:getEnabledCards(), "|")) -- 从所有可能的下一步找 for _, cid in ipairs(smart_ai:getEnabledCards()) do - smart_ai:selectCard(cid, true) - table.insert(selected, cid) - if cardsAcceptable(smart_ai) then - local str = cardsString(selected) - if not searched[str] then + local str = cardsString(selected) + if not searched[str] then + smart_ai:selectCard(cid, true) + table.insert(selected, cid) + if cardsAcceptable(smart_ai) then searched[str] = true return smart_ai:getSelectedCards() end + local ret = search() + if ret then return ret end + smart_ai:selectCard(cid, false) + table.removeOne(selected, cid) end - local ret = search() - if ret then return ret end - smart_ai:selectCard(cid, false) - table.removeOne(selected, cid) end -- 返回上一步,考虑再次搜索 @@ -125,31 +125,36 @@ function SkillAI:searchTargetSelections(smart_ai) local searched = {} local function search() local selected = smart_ai:getSelectedTargets() -- 搜索起点 - local to_remove = selected[#selected] + -- local to_remove = selected[#selected] -- 空情况也考虑一下 + verbose(1, "当前已选:%s", table.concat(table.map(selected, Util.IdMapper), "|")) if #selected == 0 and not searched[""] and smart_ai:okButtonEnabled() then searched[""] = true return {} end + verbose(1, "当前可选:%s", table.concat(table.map(smart_ai:getEnabledTargets(), Util.IdMapper), "|")) -- 从所有可能的下一步找 for _, target in ipairs(smart_ai:getEnabledTargets()) do - table.insert(selected, target) local str = targetString(selected) - if not searched[str] then + if not searched[str] then -- 忽略已选的组合 smart_ai:selectTarget(target, true) + table.insert(selected, target) if smart_ai:okButtonEnabled() then searched[str] = true return smart_ai:getSelectedTargets() end + local ret = search() + if ret then return ret end smart_ai:selectTarget(target, false) + table.removeOne(selected, target) end - table.removeOne(selected, target) end - -- 返回上一步,考虑再次搜索 - if not to_remove then return nil end - smart_ai:selectTarget(to_remove, false) - return search() + -- 返回上一步 + -- if not to_remove then return nil end + -- smart_ai:selectTarget(to_remove, false) + -- return search() + return nil end return search end -- Gitee From aecbe5a77e727067867237ceee062aeeef989c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Thu, 14 Nov 2024 04:09:43 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=8D=95=E6=8D=89=E6=94=B6=E7=9B=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/skill.lua | 4 ++-- lua/server/ai/smart_ai.lua | 5 ++++- standard/ai/init.lua | 8 ++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lua/server/ai/skill.lua b/lua/server/ai/skill.lua index c96d4e5..2048b3a 100644 --- a/lua/server/ai/skill.lua +++ b/lua/server/ai/skill.lua @@ -65,8 +65,8 @@ end -- 但是也没办法一次性算出所有情况并拿去遍历。为此,只要每次调用都算出和之前不一样的解法就行了 local function cardsAcceptable(smart_ai) - -- return smart_ai:okButtonEnabled() or (#smart_ai:getEnabledTargets() > 0) - return false + return smart_ai:okButtonEnabled() or (#smart_ai:getEnabledTargets() > 0) + -- return false end local function cardsString(cards) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index cf02249..b325302 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -240,7 +240,10 @@ function SmartAI:handleAskForUseActiveSkill() if current_skill then ai = fk.ai_skills[current_skill.name] end if not ai then ai = fk.ai_skills[name] end if not ai then return "" end - return ai:think(self) + verbose(1, "正在询问技能:%s", ai.skill.name) + local ret, real_val = ai:think(self) + verbose(1, "%s: 思考结果是%s, 收益是%s", ai.skill.name, json.encode(ret), json.encode(real_val)) + return ret, real_val end function SmartAI:handlePlayCard() diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 54c5298..6edb4d1 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -82,7 +82,7 @@ SmartAI:setSkillAI("tuxi", { if i == 2 then break end end if #targets == 0 or total_benefit <= 0 then return "" end - return { targets = targets } + return { targets = targets }, total_benefit end, }) @@ -104,8 +104,12 @@ SmartAI:setSkillAI("jizhi", { SmartAI:setSkillAI("zhiheng", { think = function(self, ai) + local player = ai.player local cards = ai:getEnabledCards() - return { cards = cards }, 0 + return { cards = cards }, ai:getBenefitOfEvents(function(logic) + logic:throwCard(cards, self.skill.name, player, player) + logic:drawCards(player, #cards, self.skill.name) + end) end, }) -- Gitee From c5dcd05e73a6f79277659593c68f927f5e2bbedb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Thu, 14 Nov 2024 04:13:58 +0800 Subject: [PATCH 4/6] reroll --- lua/server/ai/skill.lua | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/lua/server/ai/skill.lua b/lua/server/ai/skill.lua index 2048b3a..6047c6a 100644 --- a/lua/server/ai/skill.lua +++ b/lua/server/ai/skill.lua @@ -81,7 +81,7 @@ function SkillAI:searchCardSelections(smart_ai) local searched = {} local function search() local selected = smart_ai:getSelectedCards() -- 搜索起点 - -- local to_remove = selected[#selected] + local to_remove = selected[#selected] -- 空情况也考虑一下 verbose(1, "当前已选:%s", table.concat(selected, "|")) if #selected == 0 and not searched[""] and cardsAcceptable(smart_ai) then @@ -91,26 +91,25 @@ function SkillAI:searchCardSelections(smart_ai) verbose(1, "当前可选:%s", table.concat(smart_ai:getEnabledCards(), "|")) -- 从所有可能的下一步找 for _, cid in ipairs(smart_ai:getEnabledCards()) do + table.insert(selected, cid) local str = cardsString(selected) if not searched[str] then + searched[str] = true smart_ai:selectCard(cid, true) - table.insert(selected, cid) if cardsAcceptable(smart_ai) then - searched[str] = true return smart_ai:getSelectedCards() end local ret = search() if ret then return ret end smart_ai:selectCard(cid, false) - table.removeOne(selected, cid) end + table.removeOne(selected, cid) end -- 返回上一步,考虑再次搜索 - -- if not to_remove then return nil end - -- smart_ai:selectCard(to_remove, false) - -- return search() - return nil + if not to_remove then return nil end + smart_ai:selectCard(to_remove, false) + return search() end return search end @@ -136,26 +135,25 @@ function SkillAI:searchTargetSelections(smart_ai) verbose(1, "当前可选:%s", table.concat(table.map(smart_ai:getEnabledTargets(), Util.IdMapper), "|")) -- 从所有可能的下一步找 for _, target in ipairs(smart_ai:getEnabledTargets()) do + table.insert(selected, target) local str = targetString(selected) - if not searched[str] then -- 忽略已选的组合 + if not searched[str] then + searched[str] = true smart_ai:selectTarget(target, true) - table.insert(selected, target) if smart_ai:okButtonEnabled() then - searched[str] = true return smart_ai:getSelectedTargets() end local ret = search() if ret then return ret end smart_ai:selectTarget(target, false) - table.removeOne(selected, target) end + table.removeOne(selected, target) end - -- 返回上一步 - -- if not to_remove then return nil end - -- smart_ai:selectTarget(to_remove, false) - -- return search() - return nil + -- 返回上一步,考虑再次搜索 + if not to_remove then return nil end + smart_ai:selectTarget(to_remove, false) + return search() end return search end -- Gitee From 3aba320c6ea2e94b95b982e1fa41604c3d9520ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Thu, 14 Nov 2024 04:59:22 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=B8=88=E5=85=AB=E7=9F=9B=E5=92=8C?= =?UTF-8?q?=E6=AD=A6=E5=9C=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- standard/ai/init.lua | 2 ++ standard_cards/ai/init.lua | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 6edb4d1..b13e484 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -147,3 +147,5 @@ SmartAI:setSkillAI("xiaoji", { }) SmartAI:setSkillAI("biyue", nil, "jizhi") + +SmartAI:setSkillAI("wusheng", nil, "spear_skill") \ No newline at end of file diff --git a/standard_cards/ai/init.lua b/standard_cards/ai/init.lua index 3e3e44e..67acbe4 100644 --- a/standard_cards/ai/init.lua +++ b/standard_cards/ai/init.lua @@ -136,3 +136,55 @@ SmartAI:setTriggerSkillAI("#nioh_shield_skill", { return self.skill:triggerable(event, target, player, data) end, }) + +SmartAI:setSkillAI("spear_skill", { + choose_targets = function(self, ai) + local logic = AIGameLogic:new(ai) + local val_func = function(targets) + logic.benefit = 0 + logic:useCard({ + from = ai.player.id, + tos = table.map(targets, function(p) return { p.id } end), + card = self.skill:viewAs(ai:getSelectedCards()), + }) + verbose(1, "目前状况下,对[%s]的预测收益为%d", table.concat(table.map(targets, function(p)return tostring(p)end), "+"), logic.benefit) + return logic.benefit + end + local best_targets, best_val = nil, -100000 + for targets in self:searchTargetSelections(ai) do + local val = val_func(targets) + if (not best_targets) or (best_val < val) then + best_targets, best_val = targets, val + end + end + return best_targets or {}, best_val + end, + think = function(self, ai) + local skill_name = self.skill.name + local estimate_val = self:getEstimatedBenefit(ai) + -- local cards = ai:getEnabledCards() + -- cards = table.random(cards, math.min(#cards, 5)) --[[@as integer[] ]] + -- local cid = table.random(cards) + + local best_cards, best_ret, best_val = nil, "", -100000 + for cards in self:searchCardSelections(ai) do + local ret, val = self:chooseTargets(ai) + verbose(1, "就目前选择的这张牌,考虑[%s],收益为%d", table.concat(table.map(ret, function(p)return tostring(p)end), "+"), val) + val = val or -100000 + if best_val < val then + best_cards, best_ret, best_val = cards, ret, val + end + -- if best_val >= estimate_val then break end + end + + if best_ret and best_ret ~= "" then + if best_val < 0 then + return "", best_val + end + + best_ret = { cards = best_cards, targets = best_ret } + end + + return best_ret, best_val + end, +}, "__card_skill") \ No newline at end of file -- Gitee From 5c7ff437be1de982155604b8d99ca0cdb0dfca33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Thu, 14 Nov 2024 05:15:29 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=90=84=E7=A7=8D=E8=A7=86=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/smart_ai.lua | 4 ++-- standard/ai/init.lua | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index b325302..90098e0 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -96,11 +96,11 @@ function SmartAI.static:setSkillAI(key, spec, inherit) local ret, val = v(_self, _ai) if ret and type(ret) == "table" then if ret.cards then - ret.card = { skill = ai.skill.name, subcards = ret.cards } + ret.card = { skill = _self.skill.name, subcards = ret.cards } ret.cards = nil end if not ret.card then - ret.card = { skill = ai.skill.name, subcards = Util.DummyTable } + ret.card = { skill = _self.skill.name, subcards = Util.DummyTable } end if ret.targets then if type(ret.targets[1]) == "table" then diff --git a/standard/ai/init.lua b/standard/ai/init.lua index b13e484..d574025 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -148,4 +148,12 @@ SmartAI:setSkillAI("xiaoji", { SmartAI:setSkillAI("biyue", nil, "jizhi") -SmartAI:setSkillAI("wusheng", nil, "spear_skill") \ No newline at end of file +SmartAI:setSkillAI("wusheng", nil, "spear_skill") + +SmartAI:setSkillAI("longdan", nil, "spear_skill") + +SmartAI:setSkillAI("guose", nil, "spear_skill") + +SmartAI:setSkillAI("jijiu", nil, "spear_skill") + +SmartAI:setSkillAI("qixi", nil, "spear_skill") \ No newline at end of file -- Gitee