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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/minesweeper/board.rb +0 -2
- data/lib/minesweeper/board_builder.rb +17 -5
- data/lib/minesweeper/board_params.rb +18 -63
- data/lib/minesweeper/bomb_injector.rb +12 -16
- data/lib/minesweeper/params_builder.rb +71 -0
- data/lib/minesweeper/version.rb +1 -1
- data/lib/minesweeper.rb +2 -2
- metadata +3 -3
- data/lib/minesweeper/storage.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb8abc68f343b643d941f7d2d71ace49e11d4a4a
|
4
|
+
data.tar.gz: 765ec1d03544b1e805c805145ccaf38a1102c875
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 798a153672f1d695da862d95519396e81910a0460e2df638377169d44839d0e28bc86466f964b60fe4a3e158f09ee66a33b5d8d79fba9056caabb4def6945bcb
|
7
|
+
data.tar.gz: d42bb024e845971fe02c5715fa8875f80d262c5ccb2decb003360d6c1810191fe8385e328c35a74a093004dc8e87722be6749850a34b9749a6172e6908e1decc
|
data/Gemfile.lock
CHANGED
data/lib/minesweeper/board.rb
CHANGED
@@ -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
|
-
@
|
8
|
-
@bomb_injector = BombInjector.new(level: level)
|
7
|
+
@flush_params = flush_params
|
9
8
|
end
|
10
9
|
|
11
10
|
def build
|
12
|
-
|
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, :
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
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
|
data/lib/minesweeper/version.rb
CHANGED
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/
|
9
|
+
require_relative 'minesweeper/board_params'
|
10
10
|
require_relative 'minesweeper/board'
|
11
11
|
require_relative 'minesweeper/board_builder'
|
12
|
-
require_relative 'minesweeper/
|
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.
|
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-
|
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/
|
140
|
+
- lib/minesweeper/params_builder.rb
|
141
141
|
- lib/minesweeper/version.rb
|
142
142
|
- minesweeper.gemspec
|
143
143
|
- readme.md
|
data/lib/minesweeper/storage.rb
DELETED
@@ -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
|