Java 生活问题的游戏
我不确定我的方法是否正确,我已经创建了适用于所有“静物”单元安排的代码,即蜂箱、积木、船和面包。然而,对于那些被认为是被操纵的,涉及细胞死亡和出生的安排,我有问题 现在我首先创建单元,然后杀死任何符合规则的单元(如果周围的邻居总数小于或等于1,等于或大于4) 我现在要做的,不符合我的要求。我将在代码下面包含一些图像:Java 生活问题的游戏,java,Java,我不确定我的方法是否正确,我已经创建了适用于所有“静物”单元安排的代码,即蜂箱、积木、船和面包。然而,对于那些被认为是被操纵的,涉及细胞死亡和出生的安排,我有问题 现在我首先创建单元,然后杀死任何符合规则的单元(如果周围的邻居总数小于或等于1,等于或大于4) 我现在要做的,不符合我的要求。我将在代码下面包含一些图像: public class Untitled { public static void main(String[] params){ Life life =
public class Untitled {
public static void main(String[] params){
Life life = new Life();
String[][] list = life.readGame();
life.print(list);
System.out.println();
for(int i = 1; i <= 5; i++){
list = life.run(list);
life.print(list);
System.out.println();
}
}
}
class Life {
public String[][] readGame(){
String[][] array = {
{ "-","-", "-", "-", "-", "-","-"},
{ "-","-", "-", "-", "-", "-","-"},
{ "-","-", "-", "x", "-", "-","-"},
{ "-","-", "-", "x", "-", "-","-"},
{ "-","-", "-", "x", "-", "-","-"},
{ "-","-", "-", "-", "-", "-","-"},
{ "-","-", "-", "-", "-", "-","-"}
};
return array;
}
public void print(String[][] array){
for(int x = 0; x < array.length; x++){
for(int y = 0; y < array[x].length; y++){
System.out.print(array[x][y]);
}
System.out.println();
}
}
public String[][] run(String[][] array){
populateCells(array);
System.out.println("Populated:\n");
print(array);
killCells(array);
System.out.println("Killed:\n");
print(array);
return array;
}
public int amountOfNeighbors(String[][] array, int x, int y){
int amount = 0;
for(int x1 = -1; x1 <= 1; x1++){
if(x + x1 >= 0 && x + x1 < array.length){
for(int y1 = -1; y1 <= 1; y1++){
if(y + y1 >= 0 && y + y1 < array[x1 + x].length){
if(!(x1 == 0 && y1 == 0) && !array[x1 + x][y1 + y].equals("-")){
amount++;
}
}
}
}
}
return amount;
}
public void populateCells(String[][] array){
int neighbours;
for(int x = 0; x < array.length; x++){
for(int y = 0; y < array[x].length; y++){
neighbours = amountOfNeighbors(array,x,y);
if(neighbours == 3){
array[x][y] = "x";
}
}
}
}
public void killCells(String[][] array){
int neighbours;
for(int x = 0; x < array.length; x++){
for(int y = 0; y < array[x].length; y++){
neighbours = amountOfNeighbors(array,x,y);
if(neighbours <= 1 || neighbours >= 4){
array[x][y] = "-";
}
}
}
}
}
公共类无标题{
公共静态void main(字符串[]参数){
生活=新生活;
String[][]list=life.readGame();
生活。打印(列表);
System.out.println();
对于(int i=1;i每次调用run()
时,您需要创建原始电路板的副本,并在修改原始电路板中的单元时使用该副本检查每个单元的状态
否则,每次更新单元时,都会无意中更改其周围单元的状态
这是模拟中一个相当常见的错误,它涉及到游戏板,如《生活游戏》——因此现在您知道要小心了:)每次调用run()
时,您需要创建原始板的副本,并在修改原始板中的单元格时使用该副本检查每个单元格的状态
否则,每次更新单元时,都会无意中更改其周围单元的状态
这是模拟中一个相当常见的错误,涉及到游戏板,如《生活游戏》——所以现在你知道要小心了:)或者在模拟板上有第3和第4个状态指示应该删除或添加。^这也会起作用,基本上相当于(+1)。我仍然鼓励复制而不是拥有多个状态,因为这样您就可以使用内置的数组复制功能,而不必编写自定义状态交换代码。@user1327636当然-我的意思是,您不需要在要修改的板上调用amountofneighbor,而是在创建的副本上调用它。这是否会使more sense?@user1327636没问题!第一部分是正确的-您在run()中创建了一个副本。然后,您需要传入两个数组来填充和杀死函数:array
,您已经传入了,和array\u copy
。然后在“填充和杀死”中,调用array\u copy
上的amountOfNeighbors,而不是array
@user1327636。我在这里修改了代码(仅针对killCells进行了修复-不填充):。请注意,您必须自己实现deep_copy,或者确定要使用哪个Java函数。或者在电路板上显示第3和第4状态,以指示应删除或添加。^这也可以工作,基本上是等效的(+1)。我仍然鼓励复制而不是拥有多个状态,因为这样您就可以使用内置的数组复制功能,而不必编写自定义状态交换代码。@user1327636当然-我的意思是,您不需要在要修改的板上调用amountofneighbor,而是在创建的副本上调用它。这是否会使more sense?@user1327636没问题!第一部分是正确的-您在run()中创建了一个副本。然后,您需要传入两个数组来填充和杀死函数:array
,您已经传入了,和array\u copy
。然后在“填充和杀死”中,调用array\u copy
上的amountOfNeighbors,而不是array
@user1327636。我在这里修改了代码(仅针对killCells进行了修复-不填充):。请注意,您必须自己实现deep_copy,或者确定要使用哪个Java函数。的可能重复