私はJavaのConways Game of Lifeで作業していますが、少し問題があります。コンウェイゲーム・オブ・ライフ - 第1回目の突然変異後にグライダー・パターンが機能しない?
私のテストケースはグライダーパターンですが、プログラムを実行しようとすると、グライダーは第2世代で初めて正しく突然変異します。最初の突然変異の後のそれぞれの世代は間違っており、私は理由を理解することができません。 (私の方法の大部分が存在する)
Glider Should Mutate like this
This is what I get from running the code, the Glider shouldn't be stuck with a repeating pattern.
World.class
public class World extends Patterns
{
private char [][] world;
private char [][] tempWorld;
private int numRows;
private int numCols;
//World Constructor
public World (int r, int c)
{
this.numRows = r;
this.numCols = c;
world = new char [r][c];
tempWorld = new char [r][c];
initalizeWorld();
}
//Initializes the world and fills array with blank spaces
private void initalizeWorld()
{
// Initialize all indexes to ' '
for(int i = 0; i < numRows; i++)
{
for(int j = 0; j < numCols; j++)
{
world[i][j] = ' ';
}
}
}
//Creates and stores data in a temp world for the next Generation
public void nextGen()
{
for(int i = 0; i < numRows; i++)
{
for(int j = 0; j < numCols; j++)
{
changeCell(i,j);
}
}
world = tempWorld;
}
//Prints world with *'s as Cells and O's as dead cells
public void printWorld()
{
// Print every value inside array
for(int i = 0; i < numRows; i++)
{
for(int j = 0; j < numCols; j++)
{
if(world[i][j] == '*')
System.out.print(" ");
System.out.print(world[i][j]);
if(world[i][j] != '*')
{
System.out.print("O");
}
}
System.out.println(" ");
}
}
//Method check's for neighbors of a cell
public int getNeighbors(int x, int y)
{
int numNeighbors = 0;
for(int i = x - 1; i <= x + 1; i++)
{
for(int j = y - 1; j <= y + 1; j++)
{
if((i >= 0) && (i < numRows) && (j < numCols) && (j >= 0))
{
if (world[i][j] == '*')
{
numNeighbors++;
}
}
}
}
//don't count the cell itself
return numNeighbors-1;
}
//Method uses getNeighbors to check whole array for every cells # of Neighbors
public void checkAllNeighbors()
{
for(int i = 0; i < numRows; i++)
{
for(int j = 0;j < numCols; j++)
{
//if(world[i][j] == '*')
{
int neighbors = getNeighbors(i, j);
System.out.println("The cell at (" + i + ", " + j + ") has " + neighbors + " neighbors");
}
}
}
}
//Method changes cell based on Neighbor Counts
public void changeCell (int r, int c)
{
int count = getNeighbors(r,c);
if (count == 3)
{
tempWorld [r][c] = '*';
}
else if (count >= 2 && count <= 3)
{
tempWorld [r][c] = '*';
}
else
{
tempWorld [r][c] = ' ';
}
}
//Gets world
public char [][] getWorld()
{
return world;
}
public void putGlider(int r, int c)
{
char pattern[][] = getGlider();
for (int i = 0; i < pattern.length; i++)
{
for (int j = 0; j < pattern[0].length; j++)
{
if ((i + r < numRows) && (j + c < numCols))
{
world[i + r][j + c] = pattern[i][j];
}
}
}
}
}
Patterns.class(現在グライダーパターンを保持し、より多くの後に収容する)
public class Patterns
{
private char[][] gliderArray = {{' ','*',' '},
{' ',' ','*'},
{'*','*','*'}};
//private char [][]
public char[][] getGlider()
{
return gliderArray;
}
}
test.class(Wここで私の方法をテストしています)
import java.util.Scanner;
public class test
{
public static void main(String[] args)
{
World test = new World (5,5);
test.getWorld();
test.putGlider(0,0);
test.printWorld();
System.out.println("Press enter to start generations!");
new Scanner(System.in).nextLine();
for(int i=0; i<10; i++)
{
test.nextGen();
System.out.println(" ");
test.printWorld();
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
私はこのプロジェクトをしばらくは続けてきましたが、私は本当にこの時点で固執しています。私は何が間違っていて、どうやって修正するのか分からず、ちょっと怒っています。どんな助けでも大歓迎です!
ありがとうございました!
Sci Progの提案に基づく新しいnextGenメソッドは、ループ内のループを正しく実装しているかどうかはわかりません。
public void nextGen()
{
for(int i = 0; i < numRows; i++)
{
for(int j = 0; j < numCols; j++)
{
changeCell(i,j);
}
}
for (int r=0; r < this.numRows; r++)
for (int c=0; c < this.numCols; C++)
world[r][c] = tempWorld[r][c];
}
私のchangeCellメソッドも変更されましたが、新しい出力はこれまでのものより大きくなりました。あなたはそれをsubstracting、セル自体を含むすべてのネイバーを数えているgetNeighbours
方法で
第1位の後に各突然変異が「間違っている」と言うと、それが正確ではないという理由で詳しく説明できますか? –
'getNeighbors'メソッドで'(i
bezmax
"Even Bechtol"へ私は、突然変異が間違っていることについて、私が何を意味するかについて、いくつかの写真を上に追加しました。 – TheDingo