为数组中的类似对象赋值--BlackJack

时间:2018-02-14 00:24:07

标签: ruby blackjack

所以我最近在做BlackJack项目,而且我现在仍然坚持使用Ace值程序。

根据规则,玩家可以假设Ace可以是1或11,如果你有2张牌就可以和平,3张卡有问题。

我有3张卡片,带有2个ace,可以是 - [A,A,9],[A,9,A],[9,A,A]

我如何向红宝石说,其中一个A值应该是11,另一个是1?数组元素是具有value属性的类Card的对象。

更新

我拿了一个答案并对其进行了一些编辑,所以如果我没有得到A和得分超过21,我就得不到零值

def score_array aces, non_aces = current_cards.partition(&:ace?) base_value = non_aces.sum(&:value) + aces.size return base_value unless aces? score_array = Array.new(aces.size + 1) { |high_aces| base_value + 10 * high_aces } ace_value = score_array.select { |score| score <= 21 }.max end

更新2

我使用其中一个评论想法将重构方法分为2行:

def count_score @score = current_cards.sum(&:value) @score += 10 if score < 12 && aces? end

4 个答案:

答案 0 :(得分:0)

使用Aces的哈希值。

cards = [{A: 1}, {A: 11}, 9]

用于存储其他值的简单,键/值对。

答案 1 :(得分:0)

不要说Ace是1或11,因为它并不是真的需要:要说queue.get(True)的值是11,21或31.一个简单的方法,假设[A, A, 9]返回一个布尔值,card.ace?为任何非Ace的整数:

card.value

然后你可以轻松选择不超过21的最高分:

def score(cards)
  aces, non_aces = cards.partition { |card| card.ace? }
  base_value = non_aces.sum { |card| card.value } + aces.size
  return (aces.size + 1).times.map { |high_aces| base_value + 10 * high_aces }
end

答案 2 :(得分:0)

cards为3元素数组,每个元素为:A(对于ace)或210之间的数字。玩家最初会获得与cards的前两个元素相对应的牌。如果其中一张牌是王牌,另一张牌是10,则返回:BLACKJACK并且玩家赢得经销商(除非经销商也有二十一点。注意[:A, 10]胜过[:A, 4, 6][:A, :A, 9])。

如果前两张牌不生成:BLACKJACK,则玩家可以选择使用两张牌(:HOLD)进行拍摄,也可以向庄家请求第三张牌(:HIT )。因此,如果前两张牌不产生二十一点,我就会在计算总得分的方法中添加一个参数hold_or_hit。(对于参数来说Tt可能更有用,因为玩家可以使用这些参数来决定在持有和击中之间。)如果玩家选择&#34;击中&#34;并且三张牌的总和小于21,玩家可以要求另一张&#34;击中&#34;,依此类推。由于问题的措辞,我假设在这里最多可以请求一次点击。

简单地计算三张牌的总和并不是特别有用,所以我会修改返回值以更接近地反映实际游戏。

def outcome(cards, hold_or_hit)
  return 13 if hold_or_hit == :HIT && cards.count(:A) == 3 
  first2 = cards[0,2]
  return :BLACK_JACK if first2 == [:A,10] || first2 == [10,:A]
  total(hold_or_hit == :HOLD ? first2 : cards)
end

def total(arr)
  sum_non_aces = arr.sum { |c| c == :A ? 0 : c }
  sum_non_aces +
  case arr.count(:A)
    when 0
      0
    when 1
      sum_non_aces > 10 ? 1 : 11
    else
      12
    end
  end
end

请注意,在total中,如果arr.count(:A) == 2,则12反映一个王牌11,另一个1

outcome [10, :A,  4], :HOLD  #=> :BLACK_JACK
outcome [ 9, :A,  4], :HOLD  #=> 20
outcome [ 9, :A,  4], :HIT   #=> 14
outcome [:A, :A,  4], :HIT   #=> 16
outcome [:A, :A,  9], :HIT   #=> 21
outcome [:A, :A,  9], :HOLD  #=> 12
outcome [ 7,  9,  6], :HOLD  #=> 16
outcome [ 7,  9,  6], :HIT   #=> 22
outcome [:A, :A, :A], :HIT   #=> 13

答案 3 :(得分:0)

说任何玩家选择参与Aces的价值都是误导。事实上,二十一点牌的价值严格按规则确定,这很简单:

  1. 将A计为一个。周期。
  2. 如果手的总数小于12,并且手中至少包含一个ace,则添加10并标记它&#34; soft&#34;。
  3. 那就是它。无需弄乱单个卡片值,计算aces或任何其他废话。只需编写一个简单的函数,即可使用上述规则返回手的值。