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

原创 2015年11月18日 12:15:59
在学习《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);
	}
	

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

用数据驱动思想来设计游戏

游戏由两部分组成,逻辑和数据。这是一种对游戏的有效划分。逻辑部分定义游戏引擎的核心原则和算法,数据部分则提供其内容 和行为的具体细节。在最初的游戏开发的过程中,大家总是喜欢将逻辑和数据都写入代码中,这...
  • u013321328
  • u013321328
  • 2015年03月31日 20:03
  • 1176

实体-组件-系统(ECS)实现数据驱动的游戏框架

ECS实现数据驱动的游戏框架
  • u012966744
  • u012966744
  • 2014年07月04日 22:48
  • 2382

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

在学习《Unix编程艺术》,作者在介绍Unix设计原则时,其中有一条为“表示原则:把知识叠入数据以求逻辑质朴而健壮”。 我对这个原则很有共鸣,所以先学习了数据驱动编程相关的内容,这里和大家分享出来和...
  • chenkevin1986
  • chenkevin1986
  • 2015年11月18日 12:15
  • 418

Jsp页面无法显示List数值debug4天经历-dayThree

既然List显示没有问题 ,那么为什么页面看不见 ,我猜测 是 页面的其他代码将 页面显示的内容抹去了 。 提交内容的核心代码如下 :   function submitRequest(){  ...
  • accontras
  • accontras
  • 2013年01月10日 17:33
  • 402

客服,GM,玩家,以及游戏公司

很多的时候,大部分的玩家并不能真正理解GM和客服以及游戏之间的具体关系,很多人认为,当他们在游戏中遇到BUG,卡机掉线或者其他情况的时候可以找GM来解决,但是事实上,他们第一个联系到的人是客服人员,之...
  • cy19880619
  • cy19880619
  • 2011年09月24日 14:57
  • 278

《unix/linux编程实践教程》学习笔记:第七章 事件驱动编程:编写一个视频游戏

本章以一个弹珠游戏为例,学习了 屏幕编程的curses库(Ubuntu中需要另外安装软件) 时间编程,使用计时器 信号处理 临界区 注意编译的命令为 gcc filename.c - o ...
  • yz764127031
  • yz764127031
  • 2017年03月12日 18:09
  • 206

网页抓取实现

最近有在搞网页抓取,顺便mark下 抓取简单的说就是模仿http请求,分析网页结构,解析网页内容,获取自己需要的内容 使用的插件:httpwatch 核心代码 package com....
  • dly120219891208
  • dly120219891208
  • 2015年07月22日 14:32
  • 550

Httpclient最新工具包 可以过HTTPS验证

httpclient
  • Java_chaozi
  • Java_chaozi
  • 2016年11月10日 16:02
  • 999

常用数据处理算法-灰色关联分析(GM)

灰色理论
  • qq_15304293
  • qq_15304293
  • 2017年12月04日 17:06
  • 180

gm(1,1)模型算法实现

def gm11(x,n):#n是指预测的数值,例如前面2011,2012,2013,2014你可以用4来预测2015 x1 = x.cumsum() z1 = (x1[:len(x1...
  • yj1499945
  • yj1499945
  • 2016年05月08日 18:40
  • 2457
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据驱动编程 游戏GM的实现
举报原因:
原因补充:

(最多只允许输入30个字)