与数组中的特定元素进行交互;处理3

时间:2018-11-04 19:00:59

标签: java arrays multidimensional-array random processing

我正在尝试创建一个正方形网格,当键入正确的键时该网格“打开”,然后在用鼠标单击它们时“关闭”。在我的程序中,将生成一个与特定键的Unicode值相对应的随机索引号,并且当您按下该键时,网格上的随机正方形将变为绿色。重新着色后,将为另一个键生成一个新的索引号,依此类推。鼠标单击最后一个彩色的正方形可以使它“不着色”(变为黑色),但是不能对任何其他先前彩色的正方形进行“不着色”。

问题似乎是mousePressed代码与数组中上一次着色的元素绑定在一起,但是我不知道如何使其与 any 中的元素进行交互彩色的数组。可能吗我考虑过更改数组,以便将每个元素在数组本身中的位置都改组,但是它创建的形状仍然排列在网格中,然后每次单击鼠标便向后迭代。但我似乎无法弄清楚如何在不熟悉Java的情况下改组数组。这是一个可解决的问题,还是应该以某种方式调整我的代码?这是我到目前为止的内容:

主要脚本:

int cols = 16;
int rows = 10;
boolean light = false;

Box[][] boxes = new Box[cols][rows];

int keyIndex = int(random(97, 122));
int randI = (int)random(0, cols);
int randJ = (int)random(0, rows);

void setup() {
  size (800, 600);
  background (0);
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      boxes[i][j] = new Box(i, j);
    }
  }
  println(keyIndex);
}


void draw() { 
  if (light == true) {
    boxes[randI][randJ].rollover(mouseX, mouseY);
    boxes[randI][randJ].displayOn();
  } else {
    boxes[randI][randJ].displayOff();
  }
}

void mousePressed() {
  if (boxes[randI][randJ].onPress(mouseX, mouseY)) {
    println("yes");
    light = false;
  } else {
    println("no");
  }
}

void keyPressed() {
  if (boxes[randI][randJ].keyRight()) {
    light = true;
    randI = (int)random(0, cols);
    randJ = (int)random(0, rows);
    keyIndex = int(random(97, 120));
    println(keyIndex);
  }
}

“盒子”类:

class Box {

  float x, y;
  color c;
  int size = 50;

  Box (int valX, int valY) {
    x = valX * size;
    y = (int) random(0, valY) * size;
  }

  void displayOn() {
    fill(c);
    rect(x, y, size, size);
    c = #b1f64d;
  }

  void displayOff() {
    fill(c);
    rect(x, y, size, size);
    c = #000000;
  }

  void rollover(float mx, float my) {
    if (mx > x && mx < x + size && my > y && my < y + size) {
      c = 126;
    }
  }

  boolean onPress(float mx, float my) {
    if (mx > x && mx < x + size && my > y && my < y + size) {
      return true;
    } else {
      return false;
    }
  }

  boolean keyRight() {
    if (key == keyIndex) {
      return true;
    } else {
      return false;
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您需要类boolean light = false;的成员变量来代替单一变量Box

boolean light = false;

class Box {

    boolean light = false;
    float x, y;
    color c;
    int size = 50;

    Box (int valX, int valY) {
        x = valX * size;
        y = valY * size;
    }

    .....
}

现在每个盒子对象都可以容纳信息,无论它是否被“点亮”。

draw函数中,您必须绘制所有方框,每个方框均取决于其状态
boxes[i][j].light为此使用2个嵌套的for循环:

void draw() { 

    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {

            if (boxes[i][j].light == true) {
                 boxes[i][j].rollover(mouseX, mouseY);
                 boxes[i][j].displayOn();
            } else {
                 boxes[i][j].displayOff();
            }
        }
    }
}

mousePressed中,您必须检查状态为Box的所有boxes[i][j].light对象,是否mouseXmouseY处于打开状态:

void mousePressed() {
    boolean hit = false;
    for (int i = 0; i < cols; i++) {
      for (int j = 0; j < rows; j++) {

        if (boxes[i][j].light == true && boxes[i][j].onPress(mouseX, mouseY)) {
            boxes[i][j].light = false;
            hit = true;
        }
      }
    }
    println(hit ? "yes" : "no");
} 

最后,您必须在函数boxes[randI][randJ].light中设置成员keyPressed,而不是不再存在的变量light

void keyPressed() {
    if (boxes[randI][randJ].keyRight()) {
        boxes[randI][randJ].light = true;
        randI = (int)random(0, cols);
        randJ = (int)random(0, rows);
        keyIndex = int(random(97, 120));
        println(keyIndex, char(keyIndex));
    }
}