找回密码
 注册
搜索
查看: 1659|回复: 6

零基础编写MUSH机器人笔记:(一) 基于面向对象的编程方法简单理解

[复制链接]
门派:古墓派
发表于 2018-8-19 16:51:31 | 显示全部楼层 |阅读模式
本帖最后由 kkndbdra@tj 于 2018-8-19 20:31 编辑

首先,大家可能对于面向对象这个概念很模糊。
面向对象是一种编程的思路,适用于所有中高级编程语言。
包括那些不怎么支持面向对象编程的语言,例如C语言,LUA。这些语言可以将一些基础功能结合起来模拟基于对象的方法。
面向对象编程有些什么好处?

第一:快速确立编程目标,搭建编程框架。

直白点说也就是先考虑做什么的基本框架问题,然后再考虑怎么做的细节填充问题。

举个例子:
我有一个想法:去北京
我现在只要知道:
第一步:目的地:北京

第二步:搭乘交通工具

好,这样一个基本思路就出来了。

至于交通工具是坐火车去还是坐飞机坐汽车,什么时候去,带什么行李这些细节以后再考虑。

第二:模块化编程,减少重复劳动
重复的,或者类似的功能不需要再次编辑,只需要在对象里调用相关功能模块或者稍微改写一下就可以了,减少大量的重复劳动。


在这里我先和大家说一下我理解的面向对象的概念:

举个例子,大家是不是一直想拥有一个能在书剑里能做任何事情的机器人?

这个机器人应该具有以下基础功能:
功能1. 能够移动
功能2  能够攻击目标
功能3 能够吃喝
功能4 能修理武器防具
功能5 能够领取任务
。。。。。
这个机器人的功能理论上可以无限扩展。

但是到此为止这个机器人只完成了一半。
因为它还缺乏一个功能载体,到底由谁去实施这些动作呢?
这里就需要由玩家在书剑里建立的游戏角色来实施这些动作。
而游戏角色应该拥有哪些基本属性呢?
在游戏里输入score,里面会显示如下众多属性:

属性1   角色ID:
属性2   姓名:
属性3   门派:
属性4   性别:
属性5   师傅:
。。。。。。
好了,到这里一个完整的全自动机器人已经呼之欲出!!
他应该具有如下形式:

机器人名称:全自动书剑机器人
  基本静态属性:
                  角色ID,
                  姓名:
                  门派:
                  等等
基本动态动作:
                   移动
                   攻击
                   吃喝
                   等等
有些同学可能已经猜到了,所谓对象就是这个“全自动书剑机器人”。
通俗点说对象就是你想通过编程达到的某一种功能,这种你想要研究的功能就是你所研究的对象。

当然这种“全自动书剑机器人”只是定义了一些你想要达到的功能的笼统的抽象概念,MUSH程序是没有办法具体实施的。
你知道你想吃羊群里的一只羊,但是你不确定你想吃的具体是哪只羊。
就如同你在大脑中完成了一款汽车的设计草图,但是这种草图只能看,你还需要实实在在的把汽车在现实世界里造出来才能使用。
这种把抽象对象 具体化的工作就叫做 对象的实例化。
如何实例化这个全自动机器人呢?

首先让我们看看一个机器人是如何完成一个任务的:
  
首先抓取score中的内容,然后赋值给全自动机器人:
全自动书剑机器人:(慕容派)
                ID:skyynight  (用于自动重连时使用)
                姓名:慕容天鹰
                门派:慕容派  (用于判断会门派学习的路径,设置武功pfm克制等)
                食物:60%
                饮水:60%      (用于判断是否要去吃喝)       
然后编辑如何具体实现动态动作:
                使用移动功能:(第一次)
                (首先,抓取自身位置,和岳不群的位置,然后计算自身和岳不群之间的最短路径并输入命令行)
               
                使用领取任务功能:
                (移动到岳不群的位置后,然后ask yue about job)
               
                使用移动功能:(第二次)
                (首先,抓取自身所在位置,然后搜索killer所在位置,然后计算自身和目标之间的路径并输入命令行)
               
                使用攻击功能功能:
                (输入kill killer id ,cut corpse)
               
                使用移动功能:(第三次)
                (首先,抓取自身所在位置,然后搜索岳不群r所在位置,然后计算自身和目标之间的路径并输入命令行)
               
                使用任务功能:
                (tell yue job is ok,give yue head)

所谓对象的实例化就是:
用编程语句让这个机器人的基本属性,和动态功能用编程语句具体完善起来,然后传入具体参数就可以被mush调用了。

伪代码如下:
  定义    全自动书剑机器人实例(门派=慕容派,ID=skynight,食物=60%,饮水:60%)
静态属性   ID:skyynight  (用于自动重连时使用)
                姓名:慕容天鹰
                门派:慕容派  (用于判断会门派学习的路径,设置武功pfm克制等)
                食物:60%
                饮水:60%      (用于判断是否要去吃喝)               
动态动作:
                移动:(自身位置,目标位置)
                      语句:定位自身位置坐标
                      语句:定位目标位置坐标
                      语句:计算两点之间的最短路径
                      语句:输入最短路径到命令行
                攻击:(攻击目标的ID,攻击目标的名字)
                       语句:kill killer
                      语句: follow killer id
                      语句:cut killer id
                      ......
                动态动作的内容较多,大家理解就好了。
这样 一个对象的慕容派实例就完成了。



这个慕容派机器(实例)怎么在mush中使用呢?
例如 当你在触发器里发现:“你的肚子再咕咕叫了”
然后你在匹配命令行里填上:/请调用机器人脚本里的吃喝函数。(自然语言伪代码)
                                        例如/robot.chihe()
然后吃喝功能脚本计算出一个最近的吃喝点(扬州茶馆):e;e;e;s;s;s;eat doufu,drink tea 传给MUSH去执行.
你的角色就会自动完成相关吃喝功能了。

无论你的人在哪里,脚本都会自动计算出一个最佳路径,如果你使用zmud触发器完成这个功能你可能要调用几十个函数,好几十个语句去判断不同的城市,不同的吃喝点。但是使用脚本的机器人里包含的函数你只需要在匹配行里调用一次 机器人:吃喝() 这个函数就可以了。

所以说在搭建基本框架的阶段你只需要知道这个机器人需要一个去吃喝的功能就可以了。
而这个机器人 :吃喝()的功能 怎么用编程语言实现,你可以以后在进行细节填充的时候再仔细编辑程序。
甚至你可以使用MUSH所支持的不同的编程语言(LUA,python,php)等去实现一个吃喝功能。非常方便。

利用lua,python等脚本你完全可以自己编写一个函数:

函数: 寻找最短路径=search.road()
每次你要使用这个功能区寻找合适路径的时候直接调用这个函数就可以了。
甚至你的不同动作里反复调用同一个函数:
找killer -----/search.road(自身位置=大理当铺,目标位置=killer位置)
去任务NPC  ------/search.road(自身位置=大理当铺,目标位置=华山岳不群)
去吃喝-----------/search.road(自身位置=大理当铺,目标位置=武当山脚茶铺)
一个函数解决多个问题。这样机器人的编程是不是简单了许多?
你只要跟搭积木一样,首先定义一些基本功能的函数,然后拼接组合作何这些基本函数就可以了。


具体怎么编程具体的功能函数,和属性变量请参考后续的帖子。                                       

                       
               






评分

2

查看全部评分

门派:少林派
发表于 2018-8-19 17:17:00 | 显示全部楼层
楼主说得还是比较浅显易懂的,期待后文。      
门派:姑苏慕容
发表于 2018-8-19 21:46:30 | 显示全部楼层
为啥要拿我的名字做例子呢
门派:古墓派
 楼主| 发表于 2018-8-19 22:39:25 | 显示全部楼层
sbknight@tj 发表于 2018-8-19 21:46
为啥要拿我的名字做例子呢


馆长的大名大家都知道,熟悉程度高,比较好理解
门派:大轮寺
发表于 2018-8-23 15:33:19 | 显示全部楼层
占楼,学习学习,支持用馆长大名
门派:峨嵋派
发表于 2018-8-24 22:20:46 | 显示全部楼层
强帖留名 认真学习
门派:天龙寺
发表于 2018-9-2 01:38:33 | 显示全部楼层
写的非常清晰易懂,多谢多谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-6-9 19:52 , Processed in 0.025003 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表