class TicTacToe::Game
Attributes
board[R]
interface[R]
player_marks[R]
players[R]
Public Class Methods
new(parameters)
click to toggle source
# File lib/game.rb, line 9 def initialize(parameters) @player_marks = parameters[:player_marks] || [:x, :o] @board = parameters[:board] || create_default_board @interface = parameters[:interface] || create_default_interface @players = [] end
Public Instance Methods
get_valid_move(player)
click to toggle source
# File lib/game.rb, line 44 def get_valid_move(player) loop do coordinates = player.move(self) if @board.out_of_bounds?(coordinates) || @board.marked?(coordinates) @interface.report_invalid_move(coordinates) else return coordinates end end end
handle_game_over()
click to toggle source
# File lib/game.rb, line 55 def handle_game_over @interface.show_game_board(@board) winning_player_mark = @board.has_winning_line? ? @board.last_mark_made : :none @interface.report_game_over(winning_player_mark) end
handle_one_turn(current_player)
click to toggle source
# File lib/game.rb, line 37 def handle_one_turn(current_player) @interface.show_game_board(@board) coordinates = get_valid_move(current_player) @board = @board.mark_space(current_player.player_mark, coordinates) @interface.report_move(current_player.player_mark, coordinates) end
handle_turns()
click to toggle source
# File lib/game.rb, line 28 def handle_turns catch(:game_over) do @players.cycle do |current_player| handle_one_turn(current_player) throw :game_over if over? end end end
over?()
click to toggle source
# File lib/game.rb, line 61 def over? @board.has_winning_line? || @board.all_marked? end
run()
click to toggle source
# File lib/game.rb, line 16 def run set_up handle_turns handle_game_over end
set_up()
click to toggle source
# File lib/game.rb, line 22 def set_up player_types = @interface.game_setup_interaction(@player_marks) @players = @player_marks.zip(player_types).map { |mark, type| create_player(mark, type) } end
Private Instance Methods
create_default_board()
click to toggle source
# File lib/game.rb, line 67 def create_default_board Board.new(size: 3) end
create_default_interface()
click to toggle source
# File lib/game.rb, line 71 def create_default_interface parameters = { input: $stdin, output: $stdout } CommandLineInterface.new(parameters) end
create_player(mark, type)
click to toggle source
# File lib/game.rb, line 79 def create_player(mark, type) player_parameters = { type: type, game: self, player_mark: mark } PlayerFactory.build(player_parameters) end