Java 中的元胞自动机
Cell automat in Java
我正在尝试在 Java 中创建一个类似康威生命游戏的模型,但要适应某些特定条件和细胞行为。我没有足够的编程经验,所以如果你能给我一些答案,我将不胜感激。
到目前为止我有这个代码:
package project_cells;
import java.util.Random;
public class Field {
public static void main(String[] args) {
int size = 4;
char[][] field = new char[size][size]; // field
char[] cell_type = {'A','B','a','b'}; // fill out vector with cell type
for(int i = 0; i <size; i++ ) { // checking the matrix positions
for (int j = 0; j <size; j++) {
Random rand = new Random();
int celltype_option = rand.nextInt((3-0)+1)+0; // creating a random number from 0 to 3
field[i][j]=cell_type[celltype_option]; // Filling the field with cell types
}
}
System.out.println("Клетки первого поколения"); // checking the first generation of cells
for (int x=0; x < field.length; x++) {
System.out.print("|");
for (int y=0; y < field[x].length; y++) {
System.out.print (field[x][y]);
if (y!=field[x].length-1) System.out.print("\t");
}
System.out.println("|");
}
}
}
通过这段代码,我只获得了具有 4 种类型单元格 (A、B、a、b) 的数组,A 和 B 改变了它的行为,a 和 b 没有改变。
问题是我需要创建 3 种方法来验证邻居: 1. 当单元仅验证 4 个邻居(上、右、左、下)时。 2.当小区验证8个周围的邻居和3.当小区验证任何随机邻居时。
我怎样才能得到这样的验证?
x
的左右邻居是x-1
和x+1
。它们仅在 >= 0
和 <= size - 1
:
时存在
for (int i = -1; i <= 1; i+= 2) { // i = -1, +1
final int neighborIndex = x + i;
if (neighborIndex >= 0 && neighborIndex < size) {
// ...
}
}
up/down的情况可以类推。
要获得所有八个邻居,从 x-1
迭代到 x+1
并在其内部从 y-1
迭代到 y+1
(同样,仅当 >=0
和 < size
) 并过滤掉中心 (x, y)
:
for (int xNeighbor = Math.max(0, x - 1); xNeighbor <= Math.min(size - 1, x + 1); xNeighbor += 1) {
for (int yNeighbor = Math.max(0, y - 1); yNeighbor <= Math.min(size - 1, y + 1); yNeighbor += 1) {
if (!(xNeighbor == x && yNeighbor == y)) {
// ...
}
}
}
要获得随机邻居,首先计算邻居的数量,然后使用 rand.nextInt(numNeighbors)
到 select 一个。
我正在尝试在 Java 中创建一个类似康威生命游戏的模型,但要适应某些特定条件和细胞行为。我没有足够的编程经验,所以如果你能给我一些答案,我将不胜感激。
到目前为止我有这个代码:
package project_cells;
import java.util.Random;
public class Field {
public static void main(String[] args) {
int size = 4;
char[][] field = new char[size][size]; // field
char[] cell_type = {'A','B','a','b'}; // fill out vector with cell type
for(int i = 0; i <size; i++ ) { // checking the matrix positions
for (int j = 0; j <size; j++) {
Random rand = new Random();
int celltype_option = rand.nextInt((3-0)+1)+0; // creating a random number from 0 to 3
field[i][j]=cell_type[celltype_option]; // Filling the field with cell types
}
}
System.out.println("Клетки первого поколения"); // checking the first generation of cells
for (int x=0; x < field.length; x++) {
System.out.print("|");
for (int y=0; y < field[x].length; y++) {
System.out.print (field[x][y]);
if (y!=field[x].length-1) System.out.print("\t");
}
System.out.println("|");
}
}
}
通过这段代码,我只获得了具有 4 种类型单元格 (A、B、a、b) 的数组,A 和 B 改变了它的行为,a 和 b 没有改变。
问题是我需要创建 3 种方法来验证邻居: 1. 当单元仅验证 4 个邻居(上、右、左、下)时。 2.当小区验证8个周围的邻居和3.当小区验证任何随机邻居时。
我怎样才能得到这样的验证?
x
的左右邻居是x-1
和x+1
。它们仅在 >= 0
和 <= size - 1
:
for (int i = -1; i <= 1; i+= 2) { // i = -1, +1
final int neighborIndex = x + i;
if (neighborIndex >= 0 && neighborIndex < size) {
// ...
}
}
up/down的情况可以类推。
要获得所有八个邻居,从 x-1
迭代到 x+1
并在其内部从 y-1
迭代到 y+1
(同样,仅当 >=0
和 < size
) 并过滤掉中心 (x, y)
:
for (int xNeighbor = Math.max(0, x - 1); xNeighbor <= Math.min(size - 1, x + 1); xNeighbor += 1) {
for (int yNeighbor = Math.max(0, y - 1); yNeighbor <= Math.min(size - 1, y + 1); yNeighbor += 1) {
if (!(xNeighbor == x && yNeighbor == y)) {
// ...
}
}
}
要获得随机邻居,首先计算邻居的数量,然后使用 rand.nextInt(numNeighbors)
到 select 一个。