单元格模型输出未显示
Cell model output not showing up
所以我正在 Java 中研究一个极其基本的、面向对象的细胞生长模型。下面是我的 Cell class,它编译得很好,没有错误。
package cancerModel;
public class Cell {
public int x; //x position of cell
public int y; //y position of cell
public char type; //type of cell
public Cell(int x, int y, char type)
{
this.x = x;
this.y = y;
this.type = type;
}
public void addCellToGrid(char[][] grid, int x, int y, char type)
{
grid[x][y] = type;
}
public boolean checkAnySpace4(char[][] grid, int x, int y)
{
if(grid[x-1][y] == 'N' || grid[x-1][y] == 'M'|| grid[x-1][y] == 'C')
{
return false;
}
if(grid[x-1][y-1] == 'N' || grid[x-1][y-1] == 'M'|| grid[x][y-1] == 'C')
{
return false;
}
if(grid[x][y-1] == 'N' || grid[x][y-1] == 'M'|| grid[x][y-1] == 'C')
{
return false;
}
if(grid[x+1][y] == 'N' || grid[x+1][y] == 'M'|| grid[x+1][y] == 'C')
{
return false;
}
else
return true;
}
public boolean checkAnySpace8(char[][] grid, int x, int y)
{
if(grid[x-1][y] == 'N' || grid[x-1][y] == 'M'|| grid[x-1][y] == 'C')
{
return false;
}
if(grid[x-1][y-1] == 'N' || grid[x-1][y-1] == 'M'|| grid[x-1][y-1] == 'C')
{
return false;
}
if(grid[x][y-1] == 'N' || grid[x][y-1] == 'M'|| grid[x][y-1] == 'C')
{
return false;
}
if(grid[x+1][y] == 'N' || grid[x+1][y] == 'M'|| grid[x+1][y] == 'C')
{
return false;
}
if(grid[x][y+1] == 'N' || grid[x][y+1] == 'M'|| grid[x][y+1] == 'C')
{
return false;
}
if(grid[x+1][y+1] == 'N' || grid[x+1][y+1] == 'M'|| grid[x+1][y+1] == 'C')
{
return false;
}
if(grid[x+1][y-1] == 'N' || grid[x+1][y-1] == 'M'|| grid[x+1][y-1] == 'C')
{
return false;
}
if(grid[x-1][y+1] == 'N' || grid[x-1][y+1] == 'M'|| grid[x-1][y+1] == 'C')
{
return false;
}
else
return true;
}
public void divide(char[][] grid, char type, int x, int y)
{
if(type == 'N')
{
grid[x-1][y] = 'N';
grid[x][y-1] = 'N';
grid[x-1][y-1] = 'N';
grid[x+1][y] = 'N';
}
if (type == 'M')
{
grid[x-1][y] = 'M';
grid[x][y-1] = 'M';
grid[x-1][y-1] = 'M';
grid[x+1][y] = 'M';
}
if(type =='C')
{
grid[x-1][y] = 'C';
grid[x][y-1] = 'C';
grid[x-1][y-1] = 'C';
grid[x+1][y] = 'C';
grid[x][y+1] = 'C';
grid[x+1][y+1] = 'C';
grid[x+1][y-1] = 'C';
grid[x-1][y+1] = 'C';
}
}
public void die(char[][] grid, int x, int y)
{
grid[x][y] = ' ';
}
public void mutate(char[][] grid,char type, int x, int y)
{
if(type == 'N')
{
grid[x][y] = 'M';
}
else if (type == 'M')
{
grid[x][y] = 'C';
}
}
}
接下来,我有另一个名为 Setup 的 class,用于初始化模型。 start() 函数旨在保存模型进展的逻辑,但尚未完全实现。在这一点上,我只是想确保我能够查看网格,所以我制作了 10 个单元格并将它们放置在网格中的随机点。
package cancerModel;
public class Setup {
public double m = .05; //mutation rate
public double e = .6 ; //survival rate (1 - e = death rate)
public double p_c = .7; //growth rate for cancerous cells
public double p_n = .8; //growth rate for normal/mutated cells
public void printGrid(char[][] grid)
{
for(int i = 0; i < 50; i++)
{
for(int j = 0; j < 50; j++)
{
System.out.println(grid[i][j]);
}
}
}
public void start(int steps)
{
char[][] grid = new char[50][50];
int random = (int)(Math.random() * 50 + 1);
int random2 = (int)(Math.random() * 50 + 1);
for(int i = 1; i < steps; i++)
{
Cell cell = new Cell(random,random2,'N');
cell.addCellToGrid(grid, random, random2, cell.type);
}
printGrid(grid);
}
public static void main(String[] args)
{
Setup e = new Setup();
e.start(10);
}
}
当我 运行 这样做时,我没有得到任何字符输出。我的假设是它只是打印一个空的 50x50 数组。我不确定我在这里做错了什么。我创建单元格并将它们添加到网格的方式有问题吗,或者我打印网格的方式有问题吗?我将不胜感激任何帮助。
根据我对你的问题和疑问的理解,你需要进行以下修改以填充 50 x 50 数组:
- 将 random 和 random2 语句移动到 for 循环中
- 将随机数从
50 + 1
更改为 49 + 1
或者将数组的大小更改为 51 x 51
问题 1,您必须在 for 循环内移动随机语句的原因是允许为您声明的 10 个单元格生成随机位置。在 for 循环之外意味着,您覆盖了前一个单元格,结果您的 2D 数组将只有一个元素,因为您一直在网格的相同位置添加单元格。
//move the random and random1 inside for loop for random cell positions
for (int i = 1; i < steps; i++) {
int random = (int) (Math.random() * 49 + 1);
int random2 = (int) (Math.random() * 49 + 1);
Cell cell = new Cell(random, random2, 'N');
cell.addCellToGrid(grid, random, random2, cell.type);
}
问题 2 导致漏洞的编号为 50,如果您尝试使用该编号访问网格数组,您一定会得到 ArrayIndexOutOfBoundException
因此,问题。
int random = (int) (Math.random() * 49 + 1);
int random2 = (int) (Math.random() * 49 + 1);
//this can cause ArrayIndexOutOfBoundException, either change to above or
//modify the dimension of your grid array
int random2 = (int) (Math.random() * 50 + 1);
你知道 Arrays.deepToString() 吗?也许不是,您可以使用它来打印二维数组,而不是使用两个 for 循环,如下所示:
Arrays.deepToString(grid);
如果您进行了上述更改,那么 运行 您的程序。您保证在网格阵列的 10 个随机位置有 10 个单元格。
我添加了另一种方法,只打印单元格的有效位置,在 运行 代码之后,我得到以下结果:
grid[9][12]
grid[10][26]
grid[16][17]
grid[19][17]
grid[26][34]
grid[27][13]
grid[39][18]
grid[46][41]
grid[49][22]
最后但同样重要的是,我很好奇当您的随机数生成器 return 一个已经有单元格的位置时会发生什么。您将覆盖该单元格。我认为您需要检查以确保 grid
数组中生成的 random
和 random1
中没有单元格。如果该位置有一个有效的单元格,那么您需要生成另一个位置,将单元格存储在该位置。我会把它留给你处理。
要在一行中打印每一行,您可以将打印方法更改为具有单个循环,然后打印 grid[i],其中 i 是从 0 到小于 50 的循环计数器。见下文:
for(int i = 0; i < 50; i++) {
System.out.println(Arrays.toString(grid[i]));
}
每个网格[i] 是一行列。我们使用 println() 在新行中打印每一行。
所以我正在 Java 中研究一个极其基本的、面向对象的细胞生长模型。下面是我的 Cell class,它编译得很好,没有错误。
package cancerModel;
public class Cell {
public int x; //x position of cell
public int y; //y position of cell
public char type; //type of cell
public Cell(int x, int y, char type)
{
this.x = x;
this.y = y;
this.type = type;
}
public void addCellToGrid(char[][] grid, int x, int y, char type)
{
grid[x][y] = type;
}
public boolean checkAnySpace4(char[][] grid, int x, int y)
{
if(grid[x-1][y] == 'N' || grid[x-1][y] == 'M'|| grid[x-1][y] == 'C')
{
return false;
}
if(grid[x-1][y-1] == 'N' || grid[x-1][y-1] == 'M'|| grid[x][y-1] == 'C')
{
return false;
}
if(grid[x][y-1] == 'N' || grid[x][y-1] == 'M'|| grid[x][y-1] == 'C')
{
return false;
}
if(grid[x+1][y] == 'N' || grid[x+1][y] == 'M'|| grid[x+1][y] == 'C')
{
return false;
}
else
return true;
}
public boolean checkAnySpace8(char[][] grid, int x, int y)
{
if(grid[x-1][y] == 'N' || grid[x-1][y] == 'M'|| grid[x-1][y] == 'C')
{
return false;
}
if(grid[x-1][y-1] == 'N' || grid[x-1][y-1] == 'M'|| grid[x-1][y-1] == 'C')
{
return false;
}
if(grid[x][y-1] == 'N' || grid[x][y-1] == 'M'|| grid[x][y-1] == 'C')
{
return false;
}
if(grid[x+1][y] == 'N' || grid[x+1][y] == 'M'|| grid[x+1][y] == 'C')
{
return false;
}
if(grid[x][y+1] == 'N' || grid[x][y+1] == 'M'|| grid[x][y+1] == 'C')
{
return false;
}
if(grid[x+1][y+1] == 'N' || grid[x+1][y+1] == 'M'|| grid[x+1][y+1] == 'C')
{
return false;
}
if(grid[x+1][y-1] == 'N' || grid[x+1][y-1] == 'M'|| grid[x+1][y-1] == 'C')
{
return false;
}
if(grid[x-1][y+1] == 'N' || grid[x-1][y+1] == 'M'|| grid[x-1][y+1] == 'C')
{
return false;
}
else
return true;
}
public void divide(char[][] grid, char type, int x, int y)
{
if(type == 'N')
{
grid[x-1][y] = 'N';
grid[x][y-1] = 'N';
grid[x-1][y-1] = 'N';
grid[x+1][y] = 'N';
}
if (type == 'M')
{
grid[x-1][y] = 'M';
grid[x][y-1] = 'M';
grid[x-1][y-1] = 'M';
grid[x+1][y] = 'M';
}
if(type =='C')
{
grid[x-1][y] = 'C';
grid[x][y-1] = 'C';
grid[x-1][y-1] = 'C';
grid[x+1][y] = 'C';
grid[x][y+1] = 'C';
grid[x+1][y+1] = 'C';
grid[x+1][y-1] = 'C';
grid[x-1][y+1] = 'C';
}
}
public void die(char[][] grid, int x, int y)
{
grid[x][y] = ' ';
}
public void mutate(char[][] grid,char type, int x, int y)
{
if(type == 'N')
{
grid[x][y] = 'M';
}
else if (type == 'M')
{
grid[x][y] = 'C';
}
}
}
接下来,我有另一个名为 Setup 的 class,用于初始化模型。 start() 函数旨在保存模型进展的逻辑,但尚未完全实现。在这一点上,我只是想确保我能够查看网格,所以我制作了 10 个单元格并将它们放置在网格中的随机点。
package cancerModel;
public class Setup {
public double m = .05; //mutation rate
public double e = .6 ; //survival rate (1 - e = death rate)
public double p_c = .7; //growth rate for cancerous cells
public double p_n = .8; //growth rate for normal/mutated cells
public void printGrid(char[][] grid)
{
for(int i = 0; i < 50; i++)
{
for(int j = 0; j < 50; j++)
{
System.out.println(grid[i][j]);
}
}
}
public void start(int steps)
{
char[][] grid = new char[50][50];
int random = (int)(Math.random() * 50 + 1);
int random2 = (int)(Math.random() * 50 + 1);
for(int i = 1; i < steps; i++)
{
Cell cell = new Cell(random,random2,'N');
cell.addCellToGrid(grid, random, random2, cell.type);
}
printGrid(grid);
}
public static void main(String[] args)
{
Setup e = new Setup();
e.start(10);
}
}
当我 运行 这样做时,我没有得到任何字符输出。我的假设是它只是打印一个空的 50x50 数组。我不确定我在这里做错了什么。我创建单元格并将它们添加到网格的方式有问题吗,或者我打印网格的方式有问题吗?我将不胜感激任何帮助。
根据我对你的问题和疑问的理解,你需要进行以下修改以填充 50 x 50 数组:
- 将 random 和 random2 语句移动到 for 循环中
- 将随机数从
50 + 1
更改为49 + 1
或者将数组的大小更改为51 x 51
问题 1,您必须在 for 循环内移动随机语句的原因是允许为您声明的 10 个单元格生成随机位置。在 for 循环之外意味着,您覆盖了前一个单元格,结果您的 2D 数组将只有一个元素,因为您一直在网格的相同位置添加单元格。
//move the random and random1 inside for loop for random cell positions
for (int i = 1; i < steps; i++) {
int random = (int) (Math.random() * 49 + 1);
int random2 = (int) (Math.random() * 49 + 1);
Cell cell = new Cell(random, random2, 'N');
cell.addCellToGrid(grid, random, random2, cell.type);
}
问题 2 导致漏洞的编号为 50,如果您尝试使用该编号访问网格数组,您一定会得到 ArrayIndexOutOfBoundException
因此,问题。
int random = (int) (Math.random() * 49 + 1);
int random2 = (int) (Math.random() * 49 + 1);
//this can cause ArrayIndexOutOfBoundException, either change to above or
//modify the dimension of your grid array
int random2 = (int) (Math.random() * 50 + 1);
你知道 Arrays.deepToString() 吗?也许不是,您可以使用它来打印二维数组,而不是使用两个 for 循环,如下所示:
Arrays.deepToString(grid);
如果您进行了上述更改,那么 运行 您的程序。您保证在网格阵列的 10 个随机位置有 10 个单元格。
我添加了另一种方法,只打印单元格的有效位置,在 运行 代码之后,我得到以下结果:
grid[9][12]
grid[10][26]
grid[16][17]
grid[19][17]
grid[26][34]
grid[27][13]
grid[39][18]
grid[46][41]
grid[49][22]
最后但同样重要的是,我很好奇当您的随机数生成器 return 一个已经有单元格的位置时会发生什么。您将覆盖该单元格。我认为您需要检查以确保 grid
数组中生成的 random
和 random1
中没有单元格。如果该位置有一个有效的单元格,那么您需要生成另一个位置,将单元格存储在该位置。我会把它留给你处理。
要在一行中打印每一行,您可以将打印方法更改为具有单个循环,然后打印 grid[i],其中 i 是从 0 到小于 50 的循环计数器。见下文:
for(int i = 0; i < 50; i++) {
System.out.println(Arrays.toString(grid[i]));
}
每个网格[i] 是一行列。我们使用 println() 在新行中打印每一行。