建模异步游戏环境

时间:2011-09-29 21:34:10

标签: java architecture osgi

我们的想法是为代理商建立一个环境模型。在最基本的情况下,它看起来像这样:

  1. 系统要求代理进行下一步操作
  2. 代理人回应(例如“向左移动!”)
  3. 系统将代理移动到适当的状态
  4. 但是,我在异步方式(使用线程等)实现它时遇到了麻烦。

    目前我的系统如下:

    void Start(){
       while(true && !gameOver){
           askAgent()
           moveAgent()
    
           if(agentState == terminalState){ 
              gameOver = True;
           }
    
       }
     }
    

    显然,这会阻止正在运行的线程。 (更令人尴尬的是我使用OSGi,所以任何一个捆绑都不应该占用所有的处理时间!)

    另外,我希望系统能够对出现在环境中的新代理做出反应,并与它们进行交互(我的运行时,OSGi,已经具有通知我,如果某些内容出现或从系统中消失的话),例如:< / p>

    void setAgent(Agent agent){
           system.addAgentToEnvironment(agent);
           system.simulateAgent(agent);
    }
    

    而不是直接从主要跑道......

    我知道这非常令人困惑,而且我不确定我是否正确地提出了这个问题 - 所以我对建筑或方法的任何提示都非常感激。

2 个答案:

答案 0 :(得分:2)

您肯定需要一些数据保护(可能在主代理列表上,以及对每个代理及其数据的某种保护)。

除此之外,我会遵循这种模式:

while (waiting for events)
  spawn thread to respond to event // add agent, calculate and perform move, etc.
  // even better would be to enqueue the event into a thread pool

  if (terminal)
    break // end game

HTH

答案 1 :(得分:0)

为了帮助考虑应用程序的未来,我建议您使用两个循环。

long then = System.currentTimeMillis();
for(Agent a : agents) {
    agent.calcuateNextMove(getEnvironment());
}

for(Agent a : agents) {
    agent.performNextMove(getEnvironment());
}
long now = System.currentTimeMillis();
sleep(TIME_STEP_DURATION + now - then); // give you a steady frame rate in relation to real time

这段代码为您提供了两件事。

  1. 在同一步骤中独立于其他移动进行移动。这样你就不会受到那些碰巧在你面前移动的人的影响。
  2. 代理商只是存在,并且只是根据您给出的环境被告知计算他的下一步行动。这使得更改状态,将代理复制到多个环境以及给出环境与实际环境不同的错觉非常容易。例如,您可能有filterFor(Environment e, Agent a)为该特定代理程序创建环境的模拟版本。喜欢戴着醉酒护目镜或眼罩或其他东西。