skill={ enable:"phaseUse", filter:function(event){ return event.player.num('h')>0; }, content:function(){ 'step 0' if(player.num('h')==0){ event.finish(); return; } 'step 1' // 选择两张手牌弃置 player.chooseCard('h',[2,2],'请选择两张手牌发动【灵魂能源max】'); 'step 2' if(!result.bool){ event.finish(); return; } 'step 3' // 弃置手牌 player.
以下是为这个技能添加的 AI 逻辑,AI 逻辑会依据一定的策略来决定是否发动技能以及选择目标等。 ```javascript skill = { enable: "phaseUse", filter: function(event) { return event.player.num('h') > 0; }, content: function() { 'step 0' if (player.num('h') == 0) { event.finish(); return; } // AI 逻辑:判断是否发动技能 let shouldUseSkill = aiDecideToUseSkill(); if (!shouldUseSkill) { event.finish(); return; } 'step 1' // 选择两张手牌弃置 let chosenCards = aiChooseCards(); player.chooseCard('h', [2, 2], '请选择两张手牌发动【灵魂能源max】', chosenCards); 'step 2' if (!result.bool) { event.finish(); return; } 'step 3' // 弃置手牌 player.discard(result.cards); 'step 4' // AI 选择目标 let chosenTargets = aiChooseTargets(); player.chooseTarget('请选择任意名角色造成伤害', false, [1, game.countPlayer()], false, chosenTargets); 'step 5' if (result.bool && result.targets) { for (var i = 0; i < result.targets.length; i++) { var target = result.targets[i]; target.damage(2); } } }, // AI 判断是否发动技能的函数 aiDecideToUseSkill: function() { // 简单策略:手牌数大于 3 且存在生命值较低的敌人就发动技能 let handCount = player.num('h'); let lowHealthTargets = game.players.filter(p => p !== player && p.health <= 3); return handCount > 3 && lowHealthTargets.length > 0; }, // AI 选择手牌的函数 aiChooseCards: function() { let handCards = player.getCards('h'); // 简单策略:选择两张价值较低的牌 handCards.sort((a, b) => a.value - b.value); return handCards.slice(0, 2); }, // AI 选择目标的函数 aiChooseTargets: function() { let allPlayers = game.players.filter(p => p !== player); // 简单策略:选择生命值最低的目标 allPlayers.sort((a, b) => a.health - b.health); return allPlayers.filter(p => p.health <= 3); } }; // 这里假设 game 对象和 player 对象已经定义 // 以下是示例定义 let game = { players: [], countPlayer: function() { return this.players.length; } }; let player = { num: function(type) { // 返回手牌数量 return this.getCards(type).length; }, getCards: function(type) { // 返回指定类型的牌 return []; }, chooseCard: function(type, range, message, preChosenCards) { // 处理选牌逻辑 result.bool = preChosenCards.length === 2; result.cards = preChosenCards; }, discard: function(cards) { // 处理弃牌逻辑 }, chooseTarget: function(message, arg1, range, arg2, preChosenTargets) { // 处理选择目标逻辑 result.bool = preChosenTargets.length > 0; result.targets = preChosenTargets; } }; let result = { bool: false, cards: [], targets: [] }; ``` 代码 1. `aiDecideToUseSkill` 函数:AI 用来判断是否发动技能,当前的策略是当手牌数大于 3 且存在生命值较低的敌人时发动。 2. `aiChooseCards` 函数:AI 选择两张手牌,当前策略是选择价值较低的两张牌。 3. `aiChooseTargets` 函数:AI 选择目标,当前策略是选择生命值最低的目标。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. AI 逻辑的复杂度要适中,过于复杂的逻辑可能导致性能问题,过于简单的逻辑可能使 AI 表现不佳。 2. 在处理目标选择时,要确保目标的合法性,避免选择已经死亡或者无法选择的目标。 3. 要考虑到游戏状态的动态变化,例如在选择目标后,目标的生命值可能已经发生改变,需要重新评估。 [2026-01-20 21:22:49 | AI写代码神器 | 1114点数解答]
- [字节豆包] skill={ enable:"phaseUse", filter:function(event){ return event.player.num('h')>0; }, content:function(){ 'step 0' if(player.num('h')==0){ event.finish(); return; } 'step 1' // 选择两张手牌弃置 player.chooseCard('h',[2,2],'请选择两张手牌发动【灵魂能源max】'); 'step 2' if(!result.bool){ event.finish(); return; } 'step 3' // 弃置手牌 player.(1114点数解答 | 2026-01-20 21:22:49)21
- [字节豆包] { audio:2, audioname:["re_liufeng"], trigger:{ player:"phaseZhunbeiBegin", }, direct:true, content:function () { "step 0"; player.chooseTarget( get.prompt2(event.name), [1, 2], function (card, player, target) { return target.countCards("he") > 0; }, function (target) { return -get.attitude(_status.event.player, target); } ); "step 1"; if (result.bool) { result.targets.sortBySeat(); player.logSkill(event.name, result.targets); event.targets = result.targets; } else { event.finish(); } "step 2"; i(2075点数解答 | 2025-11-16 13:40:21)58
- [字节豆包] skill={ trigger:{ global:"useCard1", }, audio:2, forced:true, firstDo:true, filter:function(event,player,card){ if(get.color(event.card)!='black') return false; return event.card.name=='nanman'&&player!=event.player||event.card.name=='wanjian'&&player!=event.player||event.card.name=='taoyuan'&&player.hp<player.maxHp||event.card.name=='wugu'; }, content:function(){}, mod:{ targetEnabled:function(card){ if((get.type(ca(211点数解答 | 2025-02-01 13:23:26)278
- [讯飞星火] skill={ trigger:{ player:"shaBegin", }, direct:true, filter:function (event,player){ return event.target.hp>0&&event.target.countCards('he')>0; }, audio:2, logTarget:"target", content:function (){ 'step 0' player.choosePlayerCard(trigger.target,'he', [1,Math.min(trigger.target.countCards('he'),trigger.target.hp)],get.prompt('pojun',trigger.target)); 'step 1' if(result.bool&&result.links.length){ player.logSkill('xinpojun'); if(trigger.target.storage.xinpojun2){ trigger.target.storage.xinpojun2=t(288点数解答 | 2025-07-06 23:39:34)179
- [字节豆包] skill={ audio:2, mod:{ aiOrder(player, card, num) { if (num <= 0 || !player.isPhaseUsing() || player.needsToDiscard() < 2) return num; let suit = get.suit(card, player); if (suit === "heart") return num - 3.6; }, aiValue(player, card, num) { if (num <= 0) return num; let suit = get.suit(card, player); if (suit === "heart") return num + 3.6; if (suit === "club") return num + 1; (199点数解答 | 2025-05-07 17:49:43)236
- [讯飞星火] skill={ audio:2, trigger:{ player:"useCard", }, frequent:true, filter:function (event,player){ if(!event.cards||event.cards.length!=1) return false; if(_status.currentPhase!=player) return false; if(!player.storage.jianying) return false; return get.suit(player.storage.jianying)==get.suit(event.cards[0])|| player.storage.jianying.number==event.cards[0].number; }, content:function (){ player.draw(); }, (713点数解答 | 2025-07-05 23:27:14)166
- [字节豆包] skill={ enable:"phaseUse", filter:function (event,player){ return !player.hasSkill('subplayer')&&player.getSubPlayers('lingyong_get').length>0; }, nosub:true, group:"lingyong_get", direct:true, delay:0, skillAnimation:true, animationColor:"thunder", content:function (){ player.callSubPlayer().set('tag','lingyong_get'); }, ai:{ order:1, result:{ player:function (player,target){ return 1; (763点数解答 | 2025-08-20 11:51:16)122
- [讯飞星火] skill={ trigger:{ player:"shaBegin", }, direct:true, filter:function (event,player){ return event.target.hp>0&&event.target.countCards('he')>0; }, audio:2, logTarget:"target", content:function (){ 'step 0' player.choosePlayerCard(trigger.target,'he', [1,Math.min(trigger.target.countCards('he'),trigger.target.hp)],get.prompt('pojun',trigger.target)); 'step 1' if(result.bool&&result.links.length){ (286点数解答 | 2025-07-06 23:35:52)183
- [字节豆包] skill={ audio: 2, trigger: { global: "useCardToTargeted", }, forced: true, locked: false, filter: filter(event, player) { if (event.player == player || event.target != player) { return false; } return event.player.getHistory("useCard", evt => evt?.targets.includes(player)).indexOf(event.getParent()) > 0; }, content: async content(event, trigger, player) { player .when({ global: "useCardAfter" }) (951点数解答 | 2025-11-11 22:46:53)88
- [GPT] jingyu: { audio: 2, trigger: { global: ["useskill", "logskillbegin", "usecard", "respond"], }, filter(event, player) { if (["global", "equip"].includes(event.type)) return false; let skill = event.sourceskill || event.skill; if (!skill || skill === "jingyu") return false; let info = get.info(skill); while (true) { if (!info || info.charlotte || info.equipskill) return false; if (info && !info.sourceskill) break; skill = info.sourceskill; info = get.info((15点数解答 | 2024-06-06 17:40:23)404
- [讯飞星火] skill={ audio:2, trigger:{ player:["loseEnd","changeHp"], }, forced:true, filter:function (event,player){ return (player.countCards('h')<Math.min(3,player.maxHp-player.hp)); }, content:function (){ player.draw(Math.min(3,player.maxHp-player.hp)-player.countCards('h')); }, ai:{ noh:true, skillTagFilter:function (player,tag){ if(tag=='noh'&&player.maxHp-player.hp<player.countCards('h')){ return (331点数解答 | 2025-07-01 12:15:43)163
- [字节豆包] skill = { audio:2, trigger:{ player:"phaseDrawBegin1", }, direct:true, filter:function(event,player){ return !event.numFixed; }, content:function(){ "step 0" var check; var i,num=game.countPlayer(function(current){ return current!=player&¤t.countCards('h')&&get.attitude(player,current)<=0; }); check=(num>=2); player.chooseTarget(get.prompt('tuxi'),'获得其他一至两名角色的各一张手牌',[1,2],function(card,p(927点数解答 | 2025-08-24 12:30:01)140