太阳神三国杀卡牌多DIY工具 太阳神那个现在不能...

君,已阅读到文档的结尾了呢~~
太阳神三国杀DIY卡牌编辑器新手教程
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
太阳神三国杀DIY卡牌编辑器新手教程
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口从2008年-2014年 快猴网一直在努力做到最好
备案编号:粤ICP备号-1教程贴:教你自己编写DIY武将的AI(太阳神三国杀lua)96
上亿文档资料,等你来发现
教程贴:教你自己编写DIY武将的AI(太阳神三国杀lua)96
在cpp区发了那篇DIY教程贴之后,我转战到了l;首先,AI的编写与lua技能的代码有很大关系,我;1.写代码要整齐,缩进量要层层递进,保证代码的易;2.写触发技的时候,要清楚每个触发事件的原理,最;则可能引入异常的行为;3.没有必要的时候不要重载can_trigger;函数;发的事件来写条件分支语句,这样逻辑会更加清晰一些;5.尽量避免在视作技中使用ask
在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=\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\
local skillcard = sgs.Card_Parse(card_str)
assert(skillcard)
return skillcard end 例子是以下这个武将的技能—求败: [\独孤求败\ [\无剑\ [\有剑\ [\有剑\ [\求败\ [\求败\ [\当你没有装备武器时你的杀不可被闪避。\ [\回合内你可以将任意武器牌当决斗使用。若决斗成功则你可以摸两张牌否则对方摸两张牌\ [\= \当你装备有武器时本回合你可以出X张杀,X为你当前的攻击范围,回合内你使用的所有杀都将被计数(不包括决斗出的杀)。\ --luaqiubai local luaqiubai_skill={} --设置技能名称 luaqiubai_skill.name=\--把这个技能添加进ai_skills列表中,使AI可以使用这个技能 table.insert(sgs.ai_skills,luaqiubai_skill) --判断技能是否可以发动的函数
luaqiubai_skill.getTurnUseCard=function(self)
--获取手牌中杀的个数
local slash_num = self:getCardsNum(\ --获取该回合出杀的次数
local slash_used = self.player:usedTimes(\ --如果已装备武器,且手中有杀多于一个, --且获取该回合出杀的次数小于攻击范围,则不发动该技能
--这是为了保证有剑和求败两个技能利用最大化
if self.player:getWeapon() and slash_num > 0
and slash_used < self.player:getAttackRange() then return nil end
--获取我所有的手牌和装备牌
local cards = self.player:getCards(\ cards=sgs.QList2Table(cards)
local card
--根据使用价值来排序
self:sortByUseValue(cards,true)
--遍历所有卡牌
for _,acard in ipairs(cards)
--如果是武器牌则使用这个卡牌
if acard:inherits(\
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 = (\ --指定要使用的卡牌
local skillcard = sgs.Card_Parse(card_str)
assert(skillcard)
return skillcard end
第二类技能编写是在smart-ai.lua中的getSkillViewCard中添加代码,用于响应的卡牌有杀、闪、桃、酒、无懈,我们只需要在对应的分支语句里添加即可。比如在对闪的处理可以看到龙魂、龙胆和倾国,如果我们加一个技能叫“我闪”,这个技能可以把装备牌当闪使用,那么用下方红色的代码就能实现它的AI: ………… elseif class_name == \ if player:hasSkill(\
if card:getSuit() == sgs.Card_Club then
if card_place ~= sgs.Player_Equip then
if player:hasSkill(\
elseif player:hasSkill(\
if card_place == sgs.Player_Equip and player:hasSkill(\
有一个情况比较特殊,zeroCardView就是把0张牌当某牌,这个很特殊,目前只用来实现酒诗的AI,前两种技能如果是把0张牌当某牌,AI都可以用这个函数实现。如果写一个技能“万兽”和酒诗相似,只是正面向上时翻面可以当南蛮入侵,那么添加红色代码即可: local function zeroCardView(class_name, player)
if class_name == \
if player:hasSkill(\
else if class_name == \
if player:hasSkill(\
第三类技能编写的通式是: local skillname_skill={} skillname _skill.name=\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 = (\
local skillcard = sgs.Card_Parse(card_str)
assert(skillcard)
return skillcard end
sgs.ai_skill_use_func[\ local target
选择技能发动的目标,若没找到合适目标则return nil
use.card = card
use.to =append(target)
return end 例子是以下这个武将的技能—争宠: [\吴健\ [\争宠\ [\= \出牌阶段,你可以弃一张手牌,指定两名女性角色。若如此做,视为其中一名女性角色对另一名女性角色使用一张【决斗】(此【决斗】不可被【无懈可击】响应),每回合限用一次\ [\阉割\ [\你每次对其他男性角色造成伤害,可使收到该伤害的角色变为女性,直到游戏结束\ --zhengchong local zhengchong_skill={} --设置技能名称 zhengchong_skill.name=\--把这个技能添加进ai_skills列表中,使AI可以使用这个技能 table.insert(sgs.ai_skills,zhengchong_skill) --判断技能是否可以发动的函数 zhengchong_skill.getTurnUseCard=function(self)
--如果该回合发动过则不发动
if self.player:hasUsed(\
三亿文库包含各类专业文献、高等教育、各类资格考试、中学教育、外语学习资料、文学作品欣赏、生活休闲娱乐、行业资料、教程贴:教你自己编写DIY武将的AI(太阳神三国杀lua)96等内容。 
 太阳神三国杀新手教程 2786人
太阳神三国杀lua—DIY孟获by紫陌易尘 8964人
...正如《新版太阳神三国杀武将扩展学习手册》所描述的那样,太阳神三国杀的AI系统还是...  ·虫 首发:百度太阳神三国杀 Lua 吧 编写说明本...武将变更 第八章:启用 AI 一、创建我们的 AI ...在最上面找到 DIY 菜单,里面有个卡牌编辑器: 别...  这是基于踏青版太阳神三国杀的武将lua,仅供参考用,不能直接放入游戏中。如需...教程贴:教你自己编写DI... 16页 3下载券
太阳神三国杀diy图文教程... 23...  这是基于踏青版太阳神三国杀的武将lua,仅供参考用,不能直接放入游戏中。如需...教程贴:教你自己编写DI... 16页 3下载券
太阳神三国杀diy图文教程... 23...  百度太阳神三国杀 Lua 吧 (百度文库收藏版) 编写...武将变更 第八章:启用 AI 一、创建我们的 AI ...在最上面找到 DIY 菜单,里面有个卡牌编辑器: 别...  我自己的用法是,每个武将阵亡的时候,出现特 效,特效文字就是死亡词 图片特效,...教程贴:教你自己编写DI... 16页 3下载券
太阳神三国杀lua—DIY神... 4...  新版太阳神三国杀技能卡型视为技AI设计概述_计算机...本文假定读者已熟悉太阳神三国杀 Lua 武将扩展的有...教程贴:教你自己编写DI... 16页 3下载券 ©...  新版太阳神三国杀武将扩展学习手册II_法律资料_人文...以及 只不过是我们没有给 LuaHanshuiDist 写翻译,...太阳神三国杀的 AI 系统一般会 在这个时候记录一些...

参考资料

 

随机推荐