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

为何我的switch语句仅两个case生效?求排查原因

问题排查与解决方案

看起来你遇到的问题核心在于重复定义draw()函数以及对p5.js中draw()函数工作机制的误解,咱们一步步来梳理:

问题根源

在你的switch分支里,每个case都重新声明了一个draw()函数,但JavaScript的函数声明会被提升到当前作用域的顶部,而且后续的函数声明会直接覆盖之前的。这就导致不管你的switch进入哪个分支,最终生效的都是最后一个被解析的draw()(也就是Quadrat分支里的那个)——这就是为什么程序总是走到Quadrat分支的原因。

另外,p5.js中的draw()是框架自带的循环执行函数,它的定义应该是一次性的,不能在运行时动态去重新定义它,而是应该通过状态变量来控制绘制内容。

修正后的代码示例

我们可以用一个变量来存储当前选中的形状类型,然后在固定的draw()函数里根据这个变量来判断要绘制的图形:

// 定义全局变量存储当前要绘制的形状类型
let currentShape = '';

// 示例:模拟触发不同形状分支的逻辑(你可以替换成实际的交互触发,比如按钮点击)
function selectShape(shapeType) {
  currentShape = shapeType;
}

// 只定义一次draw函数,在内部根据状态变量判断绘制内容
function draw() {
  background(220); // 每次绘制前清空画布,避免图形叠加
  switch(currentShape) {
    case 'Kreis':
      ellipse(56, 46, 55, 55);
      break;
    case 'Dreieck':
      triangle(30, 75, 58, 20, 86, 75);
      break;
    case 'Quadrat':
      rect(30, 20, 55, 55);
      break;
    case 'Überraschung':
      let rN = Math.floor(Math.random() * 3);
      if (rN === 0) {
        line(30, 20, 85, 75);
      } else if (rN === 1) {
        ellipse(56, 46, 55, 55);
      } else {
        triangle(30, 75, 58, 20, 86, 75);
      }
      break;
  }
}

额外提示

  • 调用background()可以确保每次绘制新形状时清空画布,避免不同图形叠加在一起;
  • 你需要根据实际场景(比如按钮点击、下拉选择)来调用selectShape()函数,设置对应的currentShape值,触发不同的绘制逻辑;
  • Überraschung分支的代码也需要调整到draw函数内部,不用再重新定义draw。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:24:44