我正在尝试使用 p5.js (Javascript) 创建棋盘游戏
要设置 6 x 6 网格的游戏板,我必须用 6 种颜色填充网格,使水平或垂直接触的单元格不具有相同的颜色。并且所有 6 种颜色都必须在 6 个单元格中使用。
但现在我正在努力创建一个随机放置颜色但保持规则的算法。
我尝试从左上角开始,填充随机颜色。然后我开始用不同的颜色填充左侧和底部的单元格。
问题是,当脚本想要填充最后几个单元格时,没有颜色可以使用(已经填充了 6 个单元格或者剩余的颜色是邻居)
示例:仍然需要两个单元格为红色,但只剩下一个位置为红色(在白色下):
//fill placedColors Array with zeros
placedColors = [];
for(let i=0; i<6; i++) {
placedColors[i] = 0;
}
//fill allIndexes Array with indizies to keep control of visited cells
let allIndexes = [];
for(let i=0; i<36; i++) {
allIndexes.push(i);
}
//build board
//when I set the limit to 36 the script runs forever because no solution is found
for(let i=0; i<33; i++) {
fillCells(i);
}
function fillCells(index) {
//get top and left color
let topColor = false;
//index is in the second row
if(index >= 6) {
topColor = cells[index-6].color;
}
let leftColor = false;
//index is not in the first column
if(index % 6 > 0 && index > 0) {
leftColor = cells[index-1].color;
}
if(allIndexes.indexOf(index) > -1) {
cells.push(new Cell(index, pickColor(topColor, leftColor)));
}
//mark index as visited
var allIndexesIndex = allIndexes.indexOf(index);
if (allIndexesIndex !== -1) {
allIndexes.splice(allIndexesIndex, 1);
}
}
function pickColor(invalidColor1,invalidColor2) {
let colorFound = false;
do {
randColor = floor(random(6));
if(placedColors[randColor] < 6 && randColor!=invalidColor1 && randColor!=invalidColor2) {
placedColors[randColor]++;
colorFound = true;
}
} while(!colorFound);
return randColor;
}