0
<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf=8" />
        <title>Blackjack</title>
        <link rel="stylesheet" href="blackjack.css" />
        
        <script type="text/javascript">
        
            var H2 = 2; var S2 = 2; var D2 = 2; var C2 = 2;
            var H3 = 3; var S3 = 3; var D3 = 3; var C3 = 3; 
                
    
            
            var deck = new Array(H2, S2, D2, C2, H3, S3, D3, C3);
            
            var new_deck = new Array();
            
            var r;
            
            document.write("deck = ")
            
            for (r =0; r<deck.length; r++){
                document.write(deck[r]);
                }
                
            document.write("</br>")
                
            document.write("new deck = ")
            
            for (r=0; r<new_deck.length; r++){
                document.write(new_deck[r]);
                }
                
            document.write("</br>")
            
            for (r=0;r<deck.length;r++){
                var randomindex = Math.floor(Math.random()*deck.length);
                new_deck.push(randomindex)
                deck.pop(randomindex)
                }
                
            document.write("deck = ")
            
            for (r =0; r<deck.length; r++){
                document.write(deck[r]);
                }
                
            document.write("</br>")
                
            document.write("new deck = ")
            
            for (r=0; r<new_deck.length; r++){
                document.write(new_deck[r]);
                }
                
            document.write("</br>")
                
            
        </script>
        
    </head>
    <body>
    </body>
</html>

显然,这不是完整的二十一点游戏。这只是一个测试,通过在洗牌前后打印两个牌组(数组)的内容来查看洗牌是否有效。

我目前只使用 8 张卡,4 张 2 和 4 张 3。

我从中得到的是:

甲板 = 22223333
新甲板 =
甲板 = 2222
新甲板 = 7502

我希望得到的是:

甲板 = 22223333
新甲板 =
甲板 =
新甲板 = 23232323 (或 8 个数字中的任何一个,随机生成)

所以应该洗那8张牌,我做错了什么?我只是 JavaScript 新手,但我以前使用过一些 python。我在 python 中做了类似的事情并且工作得很好,但我不确定这里有什么问题。

4

5 回答 5

3

new_deck只包含索引,而不是值,并且在选择下一个随机值之前不会删除先前选择的值。 .pop()不带参数,因此您无法使用它删除特定索引-您必须为此使用.splice()。总而言之,由于几个原因,您没有获得新的值数组。

如果您只是想要一种简单的方法来随机化一个数组,而无需重新发明轮子并且知道随机性实际上工作得很好,您可以使用这个:

function fisherYates ( myArray ) {
  var i = myArray.length;
  if ( i == 0 ) return false;
  while ( --i ) {
     var j = Math.floor( Math.random() * ( i + 1 ) );
     var tempi = myArray[i];
     var tempj = myArray[j];
     myArray[i] = tempj;
     myArray[j] = tempi;
   }
}

您可以在此处阅读有关 Fisher-Yates 方法的信息:http ://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 。

您可以阅读为什么其他一些随机化方法不起作用,您可以在此处阅读:http ://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html 。

所以,你会替换这个:

       for (r=0;r<deck.length;r++){
            var randomindex = Math.floor(Math.random()*deck.length);
            new_deck.push(randomindex)
            deck.pop(randomindex)
            }

        document.write("deck = ")

        for (r =0; r<deck.length; r++){
            document.write(deck[r]);
            }

        document.write("</br>")

        document.write("new deck = ")

        for (r=0; r<new_deck.length; r++){
            document.write(new_deck[r]);
            }

有了这个:

        document.write("deck = ")

        for (r =0; r<deck.length; r++){
            document.write(deck[r]);
            }

        document.write("</br>")

        document.write("shuffled deck = ")

        // shuffle the deck and then output it
        fisherYates(deck);

        for (r=0; r<deck.length; r++){
            document.write(deck[r]);
            }
于 2013-07-01T16:53:14.620 回答
1

另一种超级简单的数组排序技术:

 deck.sort(function() { return Math.random()-0.5})
于 2013-07-01T16:55:36.660 回答
1

您需要为此更改随机播放:

while(deck.length > 0 ){ //for loop won't work
    var randomindex = Math.floor(Math.random()*deck.length);
    new_deck.push(deck[randomindex]);//Move onto new stack
    deck.splice(randomindex,1); //Take from old.
}

这就是 for 循环不起作用的原因:说deck.length = 4

for循环的开始:r = 0

一项被推入新堆栈并弹出:deck.length = 3

r递增r = 1

r小于deck.length,继续

一项被推入新堆栈并弹出:deck.length = 2

r 递增r = 2

r不再小于deck.length,循环已经完成,但只有一半的元素被转移!

于 2013-07-01T16:59:16.657 回答
0

你得到一个随机值,而不是牌组中的随机索引

for (r=0;r<deck.length;r++){
    var randomindex = Math.floor(Math.random()*deck.length);
    new_deck.push(deck[randomindex]);
}
于 2013-07-01T16:52:09.723 回答
0

第一个问题始于for随机化牌组的循环。您需要在包含甲板长度的循环之前创建一个新变量。看:

for (r=0;r<deck.length;r++){
    var randomindex = Math.floor(Math.random()*deck.length);
    new_deck.push(randomindex)
    deck.pop(randomindex)
}

您在这里所做的是增加r1 的同时减少1(由于循环中)。所以,这就是为什么你的洗牌套牌中只有四张“牌”。第二个问题是你不是在把一张牌放进新牌组,而是把它本身放进去。deck.lengthpopforpushpushrandomindex

这段代码应该可以解决问题:

var i = deck.length;
for (r=0;r<i;r++){
    var randomindex = Math.floor(Math.random()*deck.length);
    new_deck.push(deck.splice(randomindex, 1));
}

(PS:最初,您在上述for循环中的两个语句都没有最后的分号。)

编辑:您也可以使用while()循环。请参阅meiamsome 的回答

编辑 2:正如下面提到的乔,pop()不接受争论。splice()做你想要完成的事情。

于 2013-07-01T16:59:17.797 回答