数据驱动编程 游戏GM的实现
2015-11-18 12:15
429 查看
在学习《Unix编程艺术》,作者在介绍Unix设计原则时,其中有一条为“表示原则:把知识叠入数据以求逻辑质朴而健壮”。
我对这个原则很有共鸣,所以先学习了数据驱动编程相关的内容,这里和大家分享出来和大家一起讨论。
理论性的东西:(复制的)
数据驱动编程,也叫元编程。
数据驱动编程的核心出发点是相对于程序逻辑,人类更擅长于处理数据。
数据比程序逻辑更容易驾驭,所以我们应该尽可能的将设计的复杂度从程序代码转移至数据
上传小刚的代码:
我对这个原则很有共鸣,所以先学习了数据驱动编程相关的内容,这里和大家分享出来和大家一起讨论。
理论性的东西:(复制的)
数据驱动编程,也叫元编程。
数据驱动编程的核心出发点是相对于程序逻辑,人类更擅长于处理数据。
数据比程序逻辑更容易驾驭,所以我们应该尽可能的将设计的复杂度从程序代码转移至数据
上传小刚的代码:
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import tianlong.ConstValue; import tianlong.common.GameConst; import tianlong.system.Monster.Monster; import tianlong.system.Monster.MonsterKit; import tianlong.system.event.systemEvent.SystemEventFunction; import tianlong.system.event.useAddEvent.UseAddUtil; import tianlong.system.hero.Hero; import tianlong.system.scene.IScene; import tianlong.system.scene.Point; import tianlong.system.scene.TileData; import tianlong.util.write.WriteUtil; import com.commons.message.IResponse; import com.commons.message.Response; /** * * @author kevin chen * @Description:GM命令 反射技术 与 数据驱动思想 * @date 2015年11月9日 上午11:44:38 */ class GmOrder { /**这些GM方法所在的类*/ private Object executeObj; /**gm的一些注释 用来说明该GM是干什么!*/ private Intro intro ; /**方法名 对应GM命令的字符串*/ private Method method; public GmOrder(Object executeObj,Method method,Intro intro) { this.executeObj = executeObj; this.method = method; this.intro = intro; } public String getIntroValue() { return intro.value(); } public String getMethodParameterTypeStr() { Class<?>[] types = method.getParameterTypes(); StringBuffer sb = new StringBuffer(); for (int i = 1; i < types.length; i++) { Class<?> type = types[i]; String typeName = type.getName(); if(typeName.equalsIgnoreCase("java.lang.String")){ sb.append(" string"); }else{ sb.append(" "+typeName); } } return sb.toString(); } public void execute(Hero hero , Object[] args){ try { args = dealArgs(hero,args); this.method.invoke(this.executeObj,args); hero.sendDebugMsg(hero, this.intro.value() +" GM命令执行成功!"); } catch (Exception e) { hero.sendDebugMsg(hero, this.intro.value() +" GM命令执行失败!\n"+e.getMessage()); e.printStackTrace(); } } /**处理参数 支持不同参数传入*/ public Object[] dealArgs(Hero hero,Object[] args){ Class<?>[] types = method.getParameterTypes(); Object[] objs= new Object[types.length]; objs[0] = hero; for (int i = 1; i < types.length; i++) { Class<?> type = types[i]; String typeName = type.getName(); if( i <= args.length ){ if(typeName.equalsIgnoreCase("int")){ objs[i] = Integer.parseInt(args[i-1].toString()); }else if(typeName.equalsIgnoreCase("long")){ objs[i] = Long.parseLong(args[i-1].toString()); }else if(typeName.equalsIgnoreCase("boolean")){ objs[i] = Boolean.parseBoolean(args[i-1].toString()); }else if(typeName.equalsIgnoreCase("java.lang.String")){ objs[i] = args[i-1].toString(); } }else{ if(typeName.equalsIgnoreCase("int")){ objs[i] = 0; }else if(typeName.equalsIgnoreCase("long")){ objs[i] = 0; }else if(typeName.equalsIgnoreCase("boolean")){ objs[i] = false; }else if(typeName.equalsIgnoreCase("java.lang.String")){ objs[i] = null; } } } return objs; } } @Target(value={ElementType.METHOD}) @Retention(value=RetentionPolicy.RUNTIME) @Documented @interface Intro { String value(); } public class GmOrderManager { private Map<String,GmOrder> gmOrders = new HashMap<String, GmOrder>(); private GmOrderManager(){} private static final class Sington{ protected static GmOrderManager instance = new GmOrderManager(); } public static GmOrderManager getInstance(){ return Sington.instance; } /**服务器启动初始化GM命令*/ public void startServer(){ Method[] methods = this.getClass().getDeclaredMethods(); for(Method method : methods){ Intro intro = method.getAnnotation(Intro.class); if(intro != null){ GmOrder gmOrder = new GmOrder(this,method ,intro); gmOrders.put(method.getName().toLowerCase(), gmOrder); } } } public void executeGmOrder(Hero hero,String orderStr,Object[] objs){ GmOrder gmOrder = gmOrders.get(orderStr); if(gmOrder == null){ hero.sendDebugMsg(hero, "没有该gm命令!"); return ; } gmOrder.execute(hero, objs); } @Intro("查看gm命令") void showOrder(Hero hero){ StringBuffer sb = new StringBuffer("所有GM命令列表:\n"); for (Iterator<Entry<String, GmOrder>> iterator = gmOrders.entrySet().iterator(); iterator.hasNext();) { Entry<String, GmOrder> entry = iterator.next(); String orderStr = entry.getKey(); GmOrder gmOrder = entry.getValue(); String introValue = gmOrder.getIntroValue(); String typeStr = gmOrder.getMethodParameterTypeStr(); sb.append(introValue).append("\t").append(orderStr).append("\t").append(typeStr).append("\n"); } hero.sendDebugMsg(hero, sb.toString()); } @Intro("查询gm命令") void findOrder(Hero hero,String name){ StringBuffer sb = new StringBuffer("GM命令查询结果:\n"); for (Iterator<Entry<String, GmOrder>> iterator = gmOrders.entrySet().iterator(); iterator.hasNext();) { Entry<String, GmOrder> entry = iterator.next(); String orderStr = entry.getKey(); boolean flag = false; if(orderStr.contains(name)){ flag = true; } GmOrder gmOrder = entry.getValue(); String introValue = gmOrder.getIntroValue(); if(introValue.contains(name)){ flag = true; } String typeStr = gmOrder.getMethodParameterTypeStr(); if(flag){ sb.append(introValue).append("\t").append(orderStr).append("\t").append(typeStr).appen 9fa3 d("\n"); } } hero.sendDebugMsg(hero, sb.toString()); } @Intro("添加某种道具!") void addtool(Hero hero,int itemId,int count,int bind){ if(count==0){ count = 1; } UseAddUtil.add(hero, GameConst.TOOL, count, itemId, bind, false, 0, false); } @Intro("添加某种装备") void addequip(Hero hero,int itemId,int count,int bind){ if(count==0){ count = 1; } UseAddUtil.add(hero, GameConst.EQUIP, count, itemId, bind, false, 0, false); } @Intro("当前玩家角色升级") void upLevel(Hero hero,int level){ } @Intro("增加当前玩家经验") void addExp(Hero hero,int addExp){ hero.addExp(addExp); } @Intro("跳场景") void jumpScence(Hero hero,int scenceId, int x, int y){ } @Intro("创建怪物") void createMonster(Hero hero,int monsterModelId, int num){ Monster monster = MonsterKit.createMonster(monsterModelId, hero.getPoint(), 0); hero.getIScene().addMonster(monster); } @Intro("增加当前玩家属性") void addHeroAttr(Hero hero,int attrId,int addAttrValue){ } @Intro("增加当前玩家某种货币的数量") void addMoney(Hero hero,int moneyNum,int moneyType){ UseAddUtil.add(hero, moneyType, moneyNum, 0, true); } }
相关文章推荐
- To pack your python scripts to EXE by using PyInstaller3.0
- C#取得当前目录 转载
- Java8 Lumbda表达式 初步
- java反射机制
- java单例模式
- QQ消息拉一拉消失和如何在Eclipse导入gethub中下载的文件
- java类加载详解
- PHP7新特性 What will be in PHP 7/PHPNG
- Python 面向对象(初级篇)
- lua中使用json格式
- lua中使用json格式
- Windows下使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- 使用C#代码获取存储过程返回值
- python--自动删除文件
- python--自动删除文件
- ASPxGridView实现点击行则自动启用编辑状态
- intellij IDEA 15.0破解到运行第一个javaweb实例
- JAVA 字符串分割split 的用法注意
- Python 的开发环境
- MATLAB 基本小函数用法