【问题标题】:Assigning two values to one key in an object将两个值分配给对象中的一个键
【发布时间】:2017-05-24 05:56:18
【问题描述】:

我正在尝试在 JavaScript 中创建二十一点。我完成了大部分游戏,只是试图解决 A 可以是 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
};

这是我的西装:

让西装 = ['俱乐部', '钻石', '红心', '黑桃'];

【问题讨论】:

  • 当你解决排名时,这个逻辑需要特殊情况。
  • 请阅读How to Ask。关键词:“搜索和研究”和“解释......任何阻碍你自己解决的困难”。
  • 看看你是如何计算这些值会很有趣,请做个小提琴
  • 按设计。不同之处在于,如果一手牌中至少有一张 A,那么一手牌的总点数可以有两个值,并且一个可能的总点数低于 11(没有人在 21 上平局)。所以要问的第一个问题是你将如何处理具有两个值的手牌?你需要先检查二十一点。这需要在继续之前解决。

标签: javascript blackjack


【解决方案1】:

您可以将数组作为值,例如:

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
};

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]
};

【讨论】:

    【解决方案2】:
    let rank = {
      'A': {
        yourKey  : 1,
        yourKey2 : 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
    };
    

    【讨论】:

    • 虽然此代码可能会解决问题,但您应该在其中添加说明,说明问题为何/如何解决。
    【解决方案3】:

    这很简单。 Ace 的值为 1,句号。然后,当您评估一手牌的总分时,您将应用以下规则:

    1. 每张卡的总价值。
    2. 当且仅当总点数小于 12 且手中至少有一张 A,加 10。

    就是这样。从来没有任何“选择”,而且永远不会超过一个。您还必须跟踪这样一个事实,即这样的手是“软”的,因为这会影响规​​则。

    这应该在“手部评估”例程中完成。没有必要对每张卡片进行复杂的评估——这就是我们向人类描述它的方式,因为我们的大脑不工作。此外,您真的不应该首先使用字符串来表示卡片。使用数字,并仅在输出给人类时转换为字符串。

    【讨论】:

    • 好的,第一部分是有道理的。但我不认为我使用字符串来表示卡片。我将键用作字符串,将值用作数字。因此,我可以轻松地进行简单的计算..
    • 我没有看到完整的代码,但在我看来你的卡片对象是一个等级和花色,它们是字符串,你查找值,而不是仅仅拥有卡片本身是您计算值并查找字符串的数字。我可能是错的,但是当字符串不真正适用时,过度使用字符串是年轻程序员的典型。
    • 我运行这段代码: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 个键的对象数组,所以我确实有字符串,但在我认为合适的地方也有数字 :)
    • 是的,但是您正在循环内进行哈希查找以增加手牌。我想这在 JavaScript 中可能是不可避免的,因为它没有真正的数组,但在更传统的语言中会很昂贵。
    【解决方案4】:

    您可以将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;
    }
    

    【讨论】:

    • 知道为什么这被否决会非常有帮助......
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2016-06-24
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多