Grid 处理中具有单击功能的阵列网格

Grid 处理中具有单击功能的阵列网格,grid,click,processing,Grid,Click,Processing,我有一个网格,可以点击,但我不确定如何继续与特定的规则集 编辑:我以一种更容易理解的方式重写了规则。与生活游戏非常相似 设置 跨/列的21个单元格 下10个单元格/行 4个基本单元在电路板中心垂直对齐。 轮廓单元格将围绕基本单元格。 每隔一个单元格开始时都是不活动的 基本单元[2] 恒定的和活跃的蓝色细胞在中间,不能被去除。 活动[0]->[1] 单击时,非活动的白色单元格变为黑色 如果 边缘接触基本单元的边缘 或 该边与另一个活动单元格的边接触 (左侧、右侧、顶部或底部–非对角。) 其他 不活

我有一个网格,可以点击,但我不确定如何继续与特定的规则集

编辑:我以一种更容易理解的方式重写了规则。与生活游戏非常相似

设置

跨/列的21个单元格
下10个单元格/行

4个基本单元在电路板中心垂直对齐。
轮廓单元格将围绕基本单元格。
每隔一个单元格开始时都是不活动的

基本单元[2]

恒定的和活跃的蓝色细胞在中间,不能被去除。

活动[0]->[1]

单击时,非活动的白色单元格变为黑色

如果
边缘接触基本单元的边缘

该边与另一个活动单元格的边接触

(左侧、右侧、顶部或底部–非对角。)

其他
不活动

非活动[1]->[0]

单击时,活动的黑色单元格将变为白色

大纲[3]

一系列黄色细胞,不断更新以包围活动细胞的邻域

如果有人能帮我做到这一点,我将非常感谢大家的意见,以帮助我了解这个过程

这是我目前的代码:

int boxsize = 100;
int cols, rows;
color[][] colors;
int saved_i = -1;
int saved_j = -1;

void setup() {
  size(1300, 600);
  cols = width/boxsize;
  rows = height/boxsize;
  colors = new color[cols][rows];
  for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
  colors[i][j] = color(255);
    }
  }
}

void draw() {
  background(255);
  for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      fill(colors[i][j]);
      rect(i*boxsize, j*boxsize, boxsize, boxsize);
    }
  }
}

void mousePressed() {
  for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      int x = i*boxsize;
      int y = j*boxsize;
      if (mouseX > x && mouseX < (x + boxsize) && mouseY > y && mouseY < (y + boxsize)) {
        if ( saved_i == -1 || saved_i == i || saved_j == j ) {
          colors[i][j] = color(0);
          if (j>0) colors[i][j-1]=color(255, 255, 0);
          if (j>0) colors[i+1][j-1]=color(255, 255, 0);
          if (j<rows-1) colors[i][j+1]=color(255, 255, 0);
          if (j<rows-1) colors[i+1][j+1]=color(255, 255, 0);
          if (i>0) colors[i-1][j]=color(255, 255, 0);
          if (i>0) colors[i-1][j-1]=color(255, 255, 0);
          if (i>0) colors[i-1][j+1]=color(255, 255, 0);

      if (i<cols-1) colors[i+1][j]=color(255, 255, 0);
      saved_i = i;
      saved_j = j;
        }
      }
    }
  }
}
int-boxsize=100;
int列,行;
颜色[][]种颜色;
保存的int_i=-1;
int_j=-1;
无效设置(){
规模(1300600);
cols=宽度/箱尺寸;
行=高度/盒大小;
颜色=新颜色[颜色][行];

对于(int i=0;i你的问题很宽泛,所以我将用宽泛的术语回答。你需要弄清楚四件事:

  • 如何表示单元格。换句话说,您希望将网格存储在哪种类型的变量中。您现在正在使用
    颜色
    ,但您可能不希望这样做。在我看来,您有三个逻辑选项:

    • 使用枚举值的2D数组。枚举将具有基本、活动、非活动和大纲的状态。这可能是正确的方法
    • 使用整数的2D数组。0表示基本,1表示活动,2表示非活动,3表示大纲。使用枚举可能更好,但对于新手来说可能更容易理解
    • 使用2D对象数组。创建一个表示单元格的类,该对象将存储其状态(在枚举或int中)。如果希望每个单元格内有其他逻辑,或者希望每个单元格跟踪自己的邻居,可以使用这种方法
  • 如何在鼠标单击时更改单个单元格的状态。您已经有了处理颜色的逻辑,现在您只需将该逻辑应用于步骤1中选择的数据结构。可以创建一个函数,该函数接受
    mouseX
    mouseY
    ,并返回数组中该位置的位置

  • 如何为下一代中的每个单元格获取新状态。创建一个函数,该函数获取一个单元格的位置(其在2D数组中的行和列),并返回该单元格在下一代中应具有的状态。这就是“肉和土豆”如果你知道一个细胞的位置,那么它的邻居的位置是什么?有很多关于生命游戏的教程都有这种逻辑

  • 如何更新网格。请记住,在更新整个网格之前,必须对网格中的每个单元格执行步骤2。这意味着您必须在每次迭代中创建一个新的二维数组

  • 像这样把你的问题分解,如果你在某个特定的步骤上遇到困难,可以发布一个新的问题。一般的“我该怎么做”类型的问题很难帮助你。更具体的问题更容易帮助你,比如“我尝试了X,预期了Y,但得到了Z。我做错了什么?”


    祝你好运!

    你的问题很宽泛,所以我将用宽泛的术语回答。你需要弄清楚四件事:

  • 如何表示单元格。换句话说,您希望将网格存储在哪种类型的变量中。您现在正在使用
    颜色
    ,但您可能不希望这样做。在我看来,您有三个逻辑选项:

    • 使用枚举值的2D数组。枚举将具有基本、活动、非活动和大纲的状态。这可能是正确的方法
    • 使用整数的2D数组。0表示基本,1表示活动,2表示非活动,3表示大纲。使用枚举可能更好,但对于新手来说可能更容易理解
    • 使用2D对象数组。创建一个表示单元格的类,该对象将存储其状态(在枚举或int中)。如果希望每个单元格内有其他逻辑,或者希望每个单元格跟踪自己的邻居,可以使用这种方法
  • 如何在鼠标单击时更改单个单元格的状态。您已经有了处理颜色的逻辑,现在您只需将该逻辑应用于步骤1中选择的数据结构。可以创建一个函数,该函数接受
    mouseX
    mouseY
    ,并返回数组中该位置的位置

  • 如何为下一代中的每个单元格获取新状态。创建一个函数,该函数获取一个单元格的位置(其在2D数组中的行和列),并返回该单元格在下一代中应具有的状态。这就是“肉和土豆”如果你知道一个细胞的位置,那么它的邻居的位置是什么?有很多关于生命游戏的教程都有这种逻辑。