关闭

游戏中的任务系统的简单架构!

标签: java 游戏服务器 任务系统
1629人阅读 评论(0) 收藏 举报
分类:

         之所以 想到先写这个“任务系统”是被面试到了!

        废话不多少,上传不要代码!


“任务”的五种状态

/**
 * 任务状态
 * @author kevin chen
 * @Description: TODO 
 * @date 2015年10月21日 下午8:20:39
 */
public class TaskState {
	/**0 不可接状态*/
	public static final int cannotAccept = 0;
	/**1 可接  但还未接的状态*/
	public static final int canAccept = 1;
	/**2 已接  正在进行中*/
	public static final int doTasking = 2;
	/**3 完成  未领奖*/
	public static final int completeTask = 3;
	/**4 完成  已领奖*/
	public static final int finishTask = 4;
	
}

“任务”对象的实体 

/**
 * 任务实体 需要持久化的
 * @author kevin chen
 * @Description: TODO 
 * @date 2015年10月21日 下午8:51:16
 */
public class Task {
	/**任务id*/
	private int taskId;
	/**任务状态*/
	private int taskState;
	/**任务进度*/
	private int progress;
	/**任务配置表*/
	private transient Tasktemplate tasktemplate;
	/**任务目标实体*/
	private transient ITarget target;
	
	
	public Task(int taskId, int taskState) {
		this.taskId = taskId;
		this.taskState = taskState;
		this.tasktemplate = DataManager.getSingleData(GameConfigTable.tasktemplate, this.taskId);
		this.target = TargetType.getITargetById(this.tasktemplate.getTargetType());
	}
	public Tasktemplate getTasktemplate() {
		return tasktemplate;
	}
	public int getTaskId() {
		return taskId;
	}
	public void setTaskId(int taskId) {
		this.taskId = taskId;
	}
	public int getTaskState() {
		return taskState;
	}
	public void setTaskState(int taskState) {
		this.taskState = taskState;
	}
	public int getProgress() {
		return progress;
	}
	public void setProgress(int progress) {
		this.progress = progress;
	}
	
	public int getTaskType(){
		return this.tasktemplate.getTaskType();
	}
	
	public ITarget getTarget() {
		return target;
	}
	
	/**下一个任务*/
	public int getNextTaskId(){
		return this.tasktemplate.getPostTaskId();
	}
}


着重看看任务实体是如何构造的!


public interface ITarget {
	/**任务进行中  检查是否完成*/
	boolean checkTaskComplete(Hero hero,Task task);

}

在任务配置表中 表示任务目的的参数 要与枚举的下标一致

public enum TargetType {
	/**0  none*/
	Null(null),
	/**1  打怪*/
	HitMonster(new HitMonsterTarget()),
	/**2 采集*/
	Collect(new CollectTarget()),
	/**3 收集*/
	Gather(new GatherTarget()),
	/**4 通关*/
	PassKa(new PassKaTarget()),
	/**5 对话*/
	DialogTarget(new DialogTarget()),
	/**6 送物品*/
	GiveItem(new GiveItemTarget()),
	/**7 护送*/
	Escort(new EscortTarget()),
	/**8 使用物品*/
	UseItem(new UseItemTarget()),
	/**9 特殊*/
	Special(new SpecialTarget()),
	;
		
	private ITarget target;
	
	private TargetType (ITarget target){
		this.target = target;
	}

	public ITarget getTarget() {
		return target;
	}

        /**获得任务目的的具体实体对象   在构造任务实体对象的时候调用*/
	public static ITarget getITargetById(int targetId){
		TargetType[] values = TargetType.values();
		TargetType targetType = values[targetId];
		return targetType.getTarget();
	}
}

public class Hero {
       /**
	 * 当前正在做的任务 (其中主线任务只有一条,支线任务,日常任务可以多条) 需持久化
	 */
	private List<Task>  doingTasks = new ArrayList<Task>();

	/**
	 * 所有要求记录已完成的任务  需持久化
	 */
	private List<Task> finishTasks = new ArrayList<Task>(); 
     
        public List<Task> getDoingTasks() {
               return doingTasks;
        }
 }




任务的业务逻辑处理 采用的静态方法

/**
 * 任务相关的逻辑处理
 * @author kevin chen
 * @Description: TODO 
 * @date 2015年10月22日 上午11:45:48
 */
public class TaskManager {
	/**
	 * 当前玩家是否满足任务的等级要求
	 * @param hero
	 * @param tasktemplate
	 * @return true:满足   false:不满足
	 */
	public static boolean isEnoughTaskLevel(Hero hero,Tasktemplate tasktemplate){
		return true;
	}
	/**
	 * 更新某个任务
	 * @param hero
	 * @param task
	 */
	public static void updateTaskMsg(Hero hero,Task task){
		
	}
	
	/**
	 * 任务进行中 判断任务是否完成!
	 * 该方法供相关任务所设计到的各个模块调用!
	 * @param hero
	 */
	public static void checkTask(Hero hero){
		List<Task> doingTasks = hero.getDoingTasks();
		for (Iterator<Task> iterator = doingTasks.iterator(); iterator.hasNext();) {
			Task task = iterator.next();
			ITarget target = task.getTarget();
			boolean complete = target.checkTaskComplete(hero, task);
			if(complete){
				updateTaskMsg(hero, task);
			}
		}
	}

}


小刚分享 望大家多多指点!


       

      

         

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2581次
    • 积分:83
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档