所以我对我的 Conway's Game of Life 版本有一个迭代问题(这不是我的代码,只是游戏逻辑的一个示例)。所以基本上游戏板有多种尺寸,从 32(W)X16(H),并以 2 的幂增加到 1024(W)X512(H)。我正在创建一个音频版本,以便每当细胞存活时,网络音频都会短暂播放振荡器音符。该音符的频率和增益取决于音频在板上的位置。我有 32 个频率节点和 16 个增益节点,因此板最右上方的单元将以最高频率和最大增益 (0.8) 播放音符。当电路板尺寸增加时,例如 64X32,我的问题就出现了。我无法弄清楚如何确定要使用哪个音符和增益的逻辑,因为位置 0 和 1 中的单元格(从底部从左到右)将具有相同的频率,位置 0 和 1 中的单元格也将具有相同的频率(从左下角到上)具有相同的增益。这是我遇到问题的部分的代码:
function updateGame()
{
// GO THROUGH THE UPDATE GRID AND USE IT TO CHANGE THE RENDER GRID
for (var i = 0; i < gridHeight; i++)
{
for (var j = 0; j < gridWidth; j++)
{
// HOW MANY NEIGHBORS DOES THIS CELL HAVE?
var numLivingNeighbors = calcLivingNeighbors(i, j);
// CALCULATE THE ARRAY INDEX OF THIS CELL
// AND GET ITS CURRENT STATE
var index = (i * gridWidth) + j;
var testCell = updateGrid[index];
// CASES
// 1) IT'S ALIVE
if (testCell === LIVE_CELL)
{
if (gridWidth == 32)
{
if (gainHeight == 0)
{
gainNode[0].gain.value = .05;
osc[i].connect(gainNode[0]);
gainNode[0].connect(context.destination);
}
else {
gainNode[j].gain.value = .05 * j;
osc[i].connect(gainNode[j]);
gainNode[j].connect(context.destination);
}
osc[i].start(context.currrentTime);
if (context.currentTime == .5)
{
gainNode[0].gain.value = 0;
osc[i].connect(gainNode[0]);
gainNode[0].connect(context.destination);
}
}
else if (gridWidth == 64) //issues begin here
{
if (gainHeight == 0 && (j == 0 || j == 1))
{
}
else
{
}
}
else if (gridWidth == 128)
{
}
else if (gridWidth == 256)
{
}
else if (gridWidth == 512)
{
}
else {
}
// 1a FEWER THAN 2 LIVING NEIGHBORS
if (numLivingNeighbors < 2)
{
// IT DIES FROM UNDER-POPULATION
renderGrid[index] = DEAD_CELL;
}
// 1b MORE THAN 3 LIVING NEIGHBORS
else if (numLivingNeighbors > 3)
{
// IT DIES FROM OVERCROWDING
renderGrid[index] = DEAD_CELL;
}
// 1c 2 OR 3 LIVING NEIGHBORS, WE DO NOTHING
else
{
renderGrid[index] = LIVE_CELL;
}
}
// 2) IT'S DEAD
else if (numLivingNeighbors === 3)
{
renderGrid[index] = LIVE_CELL;
}
else
{
renderGrid[index] = DEAD_CELL;
}
}
}
}
我还没有真正实现代码的音频部分,因为我想在开始搞乱网络音频之前确保我有正确的逻辑。我有一个充满 32 个振荡器节点的阵列,以及一个充满 16 个增益节点(值从 0.05 到 0.8)的阵列。感谢您的帮助,希望这是有意义的!
最佳答案
它应该像坐标除以超过 32x16 的比例一样简单。对于 64 的宽度,您可以使用 Math.floor(i/2)
而不仅仅是 i
。抱歉,如果这很明显并且我错过了问题的要点......
关于javascript - 迭代不同大小的网格来播放康威生命游戏的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26813459/