【问题标题】:Randomize/shuffle cards in stack with jQuery使用 jQuery 在堆栈中随机化/洗牌
【发布时间】:2015-04-16 08:44:27
【问题描述】:

我正在为一个小项目构建一个非常简单的记忆游戏。逻辑如下:

  1. 点击输入框选择你想玩多少对
  2. 创建具有 card1、card2 等类的 div。
  3. 克隆 div 并随机化它们在数组中的位置

这是我的脚本(JSFiddle 中的 fork):

$(".button").click(function () {        
    // get the value from the input
    var numCards = parseInt($('input').val());

    for (var i = 1; i <= numCards; i++) {
        // create the cards
        $(".container").append("<div class='card" + i + " cards'></div>") &&
        $(".card" + i).clone().appendTo(".container");
    }

    // randomize cards in stack
    var cards = $(".cards");
    for (var i = 0; i < cards.length; i++) {
        var target = Math.floor(Math.random() * cards.length - 1) + 1;
        var target2 = Math.floor(Math.random() * cards.length - 1) + 1;
        var target3 = Math.floor(Math.random() * cards.length - 1) + 1;
        cards.eq(target).before(cards.eq(target2)).before(cards.eq(target3));
    }
});

我现在需要的是调整第3步,即动态创建目标变量,以及代码的最后一行

cards.eq(target).before(cards.eq(target2)).before(cards.eq(target3));

所以请给我一个建议 - 你会怎么做?请记住,这是一个面向初学者的项目。谢谢!

【问题讨论】:

  • 为什么不在创建 div 时随机化类名 (card%i%) 中的索引?那么你就不需要打乱 DOM 元素了。
  • 我建议你把所有的牌放在一个数组中,然后洗牌
  • 想尝试一下,请添加您的答案并解释一下并添加更新的脚本

标签: javascript jquery arrays random


【解决方案1】:
$(".button").click(function () {        
    // get the value from the input
    var numCards = parseInt($('input').val());

    for (var i = 1; i <= numCards; i++) {
        // create the cards
        $(".container").append("<div class='card" + i + " cards'></div>") &&
        $(".card" + i).clone().appendTo(".container");
    }

    var parent = $(".container");
    var divs = parent.children();
    while (divs.length) {
        parent.append(divs.splice(Math.floor(Math.random() * divs.length), 1)[0]);
    }
});

见 jsfidle:http://jsfiddle.net/007y4rju/8/

来源:http://jsfiddle.net/C6LPY/2/

【讨论】:

    【解决方案2】:

    这是 jsfiddle 中的代码版本 - http://jsfiddle.net/007y4rju/6/

    请检查行为是否与原代码一致。

    $(document).ready(function () {
    
        $(".button").click(function () {        
            // get the value from the input
            var numCards = parseInt($('input').val());
    
            for (var i = 1; i <= numCards; i++) {
                // create the cards
                $(".container").append("<div class='card" + i + " cards'></div>") &&
                $(".card" + i).clone().appendTo(".container");
            }
    
            // randomize cards in stack
            var cards = $(".cards");
            var startTarget = Math.floor(Math.random() * cards.length - 1) + 1;
            var collection = cards.eq(startTarget);
            var nextTarget;
            var i;
            for (i = 0; i < cards.length; i++) {
                nextTarget = Math.floor(Math.random() * cards.length - 1) + 1;
                collection.before(cards.eq(nextTarget));
            }
        });
    });
    

    【讨论】:

      【解决方案3】:

      您可以在克隆 div 时随机化类名 (card%i%) 中的索引。然后你不需要洗牌克隆的 div;您可以按原样附加它们。

      $(".button").click(function () {        
          // get the value from the input
          var numCards = parseInt($('input').val());
      
          for (var i = 1; i <= numCards; i++) {
              // create the cards
              $(".container").append("<div class='card" + i + " cards'></div>");
          }
      
          var aIndices = [];
          for (var i = 1; i <= numCards; i++) {
              var ix;
              do ix = Math.round(Math.random() * (numCards - 1)) + 1;
              while (aIndices.indexOf(ix) >= 0);
              aIndices.push(ix);
              // clone
              $(".card" + ix).clone().appendTo(".container");
          }
      });
      

      【讨论】:

      • 循环有问题,它破坏了 chrome 选项卡
      • @pres 哪个循环?
      • 这里是您的代码的 jsfiddle:jsfiddle.net/007y4rju/11 当您输入一个值时它会中断。我想 - 这是一个循环问题。我不知道在哪里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 2016-01-02
      • 1970-01-01
      • 2015-10-30
      • 2016-04-26
      相关资源
      最近更新 更多