Вычислить каждую комбинацию из 6 чисел

1

Я больше разработчик средств массовой информации, а не лучший кодер, но мне нужно научиться 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);
}

так далее....

  • 0
    Довольно сложно разобрать ваш код, так как он в настоящее время отформатирован как цитата. Если вы хотите, чтобы он отображался в виде кода, вы можете использовать кнопку, помеченную фигурными скобками {} в редакторе вопросов. Также трудно помочь в данный момент, так как ваш вопрос неясен. Пожалуйста, зарегистрируйтесь здесь с отличным руководством, которое объясняет, что делает хороший вопрос Stackoverflow: stackoverflow.com/help/how-to-ask
Теги:
arrays
loops

1 ответ

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. ]

Затем вы можете пройти через это, чтобы обработать каждую перестановку, чтобы взять первые три "карты" и последние три, чтобы получить текущую итерацию двух чисел, вычесть их и посмотреть, приближен ли результат к цели, чем результаты предыдущих итераций.

Следующее делает это, используя функцию перестановки массива, которую я нашел в этом ответе на другой вопрос. Я не собираюсь объяснять этот алгоритм, потому что вы можете легко выполнить различные алгоритмы перестановок для себя, но я bestPlay() комментарии в свою bestPlay() чтобы объяснить, как обрабатывать перестановки, чтобы выяснить, что является лучшим показателем для руки,

Я не пытался использовать ваш player или player.SetVar(), но, надеюсь, если вы изучите это, вы сможете адаптировать его для использования с вашими объектами.

Вы не сказали, какие ценности могут иметь карты, поэтому я принял колоду из двадцати карт, которая дважды повторяет цифры 0-9.

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, большое спасибо за ваш ответ и объяснение! Это очень ценится и направляет меня в действительно хорошем направлении. Спасибо Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню