class Battleship::Player

Constants

PLACE_MSG
SHOT_MSG
TIP_MSG
TIP_THRESHOLD

Attributes

enemy[RW]
grid[R]
name[R]
ships[R]

Public Class Methods

factory(name:, grid_class: Grid, output: STDOUT) click to toggle source
# File lib/battleship/player.rb, line 19
def self.factory(name:, grid_class: Grid, output: STDOUT)
  new(name: name, grid: grid_class.factory, output: output) 
end
new(name:, grid:, output: STDOUT) click to toggle source
# File lib/battleship/player.rb, line 26
def initialize(name:, grid:, output: STDOUT)
  @name = name
  @grid = grid
  @misses = 0
  @output = output
  @pos = nil
  @coord = nil
end

Public Instance Methods

setup(ships=[Ship.small, Ship.large]) click to toggle source
# File lib/battleship/player.rb, line 35
def setup(ships=[Ship.small, Ship.large])
  Array(ships).each { |ship| place(ship) }
end
shot(coord_class=Coord) click to toggle source
# File lib/battleship/player.rb, line 39
def shot(coord_class=Coord)
  @output.puts(SHOT_MSG)
  @coord ||= STDIN.gets
  shot = enemy.grid.shot(coord_class.factory(@coord.chomp))
  @output.puts(report(shot))
  @coord = nil
rescue grid.class::PlacingError, coord_class::FactoryError => e
  @output.puts(e.message)
  @coord = nil
  retry
end

Private Instance Methods

place(ship, pos_class=Position) click to toggle source
# File lib/battleship/player.rb, line 68
        def place(ship, pos_class=Position)
  @output.puts(PLACE_MSG.call(ship))
  @pos ||= STDIN.gets
  ship.place(pos_class.factory(@pos.chomp))
  grid << ship
  @pos = nil
rescue grid.class::PlacingError, pos_class::FactoryError  => e
  @output.puts(e.message)
  @pos = nil
  retry
end
report(shot) click to toggle source
# File lib/battleship/player.rb, line 51
        def report(shot)
  return shot unless tip?(shot) 
  coord = enemy.grid.footprint.sample
  TIP_MSG.call(shot, coord)
end
reset!() click to toggle source
# File lib/battleship/player.rb, line 63
        def reset!
  @misses = 0
  false
end
tip?(shot) click to toggle source
# File lib/battleship/player.rb, line 57
        def tip?(shot)
  return reset! unless shot == grid.class::MISS
  @misses += 1
  @misses >= TIP_THRESHOLD
end