jcl 发表于 2013-5-1 15:15:42

【MUSH】机器人初级实例教程系列(四)


前面讲解了MUSH机器的基础部分,这次直接上机器的核心了。就以森林/僵尸副本机器人为例:

开始命令,初始化什么的就不说了,大家到群72442263里去下载打包版,前面提到的Me.lua什么的都在里面。如果没有特殊需要,直接按照说明运行就可以了。如果想学习代码,请继续往下看。

机器的主要的结构函数就是main,另一个主要的功能函数就是fight,即每进入一个迷宫房间要做的事。

大家看代码里的注释就应该明白了。
me.main = function()
        repeat
                me.goMaze()    --进入副本
                Maze.walk(me.fight)   -- 在副本里面逛,Maze.walk会遍历这个迷宫,而me.fight就是战斗,也就是说每次走进一个迷宫房间,就进行战斗,战斗结束后继续
                if me.needOutOfMaze() then-- 该出副本就出来吧
                        Execute("out;e")
                        me.inMaze = false
                        if me.stop then me.term = true end    -- 这里设置结束标志,否则出来后会自动再次进副本
                elseif me.kickedout then    --副本过期被踢出,一般打的慢的ID,还没打完就刷新或者刚打完不久久要刷新,如果只跑一圈太浪费,那么就反复跑,直到副本自己到期
                        me.inMaze = false
                        wait.time(2)
                        Execute("ask nan xian about all")
                        local l, w = wait.regexp("^[> ]*(南贤在你的耳边悄声说道.*|这里没有 nan xian 这个人。)$")
                        if string.find(l, "南贤") then Execute("e") end   -- 在副本里瞎逛时被踢出,有可能停在武庙,也有可能刚好逛到北大街,所以这里看下自己究竟是不是在武庙
                end
        until me.terminate()   -- 用户输入stop命令,这里出了副本就不再进了
end

每个房间的战斗函数,每次在迷宫里walk的时候会回调这个函数
me.enemy_list = {"tiger", "bear", "wolf", "snake", "dragon", "zombie"}
me.fight = function()
        local enemycount = 0
        for _, enemy in pairs(Maze.obj) do   -- 对迷宫里存在的敌人下kill指令。我看见不少人的机器为了偷懒,直接发一堆kill指令,结束后发一堆get all from corpse n (森林机器),虽然不影响机器运行,但是由于发了很多无效指令,不得不到处wa防止被雷劈
                for _, v in ipairs(me.enemy_list) do
                        if string.find(enemy, v) then
                                Execute("kill ".. enemy)
                                enemycount = enemycount + 1
                                break
                        end
                end
        end
        if enemycount > 0 then
                Me.auto_pfm()   -- 如果该房间存在敌人,那么自动pfm
                if var.mazeName == "forest" then   -- 森林副本战斗结束之后搜尸体
                        wait.time(0.1)
                        for i = 1, enemycount do Execute("get all from corpse " .. i) end
                end
        end
        if Maze.baoxiang then   -- 如果存在宝箱,那么捡宝
                Maze.baoxiang = false
                Execute("open bao xiang;get all from bao xiang")    -- 这里根据个人喜好,可以修改为只捡宝箱里的黄金
        end
        Me.check_state(function()
                if var.w10b and var.w10b ~= "" then    -- 检查状态,如果有10b且内力过低,则摸10b
                        if Me.force < (var.lowforce + 0 or 80000) then
                                Execute("touch " .. var.w10b)
                        end
                else
                        if Me.force < 10000 then    -- 如果没有10b,则在内力低于1万的时候吃罗刹丹
                                Execute("eat luosha dan")
                                local l, w = wait.regexp("^[> ]*(你吃下一粒罗刹无常丹,内力得到了完全的补充。|你身上没有 luosha dan 这样东西。)$")
                                if string.find(l, "罗刹无常丹") then wait.time(3) end
                        end
                end
                Me.heal()    -- 在前面确保内力之后,进行疗伤
                Me.eat(false, false)   -- 需要吃喝就吃喝吧
        end)
        Execute("jdo")   -- 每次打扫迷宫之后,自行jdo这个alias,如果有10b的话,可以alias jdo do yanjiu,lian,jiqu,没有10b可以alias jdo jiqu,当然也可以yanjiu+jiqu,练习就不必了,毕竟没有10b就不要在这里浪费内力了
        wait.time(1)
        Execute("halt")
        if var.mazeName == "forest" and Maze.isOut() then
                Execute("give all to hunter")    --森林副本的出口出需要give all
        end
        if me.terminate() or me.needOutOfMaze() or me.kickedout then
                return 1
        end
        if tonumber(var.explimit) and Me.exp and tonumber(var.explimit) < Me.exp then   -- 如果到了经验上限,自动把经验bup给宠物,不喜欢bup不要设置经验上限,或者直接把代码去掉
                Execute("bup 1000000")
                wait.time(5)
        end
        return 0
end



页: [1]
查看完整版本: 【MUSH】机器人初级实例教程系列(四)