{ 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
代码分析 代码功能 这段代码似乎是一个游戏脚本,用于定义游戏技能和相关事件的逻辑。主要包含两个部分: 1. 第一个部分定义了一个名为 `xiansi2` 的技能,涉及音频播放、目标选择、卡牌操作等逻辑。 2. 第二个部分定义了另一个技能,该技能可以选择使用,涉及过滤目标、选择卡牌、弃置卡牌等操作。 代码问题与建议 # 语法错误 - 在代码中,字符串 `"step 0"`、`"step 1"` 等不会执行任何操作,因为它们只是字符串字面量。如果这些是用于标记步骤的注释,建议使用 JavaScript 的注释语法 `// step 0`。 - `result` 变量在使用前未定义,需要确保在使用前已经正确赋值。 - `target` 变量在某些地方未定义,例如 `target.loseToDiscardpile(links);`,需要确保 `target` 已经正确赋值。 # 代码优化 - 可以将一些重复的逻辑提取成函数,提高代码的可读性和可维护性。例如,过滤目标的逻辑可以封装成一个单独的函数。 - 使用更具描述性的变量名,避免使用像 `bool` 这样的通用变量名。 优化后的代码示例 ```javascript // 第一个技能定义 const skill1 = { audio: 2, audioname: ["re_liufeng"], trigger: { player: "phaseZhunbeiBegin" }, direct: true, content: function () { // step 0 const prompt = get.prompt2(event.name); player.chooseTarget(prompt, [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 if (event.targets && event.targets.length) { const target = event.targets.shift(); event.current = target; player.choosePlayerCard(target, true); } else { event.finish(); } // step 3 if (result.bool) { player.addToExpansion(result.cards, event.current, "give").gaintag.add("xiansi"); event.goto(2); } }, intro: { content: "expansion", markcount: "expansion" }, onremove: function (player) { const cards = player.getExpansions("xiansi"); if (cards.length) { player.loseToDiscardpile(cards); } }, ai: { threaten: 2 }, global: "xiansi2", group: "xiansix", "_priority": 0 }; // 第二个技能定义 const skill2 = { enable: "chooseToUse", audio: 2, audioname2: { "re_liufeng": "rexiansi" }, viewAs: { name: "sha", isCard: true }, filter: function (event, player) { return game.hasPlayer(function (current) { return current.hasSkill("xiansix") && current.getExpansions("xiansi").length > 1 && event.filterTarget({ name: "sha" }, player, current); }); }, filterTarget: function (card, player, target) { const selectedTargets = ui.selected.targets; const hasValidTarget = selectedTargets.some((player) => { return player.hasSkill("xiansix") && player.getExpansions("xiansi").length > 1; }); if (!hasValidTarget && (!target.hasSkill("xiansix") || target.getExpansions("xiansi").length <= 1)) { return false; } return _status.event._backup.filterTarget.apply(this, arguments); }, complexSelect: true, selectCard: -1, filterCard: function () { return false; }, forceaudio: true, prompt: "弃置一名有【逆】的角色的两张【逆】,然后视为对包含其在内的角色使用【杀】。", delay: false, log: false, precontent: function () { // step 0 const validTargets = event.result.targets.filter(function (current) { return current.getExpansions("xiansi").length > 1 && current.hasSkill("xiansix"); }); if (validTargets.length === 1) { event.target = validTargets[0]; event.goto(2); } else if (validTargets.length > 0) { player.chooseTarget(true, "选择弃置【陷嗣】牌的目标", function (card, player, target) { return _status.event.list.includes(target); }) .set("list", validTargets) .set("ai", function (target) { const currentPlayer = _status.event.player; return get.attitude(currentPlayer, target); }); } else { event.finish(); } // step 1 if (result.bool && result.targets.length) { event.target = result.targets[0]; } else { event.finish(); } // step 2 if (event.target) { if (event.target.getExpansions("xiansi").length === 2) { event.directresult = event.target.getExpansions("xiansi").slice(0); } else { player.chooseCardButton("移去两张“逆”", 2, event.target.getExpansions("xiansi"), true); } } else { event.finish(); } // step 3 if (event.directresult || result.bool) { player.logSkill("xiansi2_log", event.target); game.trySkillAudio("xiansi2", event.target, true); const links = event.directresult || result.links; if (event.target) { event.target.loseToDiscardpile(links); } } }, ai: { order: function () { return get.order({ name: "sha" }) + 0.05; }, yingbian: function (card, player, targets, viewer) { if (get.attitude(viewer, player) <= 0) return 0; let base = 0; let hit = false; if (get.cardtag(card, "yingbian_hit")) { hit = true; if (targets.some((target) => { return ( target.mayHaveShan(viewer, "use", target.getCards("h", (i) => { return i.hasGaintag("sha_notshan"); })) && get.attitude(viewer, target) < 0 && get.damageEffect(target, player, viewer, get.natureList(card)) > 0 ); })) { base += 5; } } if (get.cardtag(card, "yingbian_add")) { if (game.hasPlayer(function (current) { return ( !targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && get.effect(current, card, player, player) > 0 ); })) { base += 5; } } if (get.cardtag(card, "yingbian_damage")) { if (targets.some((target) => { // 原代码此处未完成,可根据需求补充完整 })) { // 原代码此处未完成,可根据需求补充完整 } } return base; } } }; ``` 需要小心的地方 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 确保在使用变量之前已经正确赋值,避免出现 `undefined` 错误,如代码中的 `result` 和 `target` 变量。 2. 注意字符串字面量和注释的区别,避免将字符串字面量当作可执行代码使用。 3. 在处理复杂的逻辑时,尽量将重复的逻辑封装成函数,提高代码的可读性和可维护性。 [2025-11-16 13:40:21 | AI写代码神器 | 2075点数解答]
- [字节豆包] { 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)19
- [讯飞星火] 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)138
- [讯飞星火] 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)144
- [字节豆包] 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)235
- [字节豆包] { "trigger": { "player": "judgeBefore" }, "direct": true, "priority": 1, "unique": true, "content": function() { "step 0" event.cards = get.cards(7); player.chooseCardButton(true, event.cards, '改命:选择一张牌作为你的' + trigger.judgestr + '判定结果').ai = function(button) { if (get.attitude(player, trigger.player) > 0) { return 1 + trigger.judge(button.link); } if (get.attitude(player, trigger.player) <(1113点数解答 | 2025-09-23 23:08:45)36
- [字节豆包] "trigger": { "player": "judgeBefore" }, "direct": true, "priority": 1, "unique": true, "content": function() { "step 0" event.cards = get.cards(7); player.chooseCardButton(true, event.cards, '改命:选择一张牌作为你的' + trigger.judgestr + '判定结果').ai = function(button) { if (get.attitude(player, trigger.player) > 0) { return 1 + trigger.judge(button.link); } if (get.attitude(player, trigger.player) < 0) { (925点数解答 | 2025-09-24 00:15:05)36
- [DeepSeek] 这是无名杀的一个技能,如何让AI积极的更频繁使用这个技能 skill={ mod:{ targetInRange:function (card, player, target) { if (player.countCards("j") && player.inRange(target)) { return true; } }, cardUsableTarget:function (card, player, target) { if (player.countCards("j") && player.inRange(target)) return true; }, aiOrder(player, card, num) { if (get.type(card, "delay") && player.canUse(card, player) && player.canAddJu(571点数解答 | 2025-05-24 12:45:13)222
- [字节豆包] if (card) { trigger.cancel(); trigger.result = { card: card, judge: trigger.judge(card), node: node, number: get.number(card), suit: get.suit(card), color: get.color(card), }; if (trigger.result.judge > 0) { trigger.result.bool = true; trigger.player.popup('洗具'); } if (trigger.result.judge < 0) { (793点数解答 | 2025-09-24 00:09:00)33
- [字节豆包] 翻译以下代码;skill={ audio:3, trigger:{ player:"phaseUseBegin", }, filter:function(event,player){ return game.hasPlayer(target=>target!=player&&!target.isZhu2()); }, direct:true, content:function(){ 'step 0' player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用五张【杀】后不能对其使用【杀】',(card,player,target)=>{ return target!=player&&!target.isZhu2(); }).set('ai',target=>{ var (522点数解答 | 2025-05-24 13:13:19)199
- [字节豆包] content: async function(event, trigger, player) { const [target] = event.targets; const [card] = event.cards; trigger.cancel(); await player.discard(event.cards); const { result } = await player.chooseControlList( true, function(event, player) { const target = _status.event.target; let att = get.attitude(player, target); if (target.hasSkillTag("maihp")) att = -att; return att > 0 ? 0 : 1; }, ["令" (179点数解答 | 2025-05-17 20:49:48)149
- [DeepSeek] content() { "step 0"; player.loseHp(); event.target = trigger.player; "step 1"; event.addIndex = 0; var list = [], num = target.countCards("h") - player.countCards("h"); event.num = num; if (num > 0 && target.countCards("h") > 0) list.push("令其弃置" + get.cnNumber(num) + "张手牌"); else event.addIndex++; if (target.hp > player.hp) list.push("令其失去" + get.cnNumber(target.hp - player.hp) + "点体力"); if (!lis(313点数解答 | 2025-05-28 16:03:47)158
- [字节豆包] 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)90