Java 人生游戏:如何拥有;“实体”;并行发展?

Java 人生游戏:如何拥有;“实体”;并行发展?,java,parallel-processing,cellular-automata,Java,Parallel Processing,Cellular Automata,好的,标题不清楚,我的意思是 我正在编写某种游戏(如生活游戏)。例如,有动物(每个动物都是一个类的Java实例) 所有这些动物都在地图上,所有这些“世界”“在每一个“回合”中都会进化 这些动物可以在每个回合中做出动作。 一只狼杀死了一只羊 但是,我对在状态之间进行这些进化的“方式”有困难,因为结果将取决于通过动物循环的顺序 例如: 先狼:狼杀死了羊(然后羊死了,所以没有行动) 先羊:羊吃了一些草,然后狼又杀了羊 我怎样才能解决这个问题 多线程?(但我会有很多动物,比如1000只甚至更多…)。

好的,标题不清楚,我的意思是

我正在编写某种游戏(如生活游戏)。例如,有动物(每个动物都是一个类的Java实例)

所有这些动物都在地图上,所有这些“世界”在每一个“回合”中都会进化

这些动物可以在每个回合中做出动作。 一只狼杀死了一只羊

但是,我对在状态之间进行这些进化的“方式”有困难,因为结果将取决于通过动物循环的顺序

例如:

  • 先狼:狼杀死了羊(然后羊死了,所以没有行动)
  • 先羊:羊吃了一些草,然后狼又杀了羊
我怎样才能解决这个问题

多线程?(但我会有很多动物,比如1000只甚至更多…)。有没有一种算法,一种“方法”来做到这一点


谢谢

您应该正确地模拟转弯,即让每只动物根据当前的世界状态进行转弯,以便将动作结果更新到世界的下一个状态,而不是当前状态。即

  • 在当前步骤中,羊吃了一些草,狼杀死了它
  • 在世界的下一个州,有一只知足的狼,没有羊(或者羊的尸体——取决于你的型号)

  • 这样,评估顺序不会影响结果,这就提供了并行执行的可能性,最好使用s和a。

    哦,如果你不想进入多线程,事情会变得更加混乱


    在这种情况下,遍历所有动物,让它们选择自己的动作。然后更新地图。

    如果您有一个可以接收和发出通知的中央管理器,您可以使用。每次转弯时,动物都会通知自己在哪里。经理通知谁在那里,他们根据上下文执行
    eat()
    方法。当他们吃完后,他们会通知经理,经理会告诉他们该做什么(例如,sheep.die())

    线程并发性不是这里的主要问题。我认为,正确的模式应该是允许每个实体在当前回合中决定行动。然后,为了在下一回合确定游戏状态,你应该处理动作,如果需要解决冲突。您应该决定解决两个不同玩家采取的各种“冲突”动作组合的规则。

    在我的脑海中,您可以这样做:

    拥有一个管理玩家对象列表的世界对象。玩家有以下方法:

    玩家
    • 公共空间转换(世界)
    • 公共布尔ISDED()
    • 公共空杀()
    当世界实例到达每个玩家时,它会询问它是否已死亡。如果不是,则调用takeTurn方法。或者,takeTurn可以在内部调用isDead(),如果是,则返回。如果你杀死了另一个玩家(或者你自己),你只需要调用玩家的kill方法

    将世界传递给takeTurn只是为了防止您需要回调以更新世界状态。

    一种方法是:

  • 让羊做他们的动作,并在下一步记录下来
  • 为sheeps操作更新板
  • 做每一个狼的动作,并在下一步记录下来
  • 为wolf操作更新板
  • 两种方法两个多线程这是:

    • 将电路板划分为不同的区域,并将每个线程分配给一个区域。您将无法确定如何将其从一个区域移动到另一个区域

    • 另一种方法是打破生物到不同线程的循环。乙二醇


      用于(w=THREAD_NUM;w听起来你希望世界每一次都像康威的生活一样以同样的方式进化。在生活中,你观察每个细胞,根据之前的状态计算它的结果。如果细胞有两个邻居,它将存活到下一代,不管这些邻居在下一代是否不在那里原始状态应该是只读的,无论发生什么,规则都应该有效

      例如,如果你有两只狼靠近一只羊,它们会都吃吗,还是只有一只?如果只有一只,那么你需要一条规则,一只狼可以吃羊,另一只狼需要知道这一点。你可以走相反的路,即看羊,找到一只会吃羊的动物。假设你只想要一只狼吃羊绵羊,你说具有最低“Y”坐标的狼得到羊,或者如果有两个具有相同“Y”坐标的狼,那么具有最低“X”坐标的狼得到羊。如果你处理一只狼,你需要确保没有其他狼会先吃掉羊。这可能会让人更困惑,因为可能会有另一只羊靠近它会吃,所以它不会吃第一个

      最简单的方法是说,所有动物都可以做自己的行为,无论它们在下一轮进化中发生了什么,或者其他动物做了什么。如果一只羊被三只狼包围,那么它在下一轮就会死亡,所有的狼都会分享这顿饭。如果一只羊旁边有草,那么即使在下一轮进化中,羊也会吃掉它羊被狼包围着。对于狼来说,那一轮他们都会被喂养,因为他们挨着一只羊

      public class Cell {
          public int CellType = 0; // 0 == empty, 1 == grass, 2 == sheep, 3 == wolf
          public int Feedings = 0;
      }
      
      public class World {
      public Cell [] Cells = new Cell[100];
      public int Rows = 10, Cols = 10;
      
      public Cell GetCell(x, y) {
          if (x < 0 || x >= Cols || y < 0 || y >= Rows) return null;
          if (Cells[y * Cols + x] == null) {
              Cells[y * Cols + x] = new Cell();
          }
          return Cells[y * Cols + x];
      }
      
      public World Evolve() {
          World w = new World();
          for (int y = 0; y < Rows; y++) {
              for (int x = 0; x < Cols; x++) {
                  HandleCell(w, x, y);
              }
          }
          return w;
      }
      
      public void HandleCell(World newWorld, int x, int y) {
          Cell result = newWorld.GetCell(x, y);
      
          Cell c = GetCell(x, y);
          if (c.CellType == 2) { // sheep
              bool foundWolf = false;
              bool foundGrass = false;
      
              // code here to find if a wolf or grass are around the sheep
      
              if (foundWolf) {
                  // default cell type is empty, so leave it be (wolf ate me)
              } else {
                  result.cellType = 2; // still a sheep here
                  if (foundGrass) {
                      result.Feedings = c.Feedings + 1; // and he ate!
                  } else {
                      result.Feedings = c.Feedings; // or not...
                  }
              }
          }
      
          if (c.CellType == 3) { // wolf
              bool foundSheep = false;
      
              // code here to find if a sheep is around the wolf
      
              result.CellType = 3;
              if (foundSheep) {
                  result.Feedings = c.Feedings + 1; // ate the sheep!
              } else {
                  result.Feedings = c.Feedings;
              }
          }
      }
      
      公共类单元格{
      public int CellType=0;//0==空,1==草,2==羊,3==狼
      公共int馈线=0;
      }
      公共阶级世界{
      公共单元[]单元=新单元[100];
      公共int行=10,Cols=10;
      公共单元格GetCell(x,y){
      如果(x<0 | | x>=Cols | | y<0 | | y>=Rows)返回null;
      if(单元格[y*