北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 14193|回复: 22

写了一个java版本的mud client,有同行可以参考一下

[复制链接]
发表于 2010-12-28 15:34:32 | 显示全部楼层 |阅读模式
新人求机器人未果,干脆自己写一个java版本客户端,只有打印控制台,没有图形界面,但是机器人好写多了
优点:不用那个前宽后窄、左重右轻的mud脚本,就没有任何限制,直接用java写,理论上可以写出任何强大的机器人,而且作为一  个  程序员你把这代码在开发工具里面一跑,没人知道你在做啥....
缺点:所有的机器人都要从头写...
我把代码贴下,欢迎同行补充机器人啊!很简单,就两个类:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.net.Socket;

public class SocketClient implements Runnable {
        static Socket client;
        private static String robotMethodName = null;
        private static String printConsonleFlag = "true";

        public static void main(String[] args) throws Exception {

                client = new Socket("pkuxkx.net", 8080);

                Thread reader = new Thread(new SocketClient());
                reader.start();

                PrintWriter out = new PrintWriter(client.getOutputStream());
                boolean flag = true;
                while (flag) {
                        BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
                        String keyIn = wt.readLine();
                       
                        // mySet setRobotMethodName newBieDaZuo
                        // mySet setPrintConsonleFlag false
                        if (keyIn.startsWith("mySet")) {
                                String comman[] = keyIn.split(" ");
                                String setArg[] = { comman[2] };
                                invokeMethod(SocketClient.class, comman[1], setArg);
                        } else {
                                out.println(keyIn);
                                out.flush();
                        }
                        // end while
                }
                client.close();
        }

        public void run() {
                try {
                        InputStream inputStream = client.getInputStream();
                        int ret_read;

                        String robotName = "";
                        String serverContent = "";
                        String command = "";
                        Object tmpObj = null;
                        byte[] buff = new byte[1024];
                        while (true) {
                                ret_read = inputStream.read(buff);

                                if (ret_read > 0) {
                                        // s = new String(buff, 0, ret_read,"gbk").trim();
                                        serverContent = new String(buff, 0, ret_read).trim();
                                        serverContent = serverContent
                                                        .replaceAll(
                                                                        "[(\\[\\d{1,2};\\d{1,2}m)|(\\[\\d{1,2};\\d{1,2};\\d{1,2}m)|(\\[\\d{1,2}m)]",
                                                                        "");
                                        if ("true".equals(printConsonleFlag))
                                                System.out.print(serverContent);

                                        robotName = getRobotMethodName();
                                        if (robotName != null && robotName.length() > 0) {
                                                String[] _tmp = { serverContent };
                                                tmpObj = invokeMethod(Robot.class, robotName, _tmp);

                                                if (tmpObj != null && tmpObj instanceof String)
                                                        command = (String) tmpObj;
                                        }

                                        if (command != null && command.length() > 0) {
                                                PrintWriter out = new PrintWriter(client
                                                                .getOutputStream());
                                                out.println(command);
                                                out.flush();
                                                command = "";
                                        }
                                        // s = s.replaceAll("\\[\\d{1,2};\\d{1,2}m","");
                                        // System.out.print(s);
                                }
                        }

                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        public static Object invokeMethod(Class ownerClass, String methodName,
                        Object[] args) throws Exception {
                Class[] argsClass = new Class[args.length];
                for (int i = 0, j = args.length; i < j; i++) {
                        argsClass = args.getClass();
                }
                Method method = ownerClass.getMethod(methodName, argsClass);
                return method.invoke(ownerClass.newInstance(), args);
        }

        public static String getRobotMethodName() {
                return robotMethodName;
        }

        public static void setRobotMethodName(String robotMethodName) {
                System.out.println("now use robot :"+robotMethodName);
                SocketClient.robotMethodName = robotMethodName;
        }

        public static String getPrintConsonleFlag() {
                return printConsonleFlag;
        }

        public static void setPrintConsonleFlag(String printConsonleFlag) {
                System.out.println("now print ponsonle is :"+printConsonleFlag);
                SocketClient.printConsonleFlag = printConsonleFlag;
        }
}


public class Robot {
        public  String newBieDaZuo(String serverContent) throws Exception {
                String backValue="";       
       
                if (serverContent.indexOf("你发呆了一会儿,发现自己居")!=-1) {
                        Thread.sleep(1000);
                       
                        backValue = "dazuo 11";
                }

                if (serverContent.indexOf("你运功完毕,深深吸了口")!=-1) {
                       
                        backValue = "dazuo 11";
                }

                if (serverContent.indexOf("你现在的气太少了,无法产生")!=-1)  {
                        backValue = "fadai";
                }
                return backValue;
        }

}

需要补充的就是这个机器人类,欢迎补充啊,路径可以考虑写一个文本,方便维护。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-12-28 15:43:51 | 显示全部楼层
这个~程序员的水平,可望不可及啊!
膜拜高人!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-12-28 16:05:15 | 显示全部楼层
其实就是简单的socket读写,隔行如隔山而已,我就是上班闲的蛋疼,高人有都是,没人帮我一起补充么?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-12-28 16:07:37 | 显示全部楼层
原帖由 djy 于 2010-12-28 04:05 PM 发表
其实就是简单的socket读写,隔行如隔山而已,我就是上班闲的蛋疼,高人有都是,没人帮我一起补充么?


不如用mush
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-12-28 16:14:04 | 显示全部楼层
没玩过,感觉MUSHClient和mud差不多,只是脚本语言强大很多,不如直接编码来的爽,而且还要开一个客户端,熟悉它的功能,麻烦。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-12-28 16:26:54 | 显示全部楼层
原帖由 djy 于 2010-12-28 04:14 PM 发表
没玩过,感觉MUSHClient和mud差不多,只是脚本语言强大很多,不如直接编码来的爽,而且还要开一个客户端,熟悉它的功能,麻烦。


考虑一下最基本的机器人,抓去一个变量,然后用在另一个trigger里头。
你这样的硬编码根本无法维护。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-12-28 16:33:22 | 显示全部楼层
不想搞的太复杂,否则又搞成另外一个脚本解析器了,初步思路就是把所有的机器人都放robot类里面,路径可以数据库或者写文本,然后在控制台输入mySet setRobotMethodName newBieDaZuo类似的东西来调用不同的机器人。
现在我的控制台看起来就是空白一片,啥都没有,其实后台在跑,看起来努力工作的样子,哈哈
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-12-28 16:37:44 | 显示全部楼层
你是巫师?刚好我问一下你们服务器是linux?字符编码用的gbk?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-12-28 16:41:39 | 显示全部楼层
原帖由 djy 于 2010-12-28 04:37 PM 发表
你是巫师?刚好我问一下你们服务器是linux?字符编码用的gbk?


linux
gb2312
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-12-28 16:42:05 | 显示全部楼层
原帖由 djy 于 2010-12-28 04:33 PM 发表
不想搞的太复杂,否则又搞成另外一个脚本解析器了,初步思路就是把所有的机器人都放robot类里面,路径可以数据库或者写文本,然后在控制台输入mySet setRobotMethodName newBieDaZuo类似的东西来调用不同的机器人。
...


也许一年以后你是一个wiz,嘿嘿
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-5-20 01:23 AM , Processed in 0.010752 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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