请教一下,该如何重构或设计才好??

04-02-06 zard222
我自己在做一个网络文字游戏的东西,其中遇到这样一个问题,该如何重构或设计??请教各位高手:

首先,客户端发送一个command,服务器端由cammand模式调用服务器端的player类的行为函数,比如:a.talkto(),在talkto()函数中查找到你要交谈的对象是b,那么调用b.talkedBy(this);,然后在talkedBy()中查找a和b之间可以通过交谈激活的任务(task),然后调用task.talk(a);在task.talk()中查找到当前用户要完成的事件(一个任务由多个事件组成),调用event.talk(a),在event.talk()中判断用户有没有达到完成的要求,然后返回true或false;

我觉得这样一个调一个很是不好,并且再添加一个giveto()行为又要添加一串,应该怎么重构或设计才好???

    

jrog
2004-02-06 14:37
你可不可以贴一个sequence diagram或者是collaboration diagram出来呀?这样绕来绕去都不明白你想实现什么!呵呵

ajoo
2004-02-06 16:21
呵呵,类似一个mud游戏是吗?

这样:

interface Object{
  void accept(ObjectVisitor v);
}
interface Player extends Object{......}
interface ObjectVisitor{
  void visitPlayer(Player p);
  void visitNPC(NPC npc);
  ......
}
interface Action{
  void accept(ActionVisitor v);
}
interface ActionVisitor{
  void visitTalk(Player p, Object target);
  void visitGive(Player p, Object target);
  ......//all other actions
}
class GameEngine implements ActionVisitor, GameState{
  public void visitTalk(Player p, Object target){
    try{
      final Task t = findTaskForTalk(p, target);
      for(Event event: t.getEvents()){
        if(!event.complete(this, p)){
          failEvent(p, event);
        }
      }
      succeedTask(p, t);
    }
    catch(NoTaskException e){}
  }
  public void visitGive(Player p, Object target){
    ......
  }
  ...
}
<p>

主循环接受玩家发来的消息,解释成一个一个的Action,然后发给GameEngine对象。(很可能是通过一个单独的线程来做。你可能要考虑用线程池哦,至少要先预留一个接口)

GameEngine对象包含所有的游戏逻辑。每一个动作所引发的相关动作和游戏状态变化都被封装在里面。它可以通过一个player的id找到player的socket从而给客户发送相关的信息。

另外,GameEngine也负责储存游戏状态,比如通过一些check point来储存。

GameEngine也必须是线程安全的。

所有的玩家所能发出的动作都由一个Action来代表。GameEngine通过ActionVisitor来区分不同的action。

游戏中所有的实体,包括物品,npc,wizard, player,都是一个Object。(这个Object不是java.lang.Object)

每个Player对象包含这个player的id等信息。GameEngine可以通过这个id找到所有关于这个player的状态。

每个event都设有一定的完成条件。event通过判断GameState的状态和Player的状态来决定是否符合条件。

这样,应该就差不多了。give和talk不过是两种不同的action。理论上,系统里可以存在任意多的action。

这里面,麻烦的,应该就是各个event的规则编写。简单的就是硬编码。如果要搞得好一些,只怕就要实现一个script来做这个事情。

zard222
2004-02-06 16:58
多谢ajoo,我就是做一个mud游戏,游戏中所有的东西,包括任务事件,npc,地图,所有一切元素都是通过数据库定义的,npc,goods, player,map,都有一个package,走题了。。。,我的系统中用户的action是由command模式解析,顺序图:

ajoo
2004-02-07 00:30
Command最好不要直接调用Player.talkTo(NPC).

我之所以推荐visitor,是因为在visitor里面,你的Action什么也不干,只是负责描述这个action。比如:“ajoo跟椅子说'对不起'”, 或者“ajoo高举烤鸡腿对着鸡屁股当头砸了下来”之类的。

至于如何解释执行这些action,应该交给一个单独的visitor模块。

这样,给出不同的visitor模块,你可以实现完全不同的逻辑。

而且,talk就只能talk to NPC吗?不能talk to Player?

其它的先不说了,不是很清楚你的系统的需求,所以也不好说。

猜你喜欢
4Go 1 2 3 4 下一页