所以我最近在做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
答案 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)或2
与10
之间的数字。玩家最初会获得与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的价值都是误导。事实上,二十一点牌的价值严格按规则确定,这很简单:
那就是它。无需弄乱单个卡片值,计算aces或任何其他废话。只需编写一个简单的函数,即可使用上述规则返回手的值。