minesweeper-curses 0.1.2 → 0.2.0

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: 64be9ef9dc42505ad9ad3ffb3fcfd36b96764b33
4
- data.tar.gz: 543fecb9214ee82fe7322f912c00bd0a38649dc6
3
+ metadata.gz: fb8abc68f343b643d941f7d2d71ace49e11d4a4a
4
+ data.tar.gz: 765ec1d03544b1e805c805145ccaf38a1102c875
5
5
  SHA512:
6
- metadata.gz: 78a7c34b9471a412186efb69ca487ad817b597208cec909d9cd20bec4cfa4d59649e15f1680d46d432fd1229930bcfdf7cfaa276348591698705353807b89280
7
- data.tar.gz: 4f84c02f4a405d629f0b6e3aeec7b7cafac85a99a249b804e3e2d84ac1268ac0eee7cd9435c6696e245ed8eecbff640dced226af69eeda14ce556e4d43c03743
6
+ metadata.gz: 798a153672f1d695da862d95519396e81910a0460e2df638377169d44839d0e28bc86466f964b60fe4a3e158f09ee66a33b5d8d79fba9056caabb4def6945bcb
7
+ data.tar.gz: d42bb024e845971fe02c5715fa8875f80d262c5ccb2decb003360d6c1810191fe8385e328c35a74a093004dc8e87722be6749850a34b9749a6172e6908e1decc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- minesweeper-curses (0.1.2)
4
+ minesweeper-curses (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -209,7 +209,6 @@ Game Stats: you have found #{found_bombs_count} out of #{bombs.count} bombs
209
209
 
210
210
  public
211
211
 
212
- # stats
213
212
  def bombs
214
213
  cells.flatten(1).select(&:bomb?)
215
214
  end
@@ -217,7 +216,6 @@ Game Stats: you have found #{found_bombs_count} out of #{bombs.count} bombs
217
216
  def found_bombs
218
217
  bombs.select(&:marked_as_bomb?)
219
218
  end
220
- # stats
221
219
 
222
220
  def number_of_cells
223
221
  height * width
@@ -4,12 +4,12 @@ module Minesweeper
4
4
 
5
5
  def initialize(window, flush_params:)
6
6
  @window = window
7
- @params_builder = Minesweeper::BoardParams.new(window, flush_params)
8
- @bomb_injector = BombInjector.new(level: level)
7
+ @flush_params = flush_params
9
8
  end
10
9
 
11
10
  def build
12
- board = Minesweeper::Board.new(height: height, width: width, window: window)
11
+ params_builder.prepare
12
+ board = create_board
13
13
  fill_with_cells(board)
14
14
  inject_bombs(board)
15
15
  board
@@ -17,10 +17,14 @@ module Minesweeper
17
17
 
18
18
  private
19
19
 
20
- attr_reader :window, :bomb_injector, :params_builder
20
+ attr_reader :window, :flush_params
21
21
 
22
22
  def_delegators :params_builder, :height, :width, :level
23
23
 
24
+ def create_board
25
+ Minesweeper::Board.new(height: height, width: width, window: window)
26
+ end
27
+
24
28
  def fill_with_cells(board)
25
29
  height.times do
26
30
  board.cells << Array.new(width) { Cell.new }
@@ -28,7 +32,15 @@ module Minesweeper
28
32
  end
29
33
 
30
34
  def inject_bombs(board)
31
- bomb_injector.inject(board)
35
+ bomb_injector.inject(board, level)
36
+ end
37
+
38
+ def bomb_injector
39
+ @bomb_injector ||= BombInjector.new
40
+ end
41
+
42
+ def params_builder
43
+ @params_builder ||= Minesweeper::ParamsBuilder.new(window, flush_params)
32
44
  end
33
45
  end
34
46
  end
@@ -1,67 +1,22 @@
1
1
  module Minesweeper
2
- class BoardParams
3
- DEFAULTS = { height: 10, width: 10, level: 'advanced' }.freeze
4
-
5
- attr_reader :window, :flush_params
6
-
7
- def initialize(window, flush_params)
8
- @window = window
9
- @flush_params = flush_params
10
- prepare
11
- end
12
-
13
- def height
14
- storage.read[:height]
15
- end
16
-
17
- def width
18
- storage.read[:width]
19
- end
20
-
21
- def level
22
- storage.read[:level]
23
- end
24
-
25
- private
26
-
27
- def prepare
28
- storage.flush if flush_params
29
- storage.read || build
30
- end
31
-
32
- def storage
33
- ::Minesweeper::Storage.instance
34
- end
35
-
36
- def build
37
- window.addstr('Start game with default parameters? (Y/N)')
38
- window.setpos(4, 42)
39
- str = window.getstr
40
- if str.casecmp('y').zero?
41
- storage.insert(DEFAULTS)
42
- else
43
- storage.insert(height: ask_y, width: ask_x, level: ask_level)
44
- end
45
- storage.read
46
- end
47
-
48
- def ask_x
49
- window.addstr('Number of columns: ')
50
- x = window.getstr
51
- x = window.maxx - 1 if x.to_i > window.maxx
52
- x
53
- end
54
-
55
- def ask_y
56
- window.addstr('Number of rows: ')
57
- y = window.getstr
58
- y = window.maxy - 1 if y.to_i > window.maxy
59
- y
60
- end
61
-
62
- def ask_level
63
- window.addstr('Your Level (beginner/advanced/expert): ')
64
- window.getstr
2
+ Sequel::Model.db = Sequel.sqlite
3
+ Sequel::Model.strict_param_setting = false
4
+ Sequel::Model.db.execute <<-SQL
5
+ CREATE TABLE IF NOT EXISTS board_params (
6
+ id integer PRIMARY KEY,
7
+ height integer,
8
+ width integer,
9
+ level varchar(255)
10
+ );
11
+ SQL
12
+
13
+ class BoardParams < Sequel::Model
14
+ plugin :validation_helpers
15
+
16
+ def validate
17
+ super
18
+ validates_integer %i[height width]
19
+ validates_includes %w[beginner advanced expert], :level
65
20
  end
66
21
  end
67
22
  end
@@ -1,18 +1,15 @@
1
1
  module Minesweeper
2
2
  class BombInjector
3
- attr_reader :board, :level
4
-
5
- def initialize(level:)
6
- @level = level
7
- end
8
-
9
- def inject(board)
3
+ def inject(board, level)
10
4
  @board = board
5
+ @level = level
11
6
  add_bombs
12
7
  end
13
8
 
14
9
  private
15
10
 
11
+ attr_reader :board, :level
12
+
16
13
  def add_bombs(number = number_of_bombs)
17
14
  return if number.zero?
18
15
  row_index = random_row
@@ -26,18 +23,17 @@ module Minesweeper
26
23
  end
27
24
 
28
25
  def number_of_bombs
29
- bomb_percent =
30
- case level.to_sym
31
- when :beginner
32
- 0.05
33
- when :advanced
34
- 0.15
35
- when :expert
36
- 0.25
37
- end
38
26
  (bomb_percent * board.number_of_cells).ceil
39
27
  end
40
28
 
29
+ def bomb_percent
30
+ case level.to_sym
31
+ when :beginner then 0.05
32
+ when :advanced then 0.15
33
+ when :expert then 0.25
34
+ end
35
+ end
36
+
41
37
  def random_row
42
38
  Random.rand(board.height)
43
39
  end
@@ -0,0 +1,71 @@
1
+ module Minesweeper
2
+ class ParamsBuilder
3
+ extend Forwardable
4
+ DEFAULTS = { height: 10, width: 10, level: 'advanced' }.freeze
5
+
6
+ attr_reader :window, :flush_params
7
+
8
+ def initialize(window, flush_params)
9
+ @window = window
10
+ @flush_params = flush_params
11
+ end
12
+
13
+ def_delegators :entry, :height, :width, :level
14
+
15
+ def prepare
16
+ entry && entry.delete if flush_params
17
+ entry || build
18
+ end
19
+
20
+ private
21
+
22
+ def entry
23
+ ::Minesweeper::BoardParams.first
24
+ end
25
+
26
+ def build(pos = 4)
27
+ window.addstr('Start game with default parameters? (Y/N)')
28
+ window.setpos(pos, 42)
29
+ str = window.getstr
30
+ instance =
31
+ if str.casecmp('y').zero?
32
+ ::Minesweeper::BoardParams.new(DEFAULTS)
33
+ else
34
+ ::Minesweeper::BoardParams.new(height: ask_y, width: ask_x, level: ask_level)
35
+ end
36
+ validate(instance)
37
+ end
38
+
39
+ def validate(instance)
40
+ if instance.valid?
41
+ instance.save
42
+ instance
43
+ else
44
+ window.clear
45
+ window.addstr("Some of the parameters were invalid \n")
46
+ window.addstr(instance.errors.full_messages.join("\n"))
47
+ window.addstr("\n")
48
+ build(instance.errors.count + 1)
49
+ end
50
+ end
51
+
52
+ def ask_x
53
+ window.addstr('Number of columns: ')
54
+ x = window.getstr
55
+ x = window.maxx - 1 if x.to_i > window.maxx
56
+ x
57
+ end
58
+
59
+ def ask_y
60
+ window.addstr('Number of rows: ')
61
+ y = window.getstr
62
+ y = window.maxy - 1 if y.to_i > window.maxy
63
+ y
64
+ end
65
+
66
+ def ask_level
67
+ window.addstr('Your Level (beginner/advanced/expert): ')
68
+ window.getstr
69
+ end
70
+ end
71
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Minesweeper
4
- VERSION = "0.1.2"
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/minesweeper.rb CHANGED
@@ -6,10 +6,10 @@ include Curses
6
6
  require 'pry'
7
7
  require 'forwardable'
8
8
  require 'sequel'
9
- require_relative 'minesweeper/storage'
9
+ require_relative 'minesweeper/board_params'
10
10
  require_relative 'minesweeper/board'
11
11
  require_relative 'minesweeper/board_builder'
12
- require_relative 'minesweeper/board_params'
12
+ require_relative 'minesweeper/params_builder'
13
13
  require_relative 'minesweeper/bomb_cell'
14
14
  require_relative 'minesweeper/bomb_injector'
15
15
  require_relative 'minesweeper/cell'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minesweeper-curses
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mykhailo Rybak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-09 00:00:00.000000000 Z
11
+ date: 2017-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -137,7 +137,7 @@ files:
137
137
  - lib/minesweeper/bomb_injector.rb
138
138
  - lib/minesweeper/cell.rb
139
139
  - lib/minesweeper/game_initializer.rb
140
- - lib/minesweeper/storage.rb
140
+ - lib/minesweeper/params_builder.rb
141
141
  - lib/minesweeper/version.rb
142
142
  - minesweeper.gemspec
143
143
  - readme.md
@@ -1,34 +0,0 @@
1
- require 'singleton'
2
-
3
- module Minesweeper
4
- class Storage
5
- include Singleton
6
-
7
- DB = Sequel.sqlite
8
- DB.execute <<-SQL
9
- CREATE TABLE IF NOT EXISTS board_params (
10
- height integer,
11
- width integer,
12
- level varchar(255)
13
- );
14
- SQL
15
-
16
- def read
17
- table.first
18
- end
19
-
20
- def flush
21
- table.delete
22
- end
23
-
24
- def insert(**args)
25
- table.insert(args)
26
- end
27
-
28
- private
29
-
30
- def table
31
- DB[:board_params]
32
- end
33
- end
34
- end