首页 > 解决方案 > 加工中的打地鼠

问题描述

打地鼠

我正在处理一个学校项目(Java 模式)。我们有一张游戏应该是什么样子的图片。

所以任务是用正方形创建一个网格。随机方块应该以红色点亮。如果单击红色方块,它应该将颜色变为绿色并保持绿色。

我的代码目前的样子:

Square[][] grid;
 
int cols = 20;
int rows = 20;
 
void setup() {
  size(400, 400);
  grid = new Square[cols][rows];
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      grid[i][j] = new Square(i*20, j*20, 20, 20);
    }
  }
}
 
void draw() {
  background(0);
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      grid[i][j].display();
      if (grid[i][j].x<mouseX && mouseX < grid[i][j].x + grid[i][j].w && grid[i][j].y<mouseY && mouseY < grid[i][j].y + grid[i][j].h && mousePressed) {
        color col = color(0,204,0);
        grid[i][j].update(col);
      }
    }
  }
}

正方形类:

class Square {
  float x, y;  
  float w, h;  
  color c;


  Square(float tempX, float tempY, float tempW, float tempH) {
    x = tempX;
    y = tempY;
    w = tempW;
    h = tempH;
     c = color(0);
  } 
 
  void display() {
    stroke(0);
    fill(c);
    rect(x, y, w, h);
  }
 
  void update(color c) {
    this.c = c;
  }
}

所以此刻,你点击的每一个方块都会变成绿色。我不知道如何编写代码,以便随机方块将颜色变为红色并每 5 秒洗牌一次。您对如何继续编写代码或采取哪些思考步骤来解决此任务有任何提示吗?

标签: javaprocessing

解决方案


首先,接受你的任务:

所以任务是用正方形创建一个网格。随机方块应该以红色点亮。如果单击红色方块,它应该将颜色变为绿色并保持绿色。

并将其分解:

  1. 用正方形创建一个网格:已经做得很好了!
  2. 随机方块应该以红色点亮
  3. 如果点击红色方块_
  4. 颜色更改为绿色并保持绿色

你如何在处理中使用随机数?最简单的方法是使用random()方法:你可以传递两个值,你会得到这些值之间的一个随机数。

假设您想掷硬币,因此(大约)有 50-50 零钱,您会得到正面或反面。你可以这样:

if(random(0, 100) > 50){
  println("head");
}else{
  println("tails");
}

甚至可以random(0.0, 1.0) > 0.5是例如,想法是相同的。您可以考虑掷一个或多个骰子等。记住这些是伪随机的,您可以在自己的时间探索其他与伪随机相关的方法,例如randomGauss()noise()random()现在可能已经足够好了,第 2 部分完成了 :)

您几乎完成了第 3 部分:

if (grid[i][j].x<mouseX && mouseX < grid[i][j].x + grid[i][j].w && grid[i][j].y<mouseY && mouseY < grid[i][j].y + grid[i][j].h && mousePressed) {

但您还需要检查点击的方块是否为红色。很高兴有一些红色方块开始。假设color(204, 0, 0)你是红色的,你可以简单地添加一个额外的检查:

if(grid[i][j].c == color(204, 0, 0)){
   println("red block clicked");
   grid[i][j].c = color(0, 204, 0);
}

这大致将您的草图变成:

Square[][] grid;

int cols = 20;
int rows = 20;

final color RED   = color(204, 0, 0);
final color GREEN = color(0, 204, 0);

void setup() {
  size(400, 400);
  grid = new Square[cols][rows];
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      grid[i][j] = new Square(i*20, j*20, 20, 20);
      // roughly 50 - 50 % change a grid square will be red
      if (random(0, 100) > 50) {
        grid[i][j].update(RED);
      }
    }
  }
}

void draw() {
  background(0);
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      grid[i][j].display();
      if (grid[i][j].x<mouseX && mouseX < grid[i][j].x + grid[i][j].w && grid[i][j].y<mouseY && mouseY < grid[i][j].y + grid[i][j].h && mousePressed) {
        // if the square is red
        if (grid[i][j].c == RED) {
          // change colour to GREEN
          grid[i][j].update(GREEN);
        }
      }
    }
  }
}

class Square {
  float x, y;  
  float w, h;  
  color c;

  Square(float tempX, float tempY, float tempW, float tempH) {
    x = tempX;
    y = tempY;
    w = tempW;
    h = tempH;
    c = color(0);
  } 

  void display() {
    stroke(0);
    fill(c);
    rect(x, y, w, h);
  }

  void update(color c) {
    this.c = c;
  }
}

在黑色背景的网格中预览或随机红色框,带有 3 个绿色框

关于每 5 秒洗牌一次的颜色,我建议:

  • 每 5 秒你可以使用millis()
  • 上面有一个洗牌的例子,setup()尽管你可能想用void shuffle()函数中的随机条件封装一个嵌套循环,例如你可以很容易地每 5 秒调用一次。
  • 请注意,这种方法会将绿色块重置为红色,您可能希望else在这种情况下将块重置为黑色(否则,随着时间的推移,大多数会变成红色),等等。

玩得开心!

PS我倾向于将状态数据与表示分开。例如,我会添加一个变量来跟踪每个方形状态(例如OFF, INTERACTIVE, ACTIVATED),更新基本的有限状态机,然后相应地渲染颜色。上面的内容是Square 的颜色与其状态之间的紧密耦合。对于你已经完成的家庭作业,这是可以的,但在未来,对于更复杂的项目,你可能需要考虑通过程序的数据流以及如何表示它。


推荐阅读