battle_boats 0.0.10 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 574f4f3e02b7c5cef9b75a07705a746a0c054b2a
4
- data.tar.gz: 930c4d8fe11f4251f423217a29cfe138b74535a1
3
+ metadata.gz: c234594bcdb65723e19dd4386b5fc3fff1a12e11
4
+ data.tar.gz: 831459a8cbe3467c52984597f7242bb9048ea008
5
5
  SHA512:
6
- metadata.gz: ff190ee5734297fa9e2de51622790f60faf30340efd252e300353797917b92839bf58f5b8ec88dacd5db19988590bd73dad66c2404a94e3cca2b94ef60fca47c
7
- data.tar.gz: 38015890c606111c547c2e8d68add8eb856c72169184e72f9a7d361f721546a061988ead35707aa3fa96d72aad16c28e5443b337f07a59936cf032f302cb35e4
6
+ metadata.gz: 0a809442d9468226c1bbe15ce3463a2c4c59336a2105c2c00dc70851c952cfda7fe36acd897fcf859b76d6d65349b21a0dc08f5cfca917f06728a7b1fb114493
7
+ data.tar.gz: ef473db7cb3250ea218cc03c4f33cd25655816d8c47d4595d96dd3a36c9f0575e44ef241506ba91ac3a976cf6c5df6a4a24e5360f9c35fad046b166f5ea3b92d
@@ -1,3 +1,7 @@
1
+ # 0.0.20
2
+ ### Breaking Change
3
+ - `battle_boats "dev"` is not longer available
4
+
1
5
  # 0.0.10
2
6
  ### New Features
3
7
  - `battle_boats "dev"` will play in developer mode
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- battle_boats (0.0.10)
4
+ battle_boats (0.0.20)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -2,17 +2,10 @@
2
2
 
3
3
  require 'battle_boats/engine'
4
4
  require 'battle_boats/board'
5
- require 'battle_boats/dev_console_ui'
6
5
 
7
6
  board = BattleBoats::Board.new
8
7
  board.place_ships_randomly
9
8
 
10
- if ARGV[0] == "dev"
11
- interface = BattleBoats::DevConsoleUI.new
12
- else
13
- interface = BattleBoats::ConsoleUI.new
14
- end
15
-
16
- engine = BattleBoats::Engine.new(board: board, interface: interface)
9
+ engine = BattleBoats::Engine.new(board: board)
17
10
  engine.start
18
11
 
@@ -1,8 +1,11 @@
1
- require "battle_boats/version"
2
- require "battle_boats/engine"
3
- require "battle_boats/console_ui"
4
1
  require "battle_boats/board"
5
-
6
- module BattleBoats
7
- # Your code goes here...
8
- end
2
+ require "battle_boats/board_formatter"
3
+ require "battle_boats/cell"
4
+ require "battle_boats/colorize"
5
+ require "battle_boats/console_ui"
6
+ require "battle_boats/coordinate"
7
+ require "battle_boats/engine"
8
+ require "battle_boats/fleet"
9
+ require "battle_boats/null_ship"
10
+ require "battle_boats/ship"
11
+ require "battle_boats/version"
@@ -13,13 +13,33 @@ module BattleBoats
13
13
 
14
14
  def place_ships_randomly
15
15
  @fleet.ships.each do |ship|
16
- coin_flip = ["heads", "tails"].sample
17
- if coin_flip == "heads"
18
- until place_ship_horizontally(coordinate: get_random_coordinate, ship: ship)
19
- end
16
+ until ship_deployed?(ship: ship)
17
+ coordinate = get_random_coordinate
18
+ orientation = %i[horizontal vertical].sample
19
+ attempt_to_deploy_ship(ship: ship, coordinate: coordinate, orientation: orientation)
20
+ end
21
+ end
22
+ end
23
+
24
+ def ship_deployed?(ship:)
25
+ play_area.flatten.map(&:occupant).include?(ship)
26
+ end
27
+
28
+ def attempt_to_deploy_ship(ship:, coordinate:, orientation:)
29
+ cells = Array.new(ship.length) do |offset|
30
+ if orientation == :horizontal
31
+ next_coordinate = coordinate.right(offset: offset)
32
+ elsif orientation == :vertical
33
+ next_coordinate = coordinate.up(offset: offset)
20
34
  else
21
- until place_ship_vertically(coordinate: get_random_coordinate, ship: ship)
22
- end
35
+ return nil
36
+ end
37
+ cell_at(coordinate: next_coordinate)
38
+ end
39
+
40
+ if cells_occupiable?(cells: cells)
41
+ cells.each do |cell|
42
+ cell.occupant = ship
23
43
  end
24
44
  end
25
45
  end
@@ -46,22 +66,6 @@ module BattleBoats
46
66
  end
47
67
  end
48
68
 
49
- def place_ship_horizontally(coordinate:, ship:)
50
- cells_to_occupy = Array.new(ship.length) do |offset|
51
- cell_at(coordinate: coordinate.right(offset: offset))
52
- end
53
-
54
- occupy_cells(cells: cells_to_occupy, ship: ship)
55
- end
56
-
57
- def place_ship_vertically(coordinate:, ship:)
58
- cells_to_occupy = Array.new(ship.length) do |offset|
59
- cell_at(coordinate: coordinate.up(offset: offset))
60
- end
61
-
62
- occupy_cells(cells: cells_to_occupy, ship: ship)
63
- end
64
-
65
69
  private
66
70
 
67
71
  def create_play_area
@@ -74,22 +78,12 @@ module BattleBoats
74
78
  end
75
79
  end
76
80
 
77
- def within_range?(coordinate:)
78
- coordinate.row.between?(0, 9) && coordinate.column.between?(0, 9)
79
- end
80
-
81
- def occupy_cells(cells:, ship:)
82
- if cells_are_occupiable(cells: cells)
83
- cells.each do |cell|
84
- cell.occupant = ship
85
- end
86
- else
87
- false
88
- end
81
+ def cells_occupiable?(cells:)
82
+ cells.none?(&:nil?) && cells.none?(&:occupied?)
89
83
  end
90
84
 
91
- def cells_are_occupiable(cells:)
92
- cells.none?(&:nil?) && cells.none?(&:occupied?)
85
+ def within_range?(coordinate:)
86
+ coordinate.row.between?(0, 9) && coordinate.column.between?(0, 9)
93
87
  end
94
88
 
95
89
  def get_random_coordinate
@@ -0,0 +1,77 @@
1
+ require_relative "colorize"
2
+
3
+ module BattleBoats
4
+ class BoardFormatter
5
+ using Colorize
6
+ def format_board(board, hide_ships: true)
7
+ board_string = horizontal_line
8
+ board_string << newline
9
+ board_string << column_header
10
+ board_string << horizontal_line
11
+ board_string << newline
12
+ board.play_area.each_with_index do |row, row_number|
13
+ board_string << pipe
14
+ board_string << " #{row_labels[row_number]} "
15
+ board_string << pipe
16
+ row.each do |cell|
17
+ board_string << if cell.occupied? && cell.hit?
18
+ " #{cell.occupant.symbol.red} "
19
+ elsif cell.occupied? && !hide_ships
20
+ " #{cell.occupant.symbol.yellow} "
21
+ elsif cell.hit?
22
+ " #{'X'.yellow} "
23
+ else
24
+ " #{'~'.blue} "
25
+ end
26
+ board_string << pipe
27
+ end
28
+ board_string << newline
29
+ board_string << horizontal_line
30
+ board_string << newline
31
+ end
32
+ board_string
33
+ end
34
+
35
+ def valid_coordinate_input?(input)
36
+ input =~ /^[A-J][0-9]$/i
37
+ end
38
+
39
+ def input_to_coordinate(input)
40
+ input_row = input[0]
41
+ input_column = input[1]
42
+ row = row_label_to_row_number(input_row)
43
+ column = column_label_to_column_number(input_column)
44
+ BattleBoats::Coordinate.new(row: row, column: column)
45
+ end
46
+
47
+ def row_label_to_row_number(row_label)
48
+ row_labels.index(row_label.upcase)
49
+ end
50
+
51
+ def column_label_to_column_number(column_label)
52
+ column_label.to_i
53
+ end
54
+
55
+ private
56
+
57
+ def column_header
58
+ "| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |\n"
59
+ end
60
+
61
+ def row_labels
62
+ ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
63
+ end
64
+
65
+ def newline
66
+ "\n"
67
+ end
68
+
69
+ def horizontal_line
70
+ "-" * 67
71
+ end
72
+
73
+ def pipe
74
+ "|"
75
+ end
76
+ end
77
+ end
@@ -1,8 +1,6 @@
1
1
  require_relative "null_ship"
2
- require_relative "colorize"
3
2
 
4
3
  module BattleBoats
5
- using Colorize
6
4
  class Cell
7
5
  attr_accessor :occupant
8
6
 
@@ -22,14 +20,6 @@ module BattleBoats
22
20
  end
23
21
  end
24
22
 
25
- def to_s
26
- if hit?
27
- occupant.to_ansi
28
- else
29
- to_ansi
30
- end
31
- end
32
-
33
23
  def status_report
34
24
  occupant_name = occupant.name
35
25
  if occupant.sunk?
@@ -42,11 +32,5 @@ module BattleBoats
42
32
  def occupied?
43
33
  !occupant.empty?
44
34
  end
45
-
46
- private
47
-
48
- def to_ansi
49
- "~".blue
50
- end
51
35
  end
52
36
  end
@@ -1,10 +1,14 @@
1
1
  require_relative "coordinate"
2
+ require_relative "board_formatter"
2
3
 
3
4
  module BattleBoats
4
5
  class ConsoleUI
5
- def initialize(output: $stdout, input: $stdin)
6
+ def initialize(output: $stdout,
7
+ input: $stdin,
8
+ board_formatter: BattleBoats::BoardFormatter.new)
6
9
  @output = output
7
10
  @input = input
11
+ @board_formatter = board_formatter
8
12
  end
9
13
 
10
14
  def greet
@@ -12,17 +16,36 @@ module BattleBoats
12
16
  end
13
17
 
14
18
  def display_board(board)
15
- output.puts format_board(board)
19
+ output.puts board_formatter.format_board(board, hide_ships: true)
20
+ end
21
+
22
+ def display_ally_board(board)
23
+ output.puts board_formatter.format_board(board, hide_ships: false)
24
+ end
25
+
26
+ def display_ship_data(ship:)
27
+ output.puts "SHIP: #{ship.name} ALIAS: #{ship.symbol}"
28
+ output.puts "LENGTH: #{ship.length}"
16
29
  end
17
30
 
18
31
  def get_coordinate
19
32
  output.puts "Target coordinate: "
20
33
  user_input = input.gets.chomp
21
- until valid_input?(user_input)
34
+ until board_formatter.valid_coordinate_input?(user_input)
22
35
  output.puts "Coordinate invalid."
23
36
  user_input = input.gets.chomp
24
37
  end
25
- input_to_coordinate(user_input)
38
+ board_formatter.input_to_coordinate(user_input)
39
+ end
40
+
41
+ def get_orientation
42
+ output.puts "Orientation [hV]:"
43
+ user_input = input.gets.chomp
44
+ until valid_orientation_input?(user_input)
45
+ output.puts "Orientation invalid."
46
+ user_input = input.gets.chomp
47
+ end
48
+ input_to_orientation(user_input)
26
49
  end
27
50
 
28
51
  def display_status_report(status_report)
@@ -35,59 +58,18 @@ module BattleBoats
35
58
 
36
59
  private
37
60
 
38
- attr_reader :output, :input
39
-
40
- def valid_input?(coordinate)
41
- coordinate =~ /^[A-J][0-9]$/i
42
- end
61
+ attr_reader :output, :input, :board_formatter
43
62
 
44
- def input_to_coordinate(input)
45
- input_row = input[0]
46
- input_column = input[1]
47
- row = row_labels.index(input_row.upcase)
48
- column = input_column.to_i
49
- BattleBoats::Coordinate.new(row: row, column: column)
63
+ def valid_orientation_input?(orientation)
64
+ orientation =~ /^[h{1}|v{1}]$/i
50
65
  end
51
66
 
52
- def format_board(board)
53
- board_string = horizontal_line
54
- board_string << newline
55
- board_string << column_label
56
- board_string << horizontal_line
57
- board_string << newline
58
- board.play_area.each_with_index do |row, row_number|
59
- board_string << pipe
60
- board_string << " #{row_labels[row_number]} "
61
- board_string << pipe
62
- row.each do |cell|
63
- board_string << " #{cell} "
64
- board_string << pipe
65
- end
66
- board_string << newline
67
- board_string << horizontal_line
68
- board_string << newline
67
+ def input_to_orientation(input)
68
+ if input =~ /^[h{1}]$/i
69
+ :horizontal
70
+ elsif input =~ /^[v{1}]$/i
71
+ :vertical
69
72
  end
70
- board_string
71
- end
72
-
73
- def column_label
74
- "| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |\n"
75
- end
76
-
77
- def row_labels
78
- ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
79
- end
80
-
81
- def newline
82
- "\n"
83
- end
84
-
85
- def horizontal_line
86
- "-" * 67
87
- end
88
-
89
- def pipe
90
- "|"
91
73
  end
92
74
  end
93
75
  end
@@ -1,7 +1,4 @@
1
- require_relative "colorize"
2
-
3
1
  module BattleBoats
4
- using Colorize
5
2
  class NullShip
6
3
  attr_reader :name, :length, :symbol
7
4
 
@@ -15,10 +12,6 @@ module BattleBoats
15
12
  true
16
13
  end
17
14
 
18
- def to_ansi
19
- @symbol.yellow
20
- end
21
-
22
15
  def hit; end
23
16
 
24
17
  def sunk?; end
@@ -1,7 +1,4 @@
1
- require_relative "colorize"
2
-
3
1
  module BattleBoats
4
- using Colorize
5
2
  class Ship
6
3
  attr_reader :name, :length, :symbol
7
4
 
@@ -16,10 +13,6 @@ module BattleBoats
16
13
  false
17
14
  end
18
15
 
19
- def to_ansi
20
- @symbol.red
21
- end
22
-
23
16
  def hit
24
17
  @hits += 1
25
18
  end
@@ -1,3 +1,3 @@
1
1
  module BattleBoats
2
- VERSION = "0.0.10".freeze
2
+ VERSION = "0.0.20".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: battle_boats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Countz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-25 00:00:00.000000000 Z
11
+ date: 2018-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -107,11 +107,11 @@ files:
107
107
  - bin/setup
108
108
  - lib/battle_boats.rb
109
109
  - lib/battle_boats/board.rb
110
+ - lib/battle_boats/board_formatter.rb
110
111
  - lib/battle_boats/cell.rb
111
112
  - lib/battle_boats/colorize.rb
112
113
  - lib/battle_boats/console_ui.rb
113
114
  - lib/battle_boats/coordinate.rb
114
- - lib/battle_boats/dev_console_ui.rb
115
115
  - lib/battle_boats/engine.rb
116
116
  - lib/battle_boats/fleet.rb
117
117
  - lib/battle_boats/null_ship.rb
@@ -1,35 +0,0 @@
1
- require_relative "console_ui"
2
- require_relative "coordinate"
3
- require_relative "colorize"
4
-
5
- module BattleBoats
6
- class DevConsoleUI < ConsoleUI
7
- using Colorize
8
- def format_board(board)
9
- board_string = horizontal_line
10
- board_string << newline
11
- board_string << column_label
12
- board_string << horizontal_line
13
- board_string << newline
14
- board.play_area.each_with_index do |row, row_number|
15
- board_string << pipe
16
- board_string << " #{row_labels[row_number]} "
17
- board_string << pipe
18
- row.each do |cell|
19
- board_string << if cell.hit?
20
- " #{cell.occupant.symbol.red} "
21
- elsif cell.occupied?
22
- " #{cell.occupant.symbol.yellow} "
23
- else
24
- " #{cell.occupant.symbol.blue} "
25
- end
26
- board_string << pipe
27
- end
28
- board_string << newline
29
- board_string << horizontal_line
30
- board_string << newline
31
- end
32
- board_string
33
- end
34
- end
35
- end