2017-11-30 8 views
1

私はメディア開発者であり、最良のコーダーではありませんが、私は自分自身がjavascriptをよりよく学ぶ必要があると感じています。私は人間のプレーヤーと自動化されたプレーヤーがそれぞれ6枚のカードを配られた数学カードゲームを作成しています。各プレイヤーは、3枚のカードを組み合わせて(連結して)最上位にし、残りの3つを最下位にしなければなりません。これらの2つの数値は次に減算されます。自動化されたプレイヤーの場合、6枚のカードを組み合わせることができますので、2つの数字を差し引くと、できるだけターゲット番号に近づきます。私は配列にはあまりよくないので、可能なすべての組み合わせをテストし、どれが近いかを比較し始めました(下記の例を参照)。これは非常に非効率的なコーディング方法ですが、それ以外の方法はわかりません。どんな助けでも大歓迎です。6つの数字のすべての組み合わせを計算する

変数は既に宣言されています。

alienTopNum = "" + alienNum1 + alienNum2 + alienNum3; 
alienBottomNum = "" + alienNum4 + alienNum5 + alienNum6; 
oldDiff = targetNum - (alienTopNum - alienBottomNum); 
player.SetVar("AC1R1", alienNum1); 
player.SetVar("AC2R1", alienNum2); 
player.SetVar("AC3R1", alienNum3); 
player.SetVar("AC4R1", alienNum4); 
player.SetVar("AC4R1", alienNum5); 
player.SetVar("AC4R1", alienNum6); 
player.SetVar("ATR1", alienTopNum - alienBottomNum); 
alienTopNum = "" + alienNum1 + alienNum2 + alienNum3; 
alienBottomNum = "" + alienNum4 + alienNum6 + alienNum5; 
newDiff = targetNum - (alienTopNum - alienBottomNum); 
if (Math.abs(newDiff) < Math.abs(oldDiff)) { 
    oldDiff = newDiff; 
    player.SetVar("AC1R1", alienNum1); 
    player.SetVar("AC2R1", alienNum2); 
    player.SetVar("AC3R1", alienNum3); 
    player.SetVar("AC4R1", alienNum4); 
    player.SetVar("AC4R1", alienNum6); 
    player.SetVar("AC4R1", alienNum5); 
    player.SetVar("ATR1", alienTopNum - alienBottomNum); 
} 

など....

+0

現在、引用符でフォーマットされているため、コードを作成することはむしろ困難です。コードとしてレンダリングしたい場合は、質問エディタで中括弧{}でマークされたボタンを使用できます。あなたの質問が不明なので、現時点では助けが困難です。どのような良いStackoverflowの質問になるかについての大きなガイドでここにチェックインしてください:https://stackoverflow.com/help/how-to-ask – John

答えて

0

ストア配られたカードの配列ではなく、個々の変数で、それは、順列を生成するときの取り扱いを非常に簡単になりますので。あなたはカードを持つことができる値が何と言うが、あなたは配列の配列として順列を取得する場合の例として、[1,2,3,4,5,6]の「手」が与えられていない。そして、

[ [1,2,3,4,5,6], [1,2,3,4,6,5], [1,2,3,5,4,6], ...etc. ] 

のことができ、プロセスへのループスルー各順列は最初の3つの "カード"を取り、最後の3つは現在の反復の2つの数値を取得し、それらを減算し、その結果が以前の反復の結果よりもターゲットに近いかどうかを確認します。

これは、this answer to another questionにある配列置換関数を使用しています。私はアルゴリズムを説明するつもりはないので、さまざまな順列アルゴリズムを簡単にgoogleで手に入れることができるので、私はbestPlay()関数にコメントを入れて、どれが手にとって最高のスコアであるかを理解する順列をどのように処理するかを説明します。

私はあなたのplayerまたはplayer.SetVar()メソッドを使用しようとはしていませんが、これを学習すればあなたのオブジェクトで使用することができます。

あなたはカードにどのような価値があるのか​​言わなかったので、私は0から9までの数字を2回繰り返す20枚のカードのデッキを想定しました。

function bestPlay(hand, target) { 
 
    var perms = permutator(hand);   // Get all permutations for hand 
 
    var best = perms[0];      // Use the first as initial best 
 
    var bestDiff = difference(best); 
 
    for (var i = 1; i < perms.length; i++) { // Loop over the rest of the permutations 
 
    var diff = difference(perms[i]);  // Get diff for current permutation 
 
    if (Math.abs(target - diff) < Math.abs(target - bestDiff)) { // Check if 
 
     best = perms[i];      // current beats previous best 
 
     bestDiff = diff;      // and if so make it new best 
 
    } 
 
    } 
 
    // Output the results for this hand: 
 
    console.log(`Hand: ${hand.join(" ")}`); 
 
    console.log(`Best Numbers: ${best.slice(0,3).join("")} ${best.slice(3).join("")}`); 
 
    console.log(`Difference: ${bestDiff}`); 
 
} 
 

 
var hands = deal(); 
 
var target = 112; 
 
console.log(`Target: ${target}`); 
 
bestPlay(hands[1], target); 
 
bestPlay(hands[2], target); 
 

 
function difference(cards) { 
 
    return Math.abs(cards.slice(0,3).join("") - cards.slice(3).join("")); 
 
} 
 

 
function deal() { 
 
    var cards = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]; 
 
    // shuffle 
 
    cards.sort(function() { return Math.random() - 0.5; }); 
 
    // first hand is first six cards, second hand is next six 
 
    return { 
 
    1: cards.slice(0,6), 
 
    2: cards.slice(6, 12) 
 
    }; 
 
} 
 

 
function permutator(inputArr) { 
 
    var results = []; 
 
    function permute(arr, memo) { 
 
    var cur, memo = memo || []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
     cur = arr.splice(i, 1); 
 
     if (arr.length === 0) { 
 
     results.push(memo.concat(cur)); 
 
     } 
 
     permute(arr.slice(), memo.concat(cur)); 
 
     arr.splice(i, 0, cur[0]); 
 
    } 
 
    return results; 
 
    } 
 
    return permute(inputArr); 
 
}

あなたが「ファイル名を指定して実行コードスニペット」ボタンを数回クリックした場合、あなたは時々与えられた手が、時にはそれがない、正確にターゲットに一致する数字の組み合わせを持っていることがわかります。

+0

nnnnnnn、ありがとう、あなたの応答と説明に感謝します!それは非常に感謝し、本当に良い方向に私を得る。ありがとうありがとう! – TheDeaner

関連する問題