You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现5-10秒随机自动开关的门?现有代码仅能单次关闭

搞定门循环随机切换状态的问题

你的代码现在只能完成一次“从开到关”的切换,之后就一直保持关闭了——因为切换时间只在程序启动时生成了一次,而且完全没考虑关闭后再打开的逻辑。要实现每5-10秒随机切换一次门的开关状态,我们得加几个关键逻辑:跟踪当前状态、每次切换时重新计算下一次的时间。

修改后的完整代码

// 记录当前门是开还是关:true=打开,false=关闭
boolean isDoorOpen = true;
// 存储下一次要切换状态的时间点(毫秒)
long nextSwitchTime;

void setup() {
  size(1000, 1000);
  // 初始化第一次切换的时间
  setNextSwitchTime();
}

void draw() {
  // 检查是否到达切换时间
  if (millis() >= nextSwitchTime) {
    // 切换状态:开变关,关变开
    isDoorOpen = !isDoorOpen;
    // 重新计算下一次切换的时间
    setNextSwitchTime();
  }
  
  background(255); // 每次绘制前清屏,避免门的图形重叠
  // 根据当前状态绘制门
  if (isDoorOpen) {
    doorOpen();
  } else {
    doorClosed();
  }
}

void doorOpen() {
  noFill();
  stroke(0); // 添加黑描边,确保无填充的门在白色背景上可见
  rect(500, 500, 100, 200);
}

void doorClosed() {
  fill(0);
  rect(500, 500, 100, 200);
}

// 生成5-10秒后的随机切换时间
void setNextSwitchTime() {
  // 生成5000到10000毫秒的随机延迟
  long randomDelay = random(5000, 10000);
  nextSwitchTime = millis() + randomDelay;
}

核心改动说明

  • 状态跟踪:用isDoorOpen布尔变量记录当前门的状态,每次切换时取反(!isDoorOpen)就能实现开/关的循环切换。
  • 动态更新切换时间:新增setNextSwitchTime()方法,每次切换状态时都重新生成5-10秒的随机延迟,并计算出下一次切换的时间点(当前时间+随机延迟)。
  • 清屏优化:在draw()开头添加background(255),避免多次绘制的门图形重叠,保证视觉效果清晰。
  • 可见性修复:给doorOpen()添加stroke(0),解决无填充矩形在白色背景上可能看不见的问题。

这样修改后,门就会在开、关状态之间循环切换,每次停留的时间都是5-10秒内的随机值啦。

内容的提问来源于stack exchange,提问作者aadds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:07