Name
Author
Password (must match the one you created with when editing)
Code worksheet = Array.new(8) {|x| {:score => 0, :free => []}} me = turn matrix = move_matrix worksheet_pos = 0 # check columns 0.upto(2) do |x| 0.upto(2) do |y| v = matrix[x][y] worksheet[worksheet_pos][:score] += (v == me ? -1 : v != "" ? 1 : (worksheet[worksheet_pos][:free] << [x,y]) && 0) end worksheet_pos += 1 end # check rows 0.upto(2) do |y| 0.upto(2) do |x| v = matrix[x][y] worksheet[worksheet_pos][:score] += (v == me ? -1 : v != "" ? 1 : (worksheet[worksheet_pos][:free] << [x,y]) && 0) end worksheet_pos += 1 end # check diagonals 0.upto(2) do |n| v = matrix[n][n] worksheet[worksheet_pos][:score] += (v == me ? -1 : v != "" ? 1 : (worksheet[worksheet_pos][:free] << [n,n]) && 0) end worksheet_pos += 1 0.upto(2) do |n| v = matrix[n][2-n] worksheet[worksheet_pos][:score] += (v == me ? -1 : v != "" ? 1 : (worksheet[worksheet_pos][:free] << [n,2-n]) && 0) end # analyze if (rows = worksheet.find_all {|row| row[:score] == -2}).any? # -2 means I have a winning move move = rows.first[:free].first log_info("found winning move: #{move.inspect}") elsif (rows = worksheet.find_all {|row| row[:score] == 2}).any? # 2 means I can block an opponent's winning move move = rows.first[:free].first log_info("blocked winning move: #{move.inspect}") elsif (rows = worksheet.find_all {|row| row[:score] == -1 && row[:free].any?}).any? # -1 means either there are no open moves, or I have two moves on a row I already have piece on move = rows[rand(rows.size)][:free].first log_info("playing move on my row: #{move.inspect}") elsif (rows = worksheet.find_all {|row| row[:score] == 1 && row[:free].any?}).any? # 1 means either there is either no open moves, or my opponent has one piece move = rows[rand(rows.size)][:free].first log_info("playing move in opponent's row: #{move.inspect}") elsif (rows = worksheet.find_all {|row| row[:score] == 0 && row[:free].size == 3}).any? # 0 means either there is one open move on a row where we both have pieces, or it's an empty row move = rows[rand(rows.size)][:free].first log_info("playing move on empty row: #{move.inspect}") else # must be a 0, but on a row were we both have pieces; our least desireable move, but our only one rows = worksheet.find_all {|row| row[:score] == 0} move = rows.first[:free].first log_info("playing only move on crowded row: #{move.inspect}") end make_move!(move[0],move[1]) Use Codepress Syntax Highlighting
API Your code runs in the context of the "Board", when the game system requires that your algorithm make a move. The following methods are available: moves() - returns an array of MoveWrapper objects which have the methods (x_pos, y_pos, is_x?) make_move!(x,y) - make a move. This must be called exactly once. move_matrix() - returns a matrix of the board moves like so [["x","",""],["o","","o"],["x","x",""]] turn() - returns either "x" or "o" depending on whose turn it is (it is always your turn) log_info(message), log_error(message) - display logging information in the board history
moves()
make_move!(x,y)
move_matrix()
turn()
log_info(message), log_error(message)