Class: Model::TileCollection

Inherits:
Object
  • Object
show all
Defined in:
lib/tic_tac_toe/model/tile_collection.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tiles, dimensions) ⇒ TileCollection

Returns a new instance of TileCollection.

Raises:

  • (ArgumentError)


6
7
8
9
10
11
12
13
14
15
16
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 6

def initialize(tiles, dimensions)
  raise ArgumentError, 'empty tiles array' if tiles.empty?
  raise ArgumentError, 'dimensions do not match tiles length' if tiles.length != dimensions**2

  @dimensions = dimensions

  @tiles = tiles.each_with_index do |tile, i|
    tile.col = col_index(i)
    tile.row = row_index(i)
  end
end

Instance Attribute Details

#dimensionsObject (readonly)

Returns the value of attribute dimensions.



4
5
6
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 4

def dimensions
  @dimensions
end

Instance Method Details

#available_tilesObject



46
47
48
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 46

def available_tiles
  @tiles.find_all(&:available?)
end

#available_tiles?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 50

def available_tiles?
  available_tiles.count.positive?
end

#clone(tiles = nil) ⇒ Object



77
78
79
80
81
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 77

def clone(tiles = nil)
  tiles ||= clone_tiles

  self.class.new(tiles, dimensions)
end

#each(&block) ⇒ Object



25
26
27
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 25

def each(&block)
  @tiles.each(&block)
end

#equivalentsObject

Any given TicTacToe board has 8 equivalent boards, which are generated by flipping and rotating a board.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 59

def equivalents
  next_tile_collections = []

  i = 4
  next_tc = self

  while i.positive?
    rotated = next_tc.rotate
    next_tile_collections << rotated
    next_tile_collections << rotated.flip

    next_tc = rotated
    i -= 1
  end

  next_tile_collections
end

#find_tile(row, col) ⇒ Object



54
55
56
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 54

def find_tile(row, col)
  @tiles[index(row.to_i, col.to_i)]
end

#idObject



18
19
20
21
22
23
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 18

def id
  @tiles.each_with_object('') do |tile, str|
    str << tile.piece_name
    str
  end
end

#rowsObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/tic_tac_toe/model/tile_collection.rb', line 29

def rows
  return @rows unless @rows.nil?

  i = 0
  @rows = []

  while i < @tiles.count
    j = i + 3

    @rows << @tiles[i...j]

    i = j
  end

  @rows
end