数据驱动编程 游戏GM的实现

在学习《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).append("\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);
	}
	

}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值