From: Chris Cacciatore Date: 2009-05-08T03:44:47+09:00 Subject: Re: One Die Game (#203) My AI is simple, but I think it is still pretty playable. -C class Game class Player attr_reader :name def initialize(die,name) @die,@name = die,name end def choose_move(score) gets.to_i end end class AI < Player def choose_move(score) sleep(1) if score < 25 while !@die.legal_move?( (r = rand(6)+1) ) end return r else #simple win return 31-score if @die.legal_move?(31-score) return rand(6)+1 end end end class Die attr_reader :current_side def initialize roll @opposites = [[1,6],[2,5],[3,4]] end def roll @current_side = rand(6)+1 end def legal_move?(side) return false if side == @current_side return false if side > 6 or side < 1 a = [@current_side,side].sort! return !@opposites.include?(a) end def flip(side) if legal_move?(side) @current_side = side 0 else 1 end end private :roll end def initialize print "enter your name: " name = gets.chomp @d = Die.new @bust, @score = 31,0 @players = [AI.new(@d,"the computer"),Player.new(@d,name)] @players = rand(10) < 5 ? @players : @players.reverse puts "#{@players.last.name} rolled the die to #{@d.current_side}\n\n********************" @score += @d.current_side end def update @players.each do |p| puts "current score = #{@score}" while @d.flip(p.choose_move(@score)) == 1 ? true : false puts "invalid move" end puts "#{p.name} flipped the die to #{@d.current_side}\n****************" @score += @d.current_side if @score > @bust puts "#{p.name} lost!" return false end if @score == @bust puts "#{p.name} won!" return false end end return true end def play while update end end private :update end g = Game.new g.play -- Posted via http://www.ruby-forum.com/.