On 6 Jan 2008, at 23:54, Denis Hennessy wrote: > On 6 Jan 2008, at 22:40, James Gray wrote: > >> On Jan 6, 2008, at 3:03 PM, Denis Hennessy wrote: >> >>> The understanding I had was that a dealer could 're-value' their >>> hand with each card dealt; that is - if they draw two aces they're >>> obviously 11 and 1 and they have to hit again. If they then draw a >>> card which would cause them to bust, they can treat both aces as 1. >> >> You have all of that right, but Eric was saying you don't properly >> value hands with multiple aces in them. For example, ace, ace, and >> ten should value as 12, not 22. >> >> One way I've handled this in the pass was to sort the hand such >> that aces are at the end, run through building up a total, and >> count an ace as 11 when I passed it if doing so would keep the >> running count less than or equal to 21 minus the cards left to count. >> >> Hope that makes sense. >> >> James Edward Gray II >> > > Actually, I think my code is correct, but I might be snow-blind. > Here's the relevant function. It values all the non-ace cards first > and then values the aces. > > def hand_value(hand) ... original function ... > > end > Gah! There was a bug - it valued aces after other cards but didn't take into account other aces. Here's the corrected function which works similarly to Eric's code (value aces as 11 and later re-value as 1 as needed): def hand_value(hand) value = 0 # First calculate values counting aces as 11 hand.each do |c| if c=='A' value += 11 elsif 'JQK'.include? c value += 10 else value += c.to_i end end # Then re-value aces as 1 as long as hand is bust hand.each do |c| if c=='A' if value>21 value -= 10 end end end value end