Java 人生游戏:如何拥有;“实体”;并行发展?
好的,标题不清楚,我的意思是 我正在编写某种游戏(如生活游戏)。例如,有动物(每个动物都是一个类的Java实例) 所有这些动物都在地图上,所有这些“世界”“在每一个“回合”中都会进化 这些动物可以在每个回合中做出动作。 一只狼杀死了一只羊 但是,我对在状态之间进行这些进化的“方式”有困难,因为结果将取决于通过动物循环的顺序 例如:Java 人生游戏:如何拥有;“实体”;并行发展?,java,parallel-processing,cellular-automata,Java,Parallel Processing,Cellular Automata,好的,标题不清楚,我的意思是 我正在编写某种游戏(如生活游戏)。例如,有动物(每个动物都是一个类的Java实例) 所有这些动物都在地图上,所有这些“世界”“在每一个“回合”中都会进化 这些动物可以在每个回合中做出动作。 一只狼杀死了一只羊 但是,我对在状态之间进行这些进化的“方式”有困难,因为结果将取决于通过动物循环的顺序 例如: 先狼:狼杀死了羊(然后羊死了,所以没有行动) 先羊:羊吃了一些草,然后狼又杀了羊 我怎样才能解决这个问题 多线程?(但我会有很多动物,比如1000只甚至更多…)。
- 先狼:狼杀死了羊(然后羊死了,所以没有行动)
- 先羊
谢谢您应该正确地模拟转弯,即让每只动物根据当前的世界状态进行转弯,以便将动作结果更新到世界的下一个状态,而不是当前状态。即
这样,评估顺序不会影响结果,这就提供了并行执行的可能性,最好使用s和a。哦,如果你不想进入多线程,事情会变得更加混乱
在这种情况下,遍历所有动物,让它们选择自己的动作。然后更新地图。如果您有一个可以接收和发出通知的中央管理器,您可以使用。每次转弯时,动物都会通知自己在哪里。经理通知谁在那里,他们根据上下文执行
eat()
方法。当他们吃完后,他们会通知经理,经理会告诉他们该做什么(例如,sheep.die())线程并发性不是这里的主要问题。我认为,正确的模式应该是允许每个实体在当前回合中决定行动。然后,为了在下一回合确定游戏状态,你应该处理动作,如果需要解决冲突。您应该决定解决两个不同玩家采取的各种“冲突”动作组合的规则。在我的脑海中,您可以这样做:
拥有一个管理玩家对象列表的世界对象。玩家有以下方法:
玩家
- 公共空间转换(世界)
- 公共布尔ISDED()
- 公共空杀()
- 将电路板划分为不同的区域,并将每个线程分配给一个区域。您将无法确定如何将其从一个区域移动到另一个区域
- 另一种方法是打破生物到不同线程的循环。乙二醇
用于(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*