我正在使用javascript开发8个益智游戏,我通过改组拼图瓷砖阵列来洗牌
var shuffleArray = (array) => {
var currentIndex = array.length, temporaryValue, randomIndex;
while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
};
Run Code Online (Sandbox Code Playgroud)
我想给用户提供选择难度的选项:简单,中等,难度,我该如何实现这个?
我会解释一下我的建议.(这是打字稿)
拼图数组是一个类的数组 PuzzleNode
export class PuzzleNode {
goal: Node;
current: Node;
}
Run Code Online (Sandbox Code Playgroud)
当我洗牌时,我不会碰到puzzleArray,但我会current像这样洗牌
shuffle() {
this.shuffledNodes = shuffleArray(this.shuffledNodes);
for (let i = 0; i < this.shuffledNodes.length; i++) {
this.puzzleNodes[i].current = this.shuffledNodes[i];
}
/** Keep shuffling until getting a solvable puzzle */
if (!this.isSolvable()) {
this.shuffle();
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用索引到达任何节点,因为即使在洗牌后索引也不会改变,例如空白磁贴总是 puzzleNodes[8]
改变难度的方法是减少或增加解决它所需的移动次数.
我认为解决这个问题的最佳方法是实现改组算法,与其解决方法相反:在改组的同时,只选择合法的移动(将一块移动到相邻的间隙中),然后随机重复一次移动次数,直到它被充分洗牌.
对于简易模式,仅执行约5次移动.为了努力,做30步.一个需要5个动作才能解决的谜题将会容易得多.