三国杀传奇最后反贼三开加三个ai是不是必定反贼

收藏的论坛
脱离2的苦海 三国杀关于做反贼的技巧
  反贼篇:(所有内容大部分适用于OL 1内局)  1:身份定义好。  理由:你是反贼,你的目的是杀死主公。同样你是反贼主公,忠和内都想杀你。活着才有输出。切记!  2:你是反贼,反贼的优势是人多一个。  注意:反贼的优势是多1人,所以切勿把这个优势转化为送牌的劣势。反多一人该做什么不该做什么我推荐一下。  仅供参考:  1,反开局不要放AOE。你们人多,反用AOE等于3反要承受AOE的负面效果,忠主不同,对于他们来说只有两名队友需要承受,而反贼则有4名要承受。所以在不是必要的时候AOE不要放。  2,开局位置靠前的反有5谷必开,而且最好起手未表明身份的时候开,这个时候除了下位可能会打出无懈可击,其他人均会处在观望态度。可以很好的调整你的手牌,来进行攻击,而且你位置靠前,后面反能拿到好的锦囊或攻击牌的几率很大,更好的加强进攻,而且就算到了主的时候一般不会剩些比较好的牌,能剩张基础牌已经不错了。  3,表明身份,让后面的反能更好的看到你,以及提高反贼判断下位身份的可能性。你不表明身份你死的时候没人会管你。  例1:首反不跳,或者跳不了。导致4-6位的反又弄不到主,又只能弄下位,这样很容易消耗反总体的实力。  例2:有时经常遇上这样的情况,7-8位1忠1反,这时7位已经知道8位身份时不表明身份直接对8位一顿猛揍。然后7-8位就处于对掐状态。外面没人敢插手。死了双方也不敢救。如果7位忠,8位反,当忠猛揍你后,你要考虑好怎么表明身份,如果你状态好,可以直接条反弄主,如果你状态不好,在垂死边缘,可以考虑在主回合前不表明身份,例如留无懈可击或者桃来表明身份。你残血切勿跳反,很可能在主的回合就被主收了。给主送牌不如给反送牌。  7位反,对8位忠一顿猛揍,如果8位残血了一定要表明身份,让反贼清楚谁是谁,很有可能弄不到主的会帮你灭了忠,这对反是一大优势。  3:2位反人物推荐,首推沙包型:赵云,甄姬,关羽,变形金刚,夏侯淳,文远队长(张辽),周泰,孙权,刘备,郭嘉,魏延。其次爆发型和辅助型:月英,香香,黄盖(请谨慎使用!),于吉(也请谨慎使用)。切勿选择手牌型:司马,华佗,大乔,小乔等。  理由:2位反往往是被集火的目标。选脆皮是不是很的选择。选沙包是为了提高自身的生存能力以及保护远位的脆皮反。当个人肉防御马也不错。而且沙包自身对输出没报太大希望,目的就是保护后面的反。4血是比较理想的。爆发性在沙包型后的原因就在于,爆发型基本属于脆皮系列。在不属于自己的回合直接等于3血白板,在2位这个高风险的位置很可能没有第2回合就拜拜了。在这里我不是很推荐使用黄盖,黄盖毕竟是个RP人物,爆发了没的说很NB。没爆发对不起。你让反的优势瞬间就没了。(我曾经3次2位反黄盖,苦肉上来全是杀闪,没锦囊,没连弩。那个郁闷。)所以2位最好不要选黄盖,对你自己负责,对你的反贼队友负责。于吉这个人物在OL上仇恨是相当高的。但处在2位这个位置的于吉,唯一的优势就是蛊惑5谷,真真假假,假假真真,能骗的到两张5谷说明你于吉过关了,并且反的优势大增。没骗到,果断满手牌结束,等下回合,切勿空手牌(没有手牌的于吉在没人死的情况下普遍没有下一回合)。  4:3-4位反推荐远程DPS:司马,马超,黄忠,甘宁,大都督,貂蝉,吕布等。  理由:处在这个位置的可以考虑使用脆皮3血人物进行输出,3血人物技能大多距离无限制,能很好的对主进行输出。而且离主远,你也不确定2位一定是忠,所以不是很推荐沙包型。  5:5-7位反推荐辅助控场型:这类大多是手牌流,华佗,大乔,小乔,司马,张角,貂蝉,香香,于吉等。  理由:离主太远。你想杀的时候没武器,还是老实的辅助比较好。而且离主很远,减小了主对你的压力。3血职业在这个位置是比较理想的。另一个好处在于位置靠后,可以更好的辅助前面处在前线的反提高他们的生存能力。而且到你的回合基本前面人的身份都明朗了。可以很好的进行输出和控场。  6:8位反首推控制型:大乔,诸葛。其次爆发型:张飞,黄盖,甄姬,许胖子。  理由:8位是一个风险很大的位置,俗称酱油位,你很可能因为处在这个位置获得酱油男战功(已经经历过的就没有了。)对你自身的生存是一大考验。你能活下来那么你对主的威胁比2位强的多。如果没有活下来那么老实的打酱油去吧。8位的优势,主的回合前最后一次威胁。这个时候主很可能已经没有闪杀来阻挡你的进攻,许胖子在这时候裸奔一下那主是爽上天。大乔和诸葛不解释,谁用谁知道。&&& 文章推荐:&&& &&& &&& &&&
近期游戏热闻教程贴:教你自己编写DIY武将的AI(太阳神三国杀lua)96
上亿文档资料,等你来发现
教程贴:教你自己编写DIY武将的AI(太阳神三国杀lua)96
在cpp区发了那篇DIY教程贴之后,我转战到了l;首先,AI的编写与lua技能的代码有很大关系,我;1.写代码要整齐,缩进量要层层递进,保证代码的易;2.写触发技的时候,要清楚每个触发事件的原理,最;则可能引入异常的行为;3.没有必要的时候不要重载can_trigger;函数;4.如果一个触发技可以在多个时间下触发,在写on;发的事件来写条件分支语句,这样逻
在cpp区发了那篇DIY教程贴之后,我转战到了lua区,发现大家都是再写lua武将的DIY,没有人关心AI的lua。在我看来,与cpp相比,lua来实现DIY的武将优点是安装卸载方便且不会影响cpp源代码的整洁,缺点是不能debug,通过设置断点来观察变量,在测试的过程中比较辛苦,还有就是偏于与系统耦合的技能比较难实现。这两天把AI部分的lua代码看了一遍清楚了,除了身份判断部分,基本清楚了它的原理。鉴于lua武将DIY的教程和范例已经比较完善,这次我就把AI的编写简要的整理一下。附件中的内容是和这次教程相关的代码、相关武将的卡牌图片以及本帖的PDF版本。附件中有“侠”三武将的lua和AI,以及两个我DIY的娱乐武将的AI(娱乐武将用CPP实现的,由于有一个修改性别的技能改变了底层的Player类,因此无法用lua完美实现,所以就不提供代码了,有兴趣的同学可以和我交流)。
首先,AI的编写与lua技能的代码有很大关系,我用自己设计的两个武将和“侠”三武将做了实验并且完成了这五个武将的AI。在编写“侠”三武将的AI时遇到了一些问题,后来我把寒秋的代码优化了一下才解决了问题。附件里会有“侠”三武将的代码,一个是原版的,一个是我改进过的,大家可以对比下。(并没有冒犯的意思,纯学术上的交流)所以算是给广大lua的DIY爱好者们几条编程方面的建议吧。
1. 写代码要整齐,缩进量要层层递进,保证代码的易读性
2. 写触发技的时候,要清楚每个触发事件的原理,最好不要加入多余的触发事件,否
则可能引入异常的行为。当然,一般来说引入多余事件只是降低程序运行的效率罢了,对于神杀影响应该不大。
3. 没有必要的时候不要重载can_trigger、enabled_at_play、enabled_at_response这些
函数。对于can_trigger这个函数,重载直接return true然后在on_trigger里判断玩家是否拥有该触发技和使用默认的can_trigger基本是一样的(因为can_trigger本身返回值就是触发者是否拥有该技能且触发者是否活着,貌似死人没法触发技能)。
4. 如果一个触发技可以在多个时间下触发,在写on_trigger函数的时候大家请按照触
发的事件来写条件分支语句,这样逻辑会更加清晰一些。
5. 尽量避免在视作技中使用askForCard这个函数,我来举个例子:如果一个视作技可
以把闪当作无中生有来使用,如果你不用askForCard,那么操作流程将是点击技能按钮à选择一张闪à点击确定当无中生有打出;但是如果使用了askForCard并且你装备了八卦阵,那么你点击技能按钮à系统提示你需要打出一张闪à使用八卦阵à判红à直接打出一张无中生有。一张牌当无中生有和零张牌当无中生有,知道区别了吧。
6. 在触发技一定要使用askForSkillInvoke(player,self:objectName(),data),这里要注意第
三个参数data,它包含触发事件的详细信息,一般卖血技的是damage的结构体、无言那种是cardEffect结构体、烈弓是slashEffect结构体。这些data中的信息在写AI的时候十分重要,因此务必要加上以便于AI中完成复杂的判断。我之前写AI就是因为askForSkillInvoke(player,self:objectName())导致需要的变量总是空值,郁闷了很久。
7. 触发技中askForCard之前最好加上askForSkillInvoke。对于人来说,如果不加
askForSkillInvoke,不想发动机能的时候直接点取消就行,加上了askForSkillInvoke无非就是在提示是否使用XXX技能时多点一个确定罢了。但是对于AI的编写,如果不加askForSkillInvoke,那么这个技能对应的AI就要写在smart-ai.lua的SmartAI:askForCard里,有点像cpp中的系统耦合技,这对于代码的整洁还有AI的移植是不利的。但是加上askForSkillInvoke后,我们就可以单独的对这个选择写一个AI,消除了耦合。
OK,建议提完了,开始说AI的编写吧。首先,基本上所有的非锁定技的视作技和触发技都可以独立新建一个lua文件编写,禁止技在smart-ai中的cardProhibit和slashProhibit里编写,锁定技在smart-ai.lua中的damageIsEffective、slashIsAvailable、prohibitUseDirectly、isCompulsoryView中编写,一些锁定技的响应(需要调用askForCard的)在smart-ai中的askForCard里编写,卡牌转换类技能在smart-ai中的getSkillViewCard里编写。
我把AI技能的编写分为几类:
1. 将卡牌视为三国杀已有主动使用卡牌的视作技,比如双雄、连环、火计
2. 将卡牌视为三国杀已有卡牌的视作技,这些卡牌用于响应,比如倾国、看破、急救
注:武圣、龙胆、酒池这些技能既属于第一类也属于第二类
3. 将卡牌视为技能卡的视作技,比如青囊、离间、驱虎
4. 所有的非锁定技的触发技,比如刚烈、八阵、悲歌
5. 禁止技,比如空城、谦逊、帷幕
6. 使效果无效的技能,暂且称无效技,比如无言、智迟、神君;有威慑力的技能,比
如刚烈、恩怨、雷击
7. 视作锁定技,比如戒酒、武神
8. 对出杀次数、杀指定目标数、杀的距离修改的技能,比如天义、咆哮、方天画戟
9. 响应时的斟酌,比如AOE奸雄收牌、无双肉林只有一张闪就直接掉血
此外,一些技能还涉及到选项,比如志继觉醒摸牌还是回血、反间选择花色、无谋弃掉标记还是流失体力;另一些技能涉及到目标的选择,比如驱虎赢了选择受伤害者、旋风选择伤害者或杀的目标、眩惑来的牌给谁。这就要求我们具体问题具体分析了。
第一类技能编写的通式是:
local skillname_skill={}
skillname _skill.name=& skillname &
table.insert(sgs.ai_skills, skillname)
skillname _skill.getTurnUseCard=function(self)
判断是否满足应该使用的条件,若不满足则return nil
local card
选则要发动技能的卡牌,赋值给card
if not card then return nil end
local suit = card:getSuitString()
local number = card:getNumberString()
local card_id = card:getEffectiveId()
local card_str = (&转换卡牌名称:skillname[%s:%s]=%d&):format(suit, number, card_id)
local skillcard = sgs.Card_Parse(card_str)
assert(skillcard)
return skillcard
例子是以下这个武将的技能―求败:
[&dgqb&] = &独孤求败&,
[&luawujian&] = &无剑&,
[&luayoujian&] = &有剑&,
[&luayoujiandev&] = &有剑&,
[&luaqiubai&] = &求败&,
[&luaqiubaix&] = &求败&,
[&:luawujian&] = &当你没有装备武器时你的杀不可被闪避。&,
[&:luaqiubai&] = &回合内你可以将任意武器牌当决斗使用。若决斗成功则你可以摸两张牌否则对方摸两张牌&,
[&:luayoujian&] = &当你装备有武器时本回合你可以出X张杀,X为你当前的攻击范围,回合内你使用的所有杀都将被计数(不包括决斗出的杀)。&,
--luaqiubai
local luaqiubai_skill={}
--设置技能名称
luaqiubai_skill.name=&luaqiubai&
--把这个技能添加进ai_skills列表中,使AI可以使用这个技能
table.insert(sgs.ai_skills,luaqiubai_skill)
--判断技能是否可以发动的函数
luaqiubai_skill.getTurnUseCard=function(self)
--获取手牌中杀的个数
local slash_num = self:getCardsNum(&Slash&)
--获取该回合出杀的次数
local slash_used = self.player:usedTimes(&Slash&)
--如果已装备武器,且手中有杀多于一个,
--且获取该回合出杀的次数小于攻击范围,则不发动该技能
--这是为了保证有剑和求败两个技能利用最大化
if self.player:getWeapon() and slash_num & 0
and slash_used & self.player:getAttackRange() then return nil end
--获取我所有的手牌和装备牌
local cards = self.player:getCards(&he&)
cards=sgs.QList2Table(cards)
local card
--根据使用价值来排序
self:sortByUseValue(cards,true)
--遍历所有卡牌
for _,acard in ipairs(cards)
--如果是武器牌则使用这个卡牌
if acard:inherits(&Weapon&) then
card = acard
--如果没选发动技能的卡牌则返回空值
if not card then return nil end
local suit = card:getSuitString()
local number = card:getNumberString()
local card_id = card:getEffectiveId()
--构造卡牌字符串,卡牌名称:技能名称[花色:点数]=卡牌ID
local card_str = (&duel:luaqiubai[%s:%s]=%d&):format(suit, number, card_id)
--指定要使用的卡牌
local skillcard = sgs.Card_Parse(card_str)
assert(skillcard)
return skillcard
第二类技能编写是在smart-ai.lua中的getSkillViewCard中添加代码,用于响应的卡牌有杀、闪、桃、酒、无懈,我们只需要在对应的分支语句里添加即可。比如在对闪的处理可以看到龙魂、龙胆和倾国,如果我们加一个技能叫“我闪”,这个技能可以把装备牌当闪使用,那么用下方红色的代码就能实现它的AI:
elseif class_name == &Jink& then
if player:hasSkill(&longhun&) and player:getHp() &= 1 then
if card:getSuit() == sgs.Card_Club then
return (&jink:longhun[%s:%s]=%d&):format(suit, number, card_id)
if card_place ~= sgs.Player_Equip then
if player:hasSkill(&longdan&) and card:inherits(&Slash&) then
return (&jink:longdan[%s:%s]=%d&):format(suit, number, card_id)
elseif player:hasSkill(&qingguo&) and card:isBlack() then
return (&jink:qingguo[%s:%s]=%d&):format(suit, number, card_id)
if card_place == sgs.Player_Equip and player:hasSkill(&woshan&) then
return (&jink:woshan[%s:%s]=%d&):format(suit, number, card_id)
有一个情况比较特殊,zeroCardView就是把0张牌当某牌,这个很特殊,目前只用来实现酒诗的AI,前两种技能如果是把0张牌当某牌,AI都可以用这个函数实现。如果写一个技能“万兽”和酒诗相似,只是正面向上时翻面可以当南蛮入侵,那么添加红色代码即可:
local function zeroCardView(class_name, player)
if class_name == &Analeptic& then
if player:hasSkill(&jiushi&) and player:faceUp() then
return (&analeptic:jiushi[no_suit:0]=.&)
else if class_name == &SavageAssault& then
if player:hasSkill(&wanshou&) and player:faceUp() then
return (&savage_assault:wanshou[no_suit:0]=.&)
第三类技能编写的通式是:
local skillname_skill={}
skillname _skill.name=& skillname &
table.insert(sgs.ai_skills, skillname)
skillname _skill.getTurnUseCard=function(self)
判断是否满足应该使用的条件,若不满足则return nil
local card
选则要发动技能的卡牌,赋值给card
if not card then return nil end
local card_str = (&@SkillNameCard=%d&):format(card:getId())
local skillcard = sgs.Card_Parse(card_str)
assert(skillcard)
return skillcard
sgs.ai_skill_use_func[&SkillNameCard&]=function(card,use,self)
local target
选择技能发动的目标,若没找到合适目标则return nil
use.card = card
use.to =append(target)
例子是以下这个武将的技能―争宠:
[&wujian&] = &吴健&,
[&zhengchong&] = &争宠&,
[&:zhengchong&] = &出牌阶段,你可以弃一张手牌,指定两名女性角色。若如此做,视为其中一名女性角色对另一名女性角色使用一张【决斗】(此【决斗】不可被【无懈可击】响应),每回合限用一次&,
[&yange&] = &阉割&,
[&:yange&] = &你每次对其他男性角色造成伤害,可使收到该伤害的角色变为女性,直到游戏结束&,
--zhengchong
local zhengchong_skill={}
--设置技能名称
zhengchong_skill.name=&zhengchong&
--把这个技能添加进ai_skills列表中,使AI可以使用这个技能
table.insert(sgs.ai_skills,zhengchong_skill)
--判断技能是否可以发动的函数
zhengchong_skill.getTurnUseCard=function(self)
--如果该回合发动过则不发动
if self.player:hasUsed(&ZhengchongCard&) then
三亿文库包含各类专业文献、高等教育、各类资格考试、中学教育、外语学习资料、文学作品欣赏、生活休闲娱乐、行业资料、教程贴:教你自己编写DIY武将的AI(太阳神三国杀lua)96等内容。 
 以天蓬元帅猪八戒为主角的关于太阳神三国杀Lua武将...太阳神三国杀的 AI 系统一般会 在这个时候记录一些...这里可以总结出一句话 了:源代码在手,怎么 DIY 都...  本文假定读者已熟悉太阳神三国杀 Lua 武将扩展的有关概念和方法。 本文内容只...教程贴:教你自己编写DI... 16页 3下载券 ©2016 Baidu 使用百度前必读 |...  太阳神三国杀LUA手册_电脑基础知识_IT/计算机_专业...--视为技的定义对于 AI 而言是无效的。为了让 AI...教程贴:教你自己编写DI... 16页 3下载券
太阳...  百度太阳神三国杀 Lua 吧 (百度文库收藏版) 编写...武将变更 第八章:启用 AI 一、创建我们的 AI ...在最上面找到 DIY 菜单,里面有个卡牌编辑器: 别...  由ADD-SUMME 攒编 ADD-SUMMER 声明:本经验交流为...下面来教大家如何制作食物以及枪支弹药和模具,以及...? 太阳神三国杀lua教程 4855人
? 三国杀教程 ...}

我要回帖

更多关于 三国杀反贼怎么玩 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信