我正在使用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;
};
我想给用户提供选择难度的选项:简单,中等,难度, 我怎么能这个?
我将解释一下我的实施。 (这是打字稿)
拼图数组是类PuzzleNode
export class PuzzleNode {
goal: Node;
current: Node;
}
当我洗牌时,我不会触摸PuzzleArray,但我会像{/ p>那样洗牌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();
}
}
这样我可以使用索引到达任何节点,因为即使在洗牌之后索引也不会改变,例如空白磁贴总是puzzleNodes[8]
答案 0 :(得分:5)
改变难度的方法是减少或增加解决问题所需的动作次数。
我认为最好的解决方法是实现改组算法,与其解决方法相反:改组时,只选择合法移动(将一块移动到相邻的间隙中),然后随机重复对于一定数量的动作,直到它被充分洗牌。
对于简易模式,仅执行约5次移动。为了努力,做30步。需要5个动作来解决的谜题将会容易得多。
答案 1 :(得分:2)
取决于你想如何让一些想法变得更加困难:
至于实施它,您只需Math.floor(Math.random()*3)
来决定移动的方向并指定数字1到4的方向
每个移动功能都需要能够处理无效移动 - 如果失败,可能值得返回错误结果,这样您就可以确保实际获得所需的移动量。
function moveLeft(){
// Code to move a piece left here
}
// ... other movement functions
function scrambleBoard(){
// Assign directions to an array so that we can easilly reference them with a random number
var directions =
[moveLeft,
moveUp,
moveRight,
moveDown];
for(let i = 0; i < 50; i++){
// Generate a number between 0 and 3 then call the function at that array index
var result = directions[Math.floor(Math.random()*3)]();
// We tried to make an invalid move so this iteration never happened
if(result === false) i--;
}
}
为什么我比较结果=== false你可能希望移动函数返回一个新位置,所以如果位置是0,它可能会错误地添加额外的迭代。