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>

明らかに、これは完全なブラックジャック ゲームではありません。これは、シャッフルの前後に両方のデッキ (配列) の内容を出力することによって、配列のシャッフルが機能するかどうかを確認するための単なるテストです。

現時点では、2 が 4 枚と 3 が 4 枚の 8 枚のカードしか使用していません。

これから得られるものは次のとおりです。

デッキ = 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

このためにシャッフルを変更する必要があります。

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

1 つのアイテムが新しいスタックにプッシュされ、ポップされます。deck.length = 3

r増分されますr = 1

r未満deck.length、続行

1 つのアイテムが新しいスタックにプッシュされ、ポップされます。deck.length = 2

r がインクリメントされますr = 2

rが 未満ではなくなりましdeck.lengthた。ループは終了しましたが、転送された要素の半分しかありません!

于 2013-07-01T16:59:16.657 に答える
1

別の非常に簡単な配列ソート手法:

 deck.sort(function() { return Math.random()-0.5})
于 2013-07-01T16:55:36.660 に答える
0

最初の問題はfor、デッキをランダム化するループから始まります。デッキの長さを含むループの前に、新しい変数を作成する必要があります。見る:

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

ここで行っていることは、1 ずつ減少するとr同時に 1 増加するということです(ループ内のため)。そのため、シャッフルされたデッキには「カード」が 4 枚しかありません。2 つ目の問題は、カードを新しいデッキに入れるのではなく、それ自体を入れることです。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: Joe が以下で述べたようにpop()、引数を取りません。splice()あなたが達成しようとしていることをします。

于 2013-07-01T16:59:17.797 に答える
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 に答える