如何调整随机化级别的javascript

时间:2016-11-06 22:34:16

标签: javascript

我正在使用javascript开发8个益智游戏,我通过改组拼图瓷砖阵列来洗牌!

enter image description here

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]

2 个答案:

答案 0 :(得分:5)

改变难度的方法是减少或增加解决问题所需的动作次数。

我认为最好的解决方法是实现改组算法,与其解决方法相反:改组时,只选择合法移动(将一块移动到相邻的间隙中),然后随机重复对于一定数量的动作,直到它被充分洗牌。

对于简易模式,仅执行约5次移动。为了努力,做30步。需要5个动作来解决的谜题将会容易得多。

答案 1 :(得分:2)

取决于你想如何让一些想法变得更加困难:

  • 增加件数以使其成为4x4或5x5格子或使其成为非方形(即杂散件) - 更大的件数将需要更多的工作并且更大的板被洗牌越困难它很可能是。
  • 无法移动的锁定瓷砖等障碍
  • 时间限制
  • 移动限制 - 如果你使用@Archers建议启动游戏,你可以知道要解决的最小移动量 - 容易移动+ 20次移动+ 10次移动+ 5次。

至于实施它,您只需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,它可能会错误地添加额外的迭代。