battle_boats 0.0.10 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
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