arrays - 将特定值移动到随机填充数组的末尾

标签 arrays ruby blackjack

我正在创建一个二十一点计分方法,并且我正在尝试将 A 移动到数组的末尾,以便将其算在最后。我该怎么做?因为这不起作用

if hand.include?("Ace") 
  hand.map{ |card| hand.last(card) if card == "Ace" }
end

最佳答案

有两种方法有效。一种是将它们排序到最后:

hand = %w[ 2 9 4 Q 3 2 A T J 6 ]

hand.sort_by { |v| v == 'A' ? 1 : 0 }
# => ["6", "9", "4", "Q", "3", "2", "2", "T", "J", "A"]

另一个是 partition ,如下所示:

hand.partition { |v| v != 'A' }.flatten
# => ["2", "9", "4", "Q", "3", "2", "T", "J", "6", "A"]

如果你有一个正确的 Card 类,它实现了类似 ace? 的东西,那么这就更容易了:

hand.partition(&:ace?).reverse.flatten

您还可以将 A 排序为 11,这样它就会排在最后,如下所示:

CARD_SORT_VALUE = Hash.new { |h,k| h[k] = k.to_i }.merge(
  'J' => 10,
  'Q' => 10,
  'K' => 10,
  'A' => 11
).freeze

您可以在哪里使用它进行排序,例如:

hand.sort_by { |c| CARD_SORT_VALUE[c] }

同样,如果您有一个实现 Card Comparable 类,并且有一个 <=> 方法来允许排序,就像在 cards.sort 中一样,那就更好了。

如果您想解决“这只手有什么值”的一般问题,请考虑将值定义为数组,如下所示:

CARD_VALUE = {
  '2' => [ 2 ],
  '3' => [ 3 ],
  '4' => [ 4 ],
  '5' => [ 5 ],
  '6' => [ 6 ],
  '7' => [ 7 ],
  '8' => [ 8 ],
  '9' => [ 9 ],
  'T' => [ 10 ],
  'J' => [ 10 ],
  'Q' => [ 10 ],
  'K' => [ 10 ],
  'A' => [ 1, 11 ]
}.freeze

然后您可以在其中处理所有可能的值组合以获得最终结果:

def hand_value(hand)
  hand.map { |c| CARD_VALUE[c] }.inject([ [ ] ]) do |accum, arr|
    accum.flat_map do |a|
      arr.map do |v|
        a + [ v ]
      end
    end
  end.map(&:sum).uniq
end

如:

hand_value(%w[ A T Q ])
# => [21, 31]

hand_value(%w[ A A 2 ])
# => [4, 14, 24]

关于arrays - 将特定值移动到随机填充数组的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63929310/

相关文章:

javascript - 使用 JavaScript 编程 Aces

c - C Blackjack 游戏的 int 数组缺少输出

arrays - VBScript 嵌套类数据结构

ruby - 拆分由子字符串列表分隔的字符串

ruby - 从外部运行 ruby​​ 网站

java - DeckOfCards 和 HighLow Class 不兼容的类型

javascript - 按 parentId javascript 对平面数组进行排序

c++ - 使用其他类对象的数组类

javascript - HTML 中的数组方法

ruby - 在 Ruby 中编写类似 Thor gem 的 DSL?