我正试图在java中实现生命游戏,作为学习这门语言的练习。
不幸的是我遇到了问题,因为我似乎无法使这个程序正常运行。
我实施了一个torodial总和(飞机是甜甜圈)没有问题:
int SumNeighbours (int i, int j) {
int value = 0;
value = world[( i - 1 + row ) % row][( j - 1 + column ) % column]+world[( i - 1 + row ) % row][j]+world[( i - 1 + row ) % row][( j + 1 ) % column];
value = value + world[i][( j - 1 + column ) % column] + world[i][( j + 1 ) % column];
value = value + world[( i + 1 ) % row][( j - 1 + column ) % column] + world[( i + 1 ) % row][j]+world[ ( i+1 ) % row ][( j + 1 ) % column];
return value;
}
当我测试它时它总和正确:
void NextWorldTest () {
int count;
int [][] nextWorld = new int[row][row];
nextWorld = world;
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
count = SumNeighbours(i,j);
System.out.print(" " + count + " ");
}
System.out.println();
}
world=nextWorld;
}
不幸的是,当我添加生命游戏(出生/死亡)的条件时,程序停止正常工作,因为它似乎无法再正确计算附近的活细胞。它计算在没有的地方,并且当有一些时它不计算。例如:它不计算一些活细胞下方的那个。
这是一种非常奇怪的行为,现在让我头疼了3天......也许我错过了一些关于变量的基本知识?
在这里你可以找到课程。
void NextWorld () {
int count;
int [][] nextWorld = new int[row][column];
nextWorld = world;
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
count = SumNeighbours(i,j);
System.out.print(" " + count + " ");
if ( ( world[i][j] == 0) && ( count == 3 ) ) {
nextWorld[i][j] = 1;
} else if ( ( world[i][j] == 1 ) && ( (count == 3) || (count == 2) )) {
nextWorld[i][j] = 1;
} else {
nextWorld[i][j]=0;
}
}
System.out.println();
}
world=nextWorld;
}
}
我做错了吗?
您可以在下面找到完整的包裹。
package com.GaOL;
public class GameWorld {
int [][] world;
int row;
int column;
public int GetRow() {
return row;
}
public int GetColumn() {
return column;
}
public int GetWorld (int i, int j) {
return world[i][j];
}
void RandomGen (int size, double p1) {
double randomCell;
row = size;
column = size;
world = new int[row][column];
for (int i = 0; i<row; i++ ) {
for (int j = 0; j<column; j++ ) {
randomCell=Math.random();
if (randomCell < 1-p1) {
world[i][j] = 0;
} else {
world[i][j] = 1;
}
}
}
}
void printToConsole() {
double test = 0;
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
if ( world[i][j] == 0 ) {
System.out.print(" ");
} else {
System.out.print(" * ");
test++;
}
}
System.out.println("");
}
System.out.println("ratio is " + test/(row*column));
}
int SumNeighbours (int i, int j) {
int value = 0;
value = world[( i - 1 + row ) % row][( j - 1 + column ) % column]+world[( i - 1 + row ) % row][j]+world[( i - 1 + row ) % row][( j + 1 ) % column];
value = value + world[i][( j - 1 + column ) % column] + world[i][( j + 1 ) % column];
value = value + world[( i + 1 ) % row][( j - 1 + column ) % column] + world[( i + 1 ) % row][j]+world[ ( i+1 ) % row ][( j + 1 ) % column];
return value;
}
void NextWorldTest () {
int count;
int [][] nextWorld = new int[row][row];
nextWorld = world;
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
count = SumNeighbours(i,j);
System.out.print(" " + count + " ");
}
System.out.println();
}
world=nextWorld;
}
void NextWorld () {
int count;
int [][] nextWorld = new int[row][column];
nextWorld = world;
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
count = SumNeighbours(i,j);
System.out.print(" " + count + " ");
if ( ( world[i][j] == 0) && ( count == 3 ) ) {
nextWorld[i][j] = 1;
} else if ( ( world[i][j] == 1 ) && ( (count == 3) || (count == 2) )) {
nextWorld[i][j] = 1;
} else {
nextWorld[i][j]=0;
}
}
System.out.println();
}
world=nextWorld;
}
}
这里是测试类:
package com.GaOL;
public class GameTestClass {
public static void main(String[] args) {
GameWorld prova = new GameWorld();
prova.RandomGen(10, 0.02);
for (int i=0; i<3; i++) {
prova.printToConsole();
prova.NextWorld();
}
}
}
答案 0 :(得分:2)
我认为,问题在于数组分配。你在这做什么?
int [][] nextWorld = new int[row][row];
nextWorld = world;
您应该创建新数组[row][column]
,然后根据来自世界的数据填充它。
还有更多
anArray.length
和anArray[0].length
那样做,所以你不需要行和列变量sumNeighbours()
而不是SumNeighbours()
更新:第二个建议中有拼写错误:已修复