Class: ComputerSmart

Inherits:
Object
  • Object
show all
Defined in:
lib/computer_smart.rb

Constant Summary collapse

OPPONENT =
{"O"=>"X", "X"=>"O"}
COLUMNS_SYM =
[:A, :B, :C, :D, :E, :F, :G]
WEIGHTED_RANDOM =
[:A, :A, :B, :B, :C, :C, :C, :C, :D, :D, :D, :E, :E, :E, :E, :F, :F, :G, :G]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type = "X") ⇒ ComputerSmart

default needs to be removed eventually



4
5
6
7
8
9
10
# File 'lib/computer_smart.rb', line 4

def initialize(type = "X") #default needs to be removed eventually
  @type = OPPONENT[type]
  @enemy = type
  @main_connected_tokens = 0
  @placement_column = nil
  @blocking = false
end

Instance Attribute Details

#enemyObject (readonly)

Returns the value of attribute enemy.



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

def enemy
  @enemy
end

#main_connected_tokensObject (readonly)

Returns the value of attribute main_connected_tokens.



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

def main_connected_tokens
  @main_connected_tokens
end

#placement_columnObject (readonly)

Returns the value of attribute placement_column.



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

def placement_column
  @placement_column
end

#typeObject (readonly)

Returns the value of attribute type.



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

def type
  @type
end

Instance Method Details

#compass_tester(column_number, board, array_number_num, item_number_num, type_checker, block) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/computer_smart.rb', line 39

def compass_tester(column_number, board, array_number_num, item_number_num, type_checker, block)
  connected_tokens = 0
  array_number = column_number 
  item_number = find_empty(column_number, board)
  rev_array_number = column_number 
  rev_item_number = find_empty(column_number, board)
  loop do
    array_number += array_number_num
    item_number += item_number_num
    break if array_number > 6 || array_number < 0
    break if item_number > 5 || item_number < 0
    break if board.play_area[COLUMNS_SYM[array_number]][item_number].type == "."
    break if board.play_area[COLUMNS_SYM[array_number]][item_number].type == type_checker
    connected_tokens += 1
  end
  loop do
    rev_array_number += array_number_num * -1
    rev_item_number += item_number_num * -1
    break if rev_array_number > 6 || rev_array_number < 0
    break if rev_item_number > 5 || rev_item_number < 0
    break if board.play_area[COLUMNS_SYM[rev_array_number]][rev_item_number].type == "."
    break if board.play_area[COLUMNS_SYM[rev_array_number]][rev_item_number].type == type_checker
    connected_tokens += 1
  end
  if connected_tokens > @main_connected_tokens && find_empty(column_number, board) < 6
    @main_connected_tokens = connected_tokens 
    @placement_column = column_number
    @blocking = block
  end
end

#find_empty(column_number, board) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/computer_smart.rb', line 70

def find_empty(column_number, board)
  vertical_position = 5
  previous = 6
  loop do
    if board.play_area[COLUMNS_SYM[column_number]][vertical_position].type == "."
      return previous = vertical_position
    end
    vertical_position -= 1
    break if vertical_position <= -1
  end
  previous
end

#place_piece(board) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/computer_smart.rb', line 16

def place_piece(board)
  @main_connected_tokens = 0
  tester(board, @enemy, false)
  tester(board, @type, true)
  case @main_connected_tokens
  when 2..6
    board.place_piece(COLUMNS_SYM[@placement_column], @type)
  else
    board.place_piece(WEIGHTED_RANDOM[rand(0..18)], @type)
  end
end

#tester(board, type_checker, blocking) ⇒ Object

Private



30
31
32
33
34
35
36
37
# File 'lib/computer_smart.rb', line 30

def tester(board, type_checker, blocking)
  [*0..6].each do |column_number| 
    compass_tester(column_number, board, 1, -1, type_checker, blocking) #checks positive diagonal
    compass_tester(column_number, board, -1, -1, type_checker, blocking) #checks negative diagonal
    compass_tester(column_number, board, 1, 0, type_checker, blocking) #checks horizontal
    compass_tester(column_number, board, 0, -1, type_checker, blocking) #checks vertical
  end
end