From: Robert Boone Date: 2005-10-12T05:27:16+09:00 Subject: Learning ruby by make a simple game... --=-0QjTykESxBTBvTz8ZNbf Content-Type: text/plain Content-Transfer-Encoding: 7bit Hello, I'm trying to learn ruby so I am making a tic tac toe game. It is based on the example the pugs example directory. I'm looking for advice on how to make the script more ruby like. Thanks, Robert --=-0QjTykESxBTBvTz8ZNbf Content-Disposition: attachment; filename=tic-tac-toe.rb Content-Type: application/x-ruby; name=tic-tac-toe.rb Content-Transfer-Encoding: 7bit #!/usr/bin/ruby # Add the ability to more than one object # out of a collection class Array def pick(num) (0...self.length).step(num) do |i| yield self[i...i+num] end end end # Print Tic Tac Toe board def print_board(b) puts "+---+---+---+" b.pick(3) do |x,y,z| puts "| #{x} | #{y} | #{z} |" puts "+---+---+---+" end end # Test if there is a winner on the board def winner?(game_board) winning_set = [[ 0, 1, 2 ],[ 3, 4, 5 ],[ 6, 7, 8 ],[ 0, 3, 6 ], [ 1, 4, 7 ],[ 2, 5, 8 ],[ 0, 4, 8 ],[ 2, 4, 6 ]] winning_set.each do |x| test_set = game_board.values_at(x[0],x[1],x[2]) raise "has won!" if (test_set == %w{X X X} || test_set == %w{O O O}) end end # Build game board and fill it with . board = [] 9.times do |x| board << '.' end player = 'X' choice = '' used = [] print_board board puts "Pick a number 1-9." while board.any? {|square| square == '.' } print "#{player}'s turn> " choice = gets.chomp exit if choice =~ /[Qq](?:uit)?/ if used.any? {|number| number == choice.to_i} puts "Number #{choice} has been used!" next elsif not (1..9).include?(choice.to_i) puts "Out of range." next end used << choice.to_i board[choice.to_i-1] = player print_board board begin winner?(board) rescue => e puts "#{player} #{e}" exit end player = (player == 'X') ? 'O': 'X' end puts "Cat won the game." --=-0QjTykESxBTBvTz8ZNbf--