计算6个数字的每个组合

时间:2017-11-30 00:52:45

标签: javascript arrays loops

我更多的是媒体开发者,而不是最好的编码员,但我发现自己需要更好地学习javascript。我正在创建一个数学卡片游戏,其中人类玩家和自动玩家各自获得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);
}

等...

1 个答案:

答案 0 :(得分:0)

将处理后的卡存储在一个数组而不是单个变量中,因为这样可以在生成排列时更容易处理。你不会说卡片可以有什么价值,但作为一个例子,给出一个&#34;手&#34;如果您将排列作为数组数组得到[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. ]

然后你可以遍历它来处理每个排列以获得前三个&#34;卡&#34;并且最后三个得到当前迭代的两个数字,减去它们,看看结果是否比之前的迭代更接近目标&#39;结果

以下是这样做,利用我在this answer to another question中找到的数组置换函数。我不打算解释这个算法,因为你可以轻松地为自己设置各种排列算法,但我已经在我的bestPlay()函数中添加了注释来解释我如何处理排列以找出哪个是最好的一只手得分。

我还没有尝试使用您的playerplayer.SetVar()方法,但希望如果你研究这个,你可以调整它以用于你的对象。

你没有说明这些卡可能具有什么价值,所以我假设有一张二十张卡片,它们会重复两次数字0-9。

&#13;
&#13;
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);
}
&#13;
&#13;
&#13;

如果您点击&#34;运行代码段&#34;按钮数次,您会看到有时一只手的数字组合与目标完全匹配,有时它不会。