Назначение двух значений одному ключу в объекте

Я пытаюсь создать блэкджек на JavaScript. Я провел большую часть игры, просто пытаясь решить проблему, заключающуюся в том, что туз может быть 1 или 11.

Как лучше всего решить эту проблему?

У меня есть такой объект:

let rank = {
  'A': 1,
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
  '6': 6,
  '7': 7,
  '8': 8,
  '9': 9,
  '10': 10,
  'J': 10,
  'Q': 10,
  'K': 10
};

А это для моих костюмов:

let масть = ['Трефы', 'Бубны', 'Червы', 'Пики'];


person The worm    schedule 09.01.2017    source источник
comment
Эта логика требует особого внимания при определении ранга.   -  person Benjamin Gruenbaum    schedule 10.01.2017
comment
Прочтите Как задать вопрос. Ключевые фразы: Найдите, исследуйте и объясните ... любые трудности, которые помешали вам решить эту проблему самостоятельно.   -  person Heretic Monkey    schedule 10.01.2017
comment
было бы интересно посмотреть, как вы рассчитываете значения, пожалуйста, сделайте скрипку   -  person maioman    schedule 10.01.2017
comment
По дизайну. Разница в том, что сумма раздачи может иметь два значения, если в ней есть хотя бы один туз и одна возможная сумма меньше 11 (никто не набирает 21). Итак, первый вопрос, который нужно задать, - как вы собираетесь обрабатывать руки с двумя значениями? И сначала вам нужно проверить наличие блэкджека. Это необходимо решить, прежде чем продолжить.   -  person traktor    schedule 10.01.2017


Ответы (4)


Вы можете иметь массив (ы) как значения, например:

let rank  = {
  'A': [1, 11],
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
  '6': 6,
  '7': 7,
  '8': 8,
  '9': 9,
  '10': 10,
  'J': 10,
  'Q': 10,
  'K': 10
};

or

let rank  = {
  'A': [1, 11],
  '2': [2],
  '3': [3],
  '4': [4],
  '5': [5],
  '6': [6],
  '7': [7],
  '8': [8],
  '9': [9],
  '10': [10],
  'J': [10],
  'Q': [10],
  'K': [10]
};
person TimeO84    schedule 09.01.2017

Все очень просто. Значение туза - 1 точка. Затем, когда вы оцениваете общую сумму руки, вы применяете следующие правила:

  1. Суммируйте стоимость каждой карты.
  2. Если и только если сумма меньше 12 И в руке хотя бы один туз, добавьте 10.

Вот и все. У него никогда не бывает «выбора», и никогда не более одного. Вы также должны следить за тем, что такая рука «мягкая», потому что это влияет на правила.

Это должно быть сделано в программе «оценки рук». Нет необходимости усложнять оценку каждой карты - мы просто так описываем ее людям, потому что наш мозг не работает. Кроме того, вам действительно не следует использовать строки для представления карт. Используйте числа и конвертируйте в строки только после вывода для людей.

person Lee Daniel Crocker    schedule 10.01.2017
comment
Хорошо, первая часть имеет смысл. Но я не думаю, что использую строки для представления карточек. Я использую ключи как строки, а значения как числа. Это позволяет мне легко выполнять простые вычисления. - person The worm; 11.01.2017
comment
Я не видел всего кода, но мне кажется, что ваш объект карты - это ранг и масть, которые являются строками, и вы смотрите значение, а не сами карты, просто числа, из которых вы вычисляете значение и найдите струны. Я могу ошибаться, но для молодых программистов типично злоупотреблять строками, когда они на самом деле не применяются. - person Lee Daniel Crocker; 11.01.2017
comment
Я запускаю этот код: Object.keys(rank).forEach(function(key) { for (var k=0; k < suit.length; k++){ deck.push({ rankKey: key, rankValue: rank[key], suit: suit[k]}) } });, который дает мне массив объектов с 3 ключами, поэтому у меня есть строки, но также числа там, где это необходимо, я думаю :) - person The worm; 11.01.2017
comment
Да, но вы выполняете поиск хэша внутри цикла, чтобы сложить руку. Я полагаю, что это, вероятно, неизбежно в JavaScript, поскольку у него нет реальных массивов, но на более традиционном языке, что было бы дорого. - person Lee Daniel Crocker; 11.01.2017

Вы можете присвоить rank.A массиву значений, но в какой-то момент вам, вероятно, понадобится написать функцию, которая вычисляет, какое значение возвращать, на основе других карт, которые держит игрок.

Например,

let rank  = {
  'A': [1, 11],
  '2': 2,
  '3': 3,
  '4': 4,
  '5': 5,
  '6': 6,
  '7': 7,
  '8': 8,
  '9': 9,
  '10': 10,
  'J': 10,
  'Q': 10,
  'K': 10
};

function calulateSum(hand) {
  let sum = 0;

  if (hand.some(v => v === rank.A)) { // if hand contains 'rank.A'
    // calculate value of 'A' based on total value
    // of the other cards in the hand
  }

  return sum;
}
person ughitsaaron    schedule 09.01.2017
comment
Было бы очень полезно узнать, почему это было отклонено… - person ughitsaaron; 11.01.2017

person    schedule
comment
Хотя этот код может решить проблему, вы должны добавить к нему объяснение, описывающее, почему и как проблема решена. - person BDL; 10.01.2017