为了账号安全,请及时绑定邮箱和手机立即绑定

与数组中的特定元素进行交互;加工3

与数组中的特定元素进行交互;加工3

撒科打诨 2021-12-30 16:05:22
我正在尝试创建一个正方形网格,当输入正确的键时“打开”,然后在用鼠标单击它们时“关闭”。在我的程序中,会生成一个随机索引号,它对应于特定键的 Unicode 值,当您按下该键时,网格上的随机方块将变为绿色。重新着色后,会为不同的键生成新的索引号,依此类推。在最后一个彩色方块上单击鼠标可以将其“取消着色”(变为黑色),但不能为任何其他先前着色的方块“取消着色”。问题似乎是 mousePressed 代码与数组中最后一次着色的任何元素相关联,但我无法弄清楚如何使其与数组中已着色的任何元素进行交互。甚至有可能吗?我考虑过更改数组,以便对数组本身中每个元素的位置进行打乱,但它创建的形状仍然排列在网格中,然后每次单击鼠标都会向后迭代。但是我似乎无法弄清楚如何在不进入我不熟悉的 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 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

boolean light = false;您需要一个类的成员变量,而不是单个变量Box

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带有 state 的对象boxes[i][j].light,是否mouseX和mouseY是:


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));

    }

}


查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信