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