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