My 12-line solution has so far won 100% of the time against every
player I've been able to come up with, even players whose moves are
completely random.  Here it is:

class Cheater < Player
  def initialize opponent
    Object.const_get(opponent).send :define_method, :choose do
      :paper
    end
  end

  def choose
    :scissors
  end
end


# :D

-- 
$stdout.sync = true
"Just another Ruby hacker.".each_byte do |b|
  ('a'..'z').step do|c|print c+"\b";sleep 0.007 end;print b.chr
end; print "\n"