太阳神三国杀lua吧 关注:2,632贴子:73,374

★【蛇叔的话系列】★如何从一窍不通成为Lua熟手

只看楼主收藏回复

一楼惯例


IP属地:江苏1楼2014-10-21 12:37回复
    区别于大部分吧友,笔者曾是一名专业程序员,所以撰字行文上可能会带有一些程序员的痕迹,但是我会尽量站在普通学习者的角度,用纯文字的方式与大家探讨如何成为一名Lua熟手。


    IP属地:江苏2楼2014-10-21 12:40
    回复
      首先,要明白一个“深刻”的道理,要想写出一份无论是“低小下”还是“高大上”的三国杀武将Lua,都不需要你去精通Lua程序语言,甚至你可以对这门语言一无所知。所以,除非你刻意想去研究这门语言,那么此时可以抛开Lua语言本身的基础教程了。
      现在,大家就跟随蛇叔本身的经历,开启一段寻常亦或不寻常的Lua之路吧。


      IP属地:江苏3楼2014-10-21 12:45
      回复
        顶一下 更新求艾特


        IP属地:福建4楼2014-10-21 12:52
        回复
          你是一个对太阳神三国杀Lua一无所知的人,你想学习怎么把自主DIY的武将放到太阳神三国杀里,怎么办?
          你有四种最重要的方式:伸手、询问、搜索、研究。
          这四种方式,不管你是菜鸟还是大神,可能始终会围绕着你的整个Lua生涯,只不过随着渐渐的独立,伸手变得越来越少,询问和搜索及研究的比重反而逐渐上升。
          大概是2011年,我开始接触Lua,试图设计并实现自己的武将,出于程序员的本能,我一开始并没有像纯伸手党那样扔一堆破烂描述很潇洒地要Lua(事实证明这是一种很2的行为,因为几乎没有人会像狗一样你一说他就乖乖听话写给你),我找到了一个教程,依样画葫芦学会了如何建包、建武将、写翻译。
          那么问题来了,接下来我该怎么做?
          答案是:一面询问,一面搜索。
          不学习,肯定没法进步。而询问和搜索,都是很重要和很有效的学习过程。现在有了Lua手册和独孤菌经典的教程,学习Lua的方向性比几年前强化了很多(虽然随着API的不断修改和更新,那本手册已经被废了一小半)。
          询问是交互学习的过程,搜索则是自我学习。很多你询问得来的答案,其实在机智的搜索下都能够解决。
          好,我们就来说说搜索。
          大部门情况下,我们写Lua武将,不需要进源码搜索,因为你很可能不懂C++,就算懂了,也不一定能够转化成现成的Lua写法(if 不懂Lua),那么毫无疑问,善用关键词的吧内搜索和DIY包搜索将是两把无与伦比的自学利器。
          ①吧内搜索:太阳神三国杀吧和太阳神三国杀lua吧,由于历史原因,这两个吧是lua代码讨论最多的集散地(,从“古”至今,无数易难问题都得到了很好的解决。小到一个动作的写法,大到一个扩展包的完成,你经常可以从中得到启示,而每一个启示的瞬间,都是你作为一名Lua者成长的过程。
          ②DIY包搜索:这或许是被很多人忽略的学习方式。相比于固定技能的Lua官版技能手册,DIY包具有极其开阔的技能创意、丰富多彩的逻辑形式、现成的扩展包格式和翻译文件、集中的技能时机。一个庞大的、成型的DIY扩展包,可以帮你造就技能框架,解决大部分基础问题,而进阶的细节方面,就可以顺势结合“询问”来解决,久而久之,“询问”的次数便会越来越少,因为你已经记住“这儿我该怎么做”了。


          IP属地:江苏5楼2014-10-21 13:13
          回复
            我曾经对很多Lua者说过,格式是死的,逻辑是活的。
            作为一名纯粹的Lua者,你不会去修改源码,你只能遵循它提供的接口(API),在固有格式下实现“你的逻辑”。好比在国道上行驶,往往你有不同的道路选择,或近或远,最终只要能达到目的地,就是旅行成功。
            好比指向类技能:你使用【杀】可以额外指定一个目标(或者你想描述成“不是其他角色使用的不属于【桃】、【酒】、【闪】”的基本牌可以指定的目标个数上限+1“也可以,我没意见@叫什么啊你妹 ),在现成的API(TMS时机)出现之前,有好几种迂回实现的方式,比方说在使用杀时插入一个询问,发动后重构结构体,等等。
            现在的我,常常在吧友提出技能实现时,言(gu)简(yi)意(zhuang)赅(bi)地只回复逻辑方式或者核心语句,对此我感到很抱歉,所以如果没有高手帮助完成代码的话,最终我还是会把核心代码段或全部代码奉上的。
            言归正传,锻炼你的逻辑思维,是从新手迈入熟手的至关重要过程。如果逻辑思维比较欠缺,那么即便你精通各种Lua时机和语句,你也不知道如何正确地组合它们。是的,组合的过程就是逻辑思维实现的过程。我上面强调了在现成的大型DIY包学习逻辑的重要性,希望看官可以加以尝试,这绝壁是有益无害的。


            IP属地:江苏6楼2014-10-21 13:29
            收起回复
              那么问题又来了:
              什么是Lua里的逻辑,怎样构建技能的逻辑方式呢?
              我用一个稍微复杂的技能作为例子(由于是针对逻辑,故看官不必在意是V1还是V2):
              ”失去手牌时,若你的手牌数为全场最少,你可以亮出牌堆顶的3张牌并获得其中一种颜色的牌,然后将剩下的牌交给一名其他角色。“
              我相信绝大部分人能够轻松写出”失去手牌时“的时机,但不少人会(有一点)卡在”手牌数“为全场最少。
              好,那么问题来了(我怎么又说这句话了······):
              怎么比较手牌?
              搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索搜索!
              经过搜索,我确定你能找到类似
              local x=player:getHandcardNum()
              for _,p in sgs.qlist(room:getOtherPlayers(player)) do
              if p:getHandcardNum()<x then···································
              之类的语句,很明显,这句就是先获取自己的手牌数,然后把其他人的手牌数一个个与自己比对。问题KO。
              接下来,亮出牌堆顶的3张牌。这时候已经不用我提示该怎么做了。
              你绝壁能够搜到亮牌的写法
              local x= 3
              local card_ids=room:getNCards(x)
              room:fillAG(card_ids,nil)
              local card_id=room:askForAG(player, card_ids, false, self:objectName())
              从牌堆取三张,放到一个框子里,展示给自己选择。
              下一步就是”我点一个颜色的牌,然后这种颜色的牌全跑到我手里“,对吧。
              你也许想不到这段操作的逻辑表述,但是你可以去搜,只要有类似的表述,你就可以打开别人家的代码,看看人家是怎么实现逻辑的。
              ”哦~原来是这样的啊“:
              local acard_ids=sgs.IntList()--这个池子放给自己的同色牌
              local acard_idss=sgs.IntList()--这个池子放给别人的同色牌
              --------------------------------------------嗯,我今天学会了用sgs.IntList()收集目标牌的方式
              local same=sgs.Sanguosha:getCard(card_id):getColor()--原来这就是比对颜色是不是一样的东西啊!
              for _,id in sgs.qlist(card_ids) do
              if (sgs.Sanguosha:getCard(id)):getColor()==same then
              acard_ids:append(id)--放到给自己的牌池里
              for _,id in sgs.qlist(acard_ids) do
              player:obtainCard(sgs.Sanguosha:getCard(id))--我拿走这些同色牌
              end
              else
              acard_idss:append(id)--剩下的放在池子里准备给别人
              end
              end
              干得漂亮!


              IP属地:江苏7楼2014-10-21 13:49
              收起回复
                艾特,从没问过问题,一直自己琢磨= =感觉好累~~~望指明路!!!


                IP属地:陕西8楼2014-10-21 13:52
                收起回复
                  搜索和询问是一门利器,你渐渐地会解决遇到的很多问题,你可以在笔记里把它们记下来,或者放到自己的DIY包里,以后需要用到时,可以直接套用,省却时间。
                  说到底,这才是最关键的,解决了,记住了,才会有进步,才能逐渐摆脱依赖。相信每个人的数学老师都说过,只要你记住了方法,以后再遇到类似问题,不就都能解答了吗?


                  IP属地:江苏9楼2014-10-21 13:54
                  回复
                    四年来,蛇叔从青涩小蛇变成了胡渣大叔,从对Lua一窍不通变成了Lua熟手(感谢各位赐予的”大神“称号,实在是愧不敢当),现在新手们提出的种种疑惑,我,包括其他热心帮助大家的大神,不少问题都曾经遇到过,在不断的交流学习,搜索研究中,我们解决了这些问题,记住了那些写法,将逻辑思维从简单干涩发展到成熟完善。这并不是十分困难的事情,一步一个脚印,踏踏实实学习,用不了多久,你就会渐渐独立,成为笑傲一方的大神了!(此处继续@叫什么啊你妹 天纵奇才!数月成精!)


                    IP属地:江苏10楼2014-10-21 14:02
                    收起回复
                      敲碗求更新


                      IP属地:陕西11楼2014-10-21 14:35
                      收起回复
                        路过


                        IP属地:广东来自Android客户端12楼2014-10-21 16:53
                        回复
                          支持一下


                          IP属地:广东来自Android客户端13楼2014-10-21 18:22
                          回复
                            围观


                            IP属地:北京来自Android客户端14楼2014-10-21 19:08
                            收起回复
                              好评!


                              来自Android客户端15楼2014-10-21 19:39
                              回复