minesweeper-curses 0.1.2 → 0.2.0

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: 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