单元格模型输出未显示

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 数组:

  1. 将 random 和 random2 语句移动到 for 循环中
  2. 将随机数从 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 数组中生成的 randomrandom1 中没有单元格。如果该位置有一个有效的单元格,那么您需要生成另一个位置,将单元格存储在该位置。我会把它留给你处理。

要在一行中打印每一行,您可以将打印方法更改为具有单个循环,然后打印 grid[i],其中 i 是从 0 到小于 50 的循环计数器。见下文:

for(int i = 0; i < 50; i++) {
     System.out.println(Arrays.toString(grid[i]));
 }

每个网格[i] 是一行列。我们使用 println() 在新行中打印每一行。