我正在创建一个21点评分方法,并试图将Ace移动到数组的末尾,以便最后计数。我该怎么做?因为这不起作用
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] }
同样,如果您有一个实现Comparable
的Card
类,并且有一个<=>
方法来允许像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]
如果Ace存在,index函数将返回其索引。有一个数组方法,用于在返回已删除元素的特定索引处进行删除。然后可以将返回的元素推到数组的后面。所有这些都可以在一行中完成,原谅LoD违规:
hand=["heart","spade","Ace","olive", "branch"]
if hand.include?("Ace")
hand.push(hand.delete_at(hand.index("Ace")))
end
p hand #["heart", "spade", "olive", "branch", "Ace"]
注意:只有第一个"王牌"会被重新定位。