Class: Minimax

Inherits:
Player show all
Defined in:
lib/nick_tac_toe/minimax.rb

Instance Attribute Summary

Attributes inherited from Player

#team

Instance Method Summary collapse

Methods inherited from Player

#initialize

Constructor Details

This class inherits a constructor from Player

Instance Method Details

#computer?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/nick_tac_toe/minimax.rb', line 45

def computer?
  true
end

#get_max_move(board) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/nick_tac_toe/minimax.rb', line 7

def get_max_move(board)
  current_max_move = Move.new(0, -1)
  board.remaining_moves.each do |remaining_move|
    new_board = board.copy
    new_board.set_cell(remaining_move, team)
    return Move.new(remaining_move, 1) if player_won?(team, new_board)
    return Move.new(remaining_move, 0) if new_board.cells.all? { |cell| cell == new_board.player_one || cell == new_board.player_two }
    return Move.new(remaining_move, -1) if player_won?(new_board.opponent_for(team), new_board)
    new_rating = get_min_move(new_board).rating
    if new_rating > current_max_move.rating
      current_max_move = Move.new(remaining_move, new_rating)
    end
  end
  return current_max_move
end

#get_min_move(board) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/nick_tac_toe/minimax.rb', line 23

def get_min_move(board)
  current_min_move = Move.new(0, 1)
  board.remaining_moves.each do |remaining_move|
    new_board = board.copy
    new_board.set_cell(remaining_move, new_board.opponent_for(team));
    return Move.new(current_min_move.position, 1) if player_won?(team, new_board)
    return Move.new(current_min_move.position, 0) if new_board.cells.all? { |cell| cell == new_board.player_one || cell == new_board.player_two }
    return Move.new(current_min_move.position, -1) if player_won?(new_board.opponent_for(team), new_board)
    new_rating = get_max_move(new_board).rating
    if new_rating < current_min_move.rating
      current_min_move = Move.new(remaining_move, new_rating)
    end
  end
  return current_min_move
end

#move_for(board) ⇒ Object



2
3
4
# File 'lib/nick_tac_toe/minimax.rb', line 2

def move_for(board)
  get_max_move(board).position
end

#player_won?(team, board) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
# File 'lib/nick_tac_toe/minimax.rb', line 39

def player_won?(team, board)
  return true if board.rows.any? { |row| row == [team]*3 }
  return true if board.columns.any? { |column| column == [team]*3 }
  return true if board.diagonals.any? { |diagonal| diagonal == [team]*3 }
end