There's nothing like a code review to make you see ways to improve your code...
Based on James description of what #worst_case is doing I realized I
could rewrite it in 2 lines:

>                 def worst_case board
>                         worst = 0
>                         opp_board = board.rotate 7
>                         6.times {|i|
>                                         s = score_for(opp_board, i)
>                                         worst = s if worst < s
>                                 }
>                                 worst
>                 end
>         end
>

> The code above is very similar to the last player we examined.  The main new
> element here is worst_case(), which is just a tool to find the opponent's best
> move (worst for us).

So this function should simply be:
  def worst_case board
    opp_board = board.rotate 7
    score_for(opp_board,best_move(opp_board))
  end


Thanks for runing these always entertaining and educational quizes, James.
-Adam