class Model::TileCollection
Attributes
dimensions[R]
Public Class Methods
new(tiles, dimensions)
click to toggle source
# 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
Public Instance Methods
available_tiles()
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 46 def available_tiles @tiles.find_all(&:available?) end
available_tiles?()
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 50 def available_tiles? available_tiles.count.positive? end
clone(tiles = nil)
click to toggle source
# 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)
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 25 def each(&block) @tiles.each(&block) end
equivalents()
click to toggle source
Any given TicTacToe
board has 8 equivalent boards, which are generated by flipping and rotating a board.
# 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)
click to toggle source
# 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
id()
click to toggle source
# 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
rows()
click to toggle source
# 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
Protected Instance Methods
flip()
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 101 def flip tiles = clone_tiles top_row_i = 1 bottom_row_i = dimensions while top_row_i <= (dimensions / 2) (1..dimensions).each do |col_i| flip_tile(top_row_i, bottom_row_i, col_i, tiles) end top_row_i += 1 bottom_row_i -= 1 end clone(tiles) end
rotate()
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 85 def rotate tiles = clone_tiles rotated = [] rotated_col_i = dimensions (1..dimensions).each do |row_i| (1..dimensions).each do |col_i| rotate_tile(row_i, col_i, rotated_col_i, rotated, tiles) end rotated_col_i -= 1 end clone(rotated) end
Private Instance Methods
clone_tiles()
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 145 def clone_tiles @tiles.map(&:clone) end
col_index(index)
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 160 def col_index(index) (index % dimensions) + 1 end
flip_tile(top_row_i, bottom_row_i, col_i, tiles)
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 121 def flip_tile(top_row_i, bottom_row_i, col_i, tiles) top_i = index(top_row_i, col_i) bottom_i = index(bottom_row_i, col_i) top = tiles[top_i] bottom = tiles[bottom_i] top.row = bottom_row_i bottom.row = top_row_i tiles[top_i] = bottom tiles[bottom_i] = top end
index(row, col)
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 149 def index(row, col) r = row - 1 c = col - 1 dimensions * r + c end
rotate_tile(row_i, col_i, rotated_col_i, rotated, tiles)
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 134 def rotate_tile(row_i, col_i, rotated_col_i, rotated, tiles) tile_i = index(row_i, col_i) rotated_tile_i = index(col_i, rotated_col_i) tile = tiles[tile_i] tile.row = col_i tile.col = rotated_col_i rotated[rotated_tile_i] = tile end
row_index(index)
click to toggle source
# File lib/tic_tac_toe/model/tile_collection.rb, line 156 def row_index(index) (index / dimensions) + 1 end