p5.js制作吉他指板时二维数组未定义与if循环冻结问题求助
解决p5.js吉他指板开发中的两个核心问题:程序冻结与二维数组定义错误
嘿,很高兴看到你自己摸索出了问题的根源!这两个坑其实是JavaScript新手很容易踩的,我帮你把整个过程梳理清楚,再附上修正后的完整代码,方便你后续迭代优化:
问题复盘与解决思路
问题1:if语句导致程序冻结
你精准定位到了问题——把条件判断的==写成了赋值的=,每次循环都强制给j赋值0,直接打乱了循环逻辑,让p5.js的draw()函数陷入死循环,程序自然就卡住了。改成==后,条件判断正常工作,循环逻辑回归正轨,程序也就恢复运行了。问题2:二维数组未正确定义
原来的strings.push[gstring]是语法错误,push是数组的方法,必须用括号调用(strings.push(gstring)),方括号是用来访问数组元素的语法,所以之前根本没把gstring子数组正确添加到strings里。补上括号后,二维数组就能正常构建了。
修正后的完整代码
let stringNumber = 6; let fretNumber = 22; let notes = ["a", "a#", "b", "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#"]; let baseNotes = [7, 0, 5, 10, 2, 7]; let fretboardWidth = 0; let fretboardHeight = 0; function setup() { createCanvas(600, 800); } function draw() { background(0,100,100); fretboardWidth = width - 100; fretboardHeight = height -100; renderFrets(); renderStrings(); renderCircles(); createNotes(); } function renderFrets() { for(let i=1; i <= fretNumber; i++){ line(0, fretboardHeight / (fretNumber + 1) * i, fretboardWidth, fretboardHeight / (fretNumber + 1) * i); } } function renderStrings() { for(let i=1; i <= stringNumber; i++){ line(fretboardWidth / (stringNumber +1) * i, 0, fretboardWidth / (stringNumber +1) * i, fretboardHeight); } } function renderCircles() { for(let i = 1; i <= stringNumber; i++){ for(let j = 1; j <= fretNumber; j++){ circle(fretboardWidth / (stringNumber+1) * i, fretboardHeight / (fretNumber+1) * j, 20); } } } function createNotes() { let strings = []; let gstring = []; for(let i=0; i < stringNumber; i++){ for(let j=0; j <= fretNumber; j++) { gstring.push(notes[(baseNotes[i] + j) % 12]); // 修正后的条件判断,现在可以正常区分空品与其他品的音符显示逻辑 if(j == 0){ text(gstring[j], fretboardWidth / 7 * (i+1) - 4, fretboardHeight / (fretNumber+1) * j + 3); } else { text(gstring[j], fretboardWidth / 7 * (i+1) - 4, fretboardHeight / (fretNumber+1) * j + 3); } } strings.push(gstring); // 修正push方法的调用方式,正确构建二维数组 gstring = []; } text(strings[0][0], fretboardWidth / 7 * (i+1) - 4, 10); }
额外小建议
以后写for循环时,尽量用let声明循环变量(比如for(let i=1; ...)),这样变量只会在循环作用域内生效,不会污染全局环境,能避免很多难以排查的隐性bug。
内容的提问来源于stack exchange,提问作者Leo Karl Frederick Brooks




