From: Benedikt Huber Date: 2005-01-24T05:15:53+09:00 Subject: Re: [QUIZ] Paper Rock Scissors (#16) I have a similar solution: SYMBOLS = [ :rock, :paper, :scissors ] KILLER = { :rock => :paper, :paper => :scissors, :scissors => :rock } MAXSIZE = 5 class Symbol def +(o) return (self.to_s+o.to_s).to_sym end end class BHAdaptPlayer4 < Player def initialize( opponent ) @stats = Hash.new() @lastmoves = [] end def get_keys keys = [ ] @lastmoves.each do |pair| keys.unshift( keys.empty? ? pair : (keys[0]+pair)) end keys end def choose info = nil get_keys.each do |key| info = @stats[key] break if info end if ! info SYMBOLS[rand(3)] else max = -1 msym = nil info.keys.each do |sym| msym,max = sym,info[sym] if(info[sym] > max) end KILLER[msym] end end # called after each choice you make to give feedback # you = your choice # them = opponent's choice # win_lose_or_draw = :win, :lose or :draw, your result def result( you, them, win_lose_or_draw ) get_keys.each do |key| @stats[key] = create_stat if ! @stats[key] @stats[key][them] += 1 end @lastmoves.unshift(@lastchoice) @lastmoves.pop if @lastmoves.size > MAXSIZE @lastchoice = them+you end def create_stat stat = {} SYMBOLS.each {|sym| stat[sym] = 0 } stat end end