class SeaBattle::RandomShip

It’s random positions for new ship

Public Class Methods

new(board, length = 1) click to toggle source
# File lib/sea_battle/random_ship.rb, line 10
def initialize(board, length = 1)
  @board = board.board
  @length = length
  @horizontal = board.horizontal
  @vertical = board.vertical
end

Public Instance Methods

add_ship() click to toggle source

Add new Ship on board

# File lib/sea_battle/random_ship.rb, line 18
def add_ship
  if Random.rand(2) == 0
    return if add_ship_of(:vertical)
    return if add_ship_of(:horizontal)
  else
    return if add_ship_of(:horizontal)
    return if add_ship_of(:vertical)
  end
end
add_ship_of(direct) click to toggle source
# File lib/sea_battle/random_ship.rb, line 55
def add_ship_of(direct)
  mixed_board_positions.each do |row, column|
    next if direct.eql?(:vertical) and row + @length - 1 >= @vertical
    next if direct.eql?(:horizontal) and column + @length - 1 >= @horizontal

    if is_area_empty?(row, column, direct)
      positions = ship_positions(row, column, direct)
      positions.map do |row, column|
        @board[row][column].add_ship
      end
      return positions
    end
  end
  nil
end
area_ship_positions(row, column, direct) click to toggle source
# File lib/sea_battle/random_ship.rb, line 41
def area_ship_positions(row, column, direct)
  result = []
  first_row = row - 1
  first_column = column - 1

  last_row, last_column = row + 1, column + 1
  last_row += @length - 1 if direct.eql?(:vertical)
  last_column += @length - 1 if direct.eql?(:horizontal)

  vertical_range = (first_row..last_row).to_a & (0...@vertical).to_a
  horizontal_range = (first_column..last_column).to_a & (0...@horizontal).to_a
  vertical_range.product(horizontal_range)
end
is_area_empty?(row, column, direct) click to toggle source
# File lib/sea_battle/random_ship.rb, line 71
def is_area_empty?(row, column, direct)
  area_ship_positions(row, column, direct).each do |row_index, column_index|
    return false if @board[row_index][column_index].is_in_ship?
  end
  true
end
ship_positions(row, column, direct) click to toggle source
# File lib/sea_battle/random_ship.rb, line 28
def ship_positions(row, column, direct)
  result = []

  @length.times do |offset|
    if direct.eql?(:vertical)
      result << [row + offset, column] if row + offset < @vertical
    else
      result << [row, column + offset] if column + offset < @horizontal
    end
  end
  result
end