呵呵,类似一个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){
......
}
...
}
主循环接受玩家发来的消息,解释成一个一个的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来做这个事情。