minesweeper-curses 0.3.3 → 0.4.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: 8c8e408c58b28a513a86bfbcc48106443cc104a3
4
- data.tar.gz: c5b13c8d95b287852e4d10df362b91f762e50801
3
+ metadata.gz: 413c2082203f1764e3909d9e4364ed25b74b086f
4
+ data.tar.gz: f9cd7100f33a34e12f5a4c3351d832a0fc64973d
5
5
  SHA512:
6
- metadata.gz: 93811881349616041adb44187a488ddda672960309ba52af80f94e38404973aeeefc19f3d8681f76f838a19aea1ab939dd414b04424e50a352546d85d8ba72fe
7
- data.tar.gz: 1cea87376481e33d79a5fa443a0c1992905f93044094e6146241d25ceb980328852e3a3fc8bea628bdc88c76aa274d08472f291c49fcd001848ebe8751d14bd8
6
+ metadata.gz: 81e33dc1686e8e98d83d839675248b294a4b44f50a0085dbf25f0cff5ab6a160fab843327c1fa18e259ed460a9a17ac31158fdc3dce44749f03b07e86476528c
7
+ data.tar.gz: f5b68defae4e02000e35415f66d331a611e189599000ba30ece31ff5a1a04790b908d1a251358d338a90eb06f5a4b3c108d7293b41e5ee910bce96a55c322a50
data/lib/minesweeper.rb CHANGED
@@ -6,6 +6,7 @@ include Curses
6
6
  require 'forwardable'
7
7
  require 'sequel'
8
8
  require_relative 'minesweeper/exceptions'
9
+ require_relative 'minesweeper/ui'
9
10
  require_relative 'minesweeper/board_params'
10
11
  require_relative 'minesweeper/board'
11
12
  require_relative 'minesweeper/board_builder'
@@ -14,9 +14,9 @@ module Minesweeper
14
14
 
15
15
  attr_reader :board_params, :cells, :window
16
16
 
17
- def initialize(board_params:, window:)
17
+ def initialize(board_params)
18
18
  @board_params = board_params
19
- @window = window
19
+ @window = Ui.instance.window
20
20
  @cells = []
21
21
  end
22
22
 
@@ -7,8 +7,7 @@ module Minesweeper
7
7
  class BoardBuilder
8
8
  extend Forwardable
9
9
 
10
- def initialize(window, flush_params:)
11
- @window = window
10
+ def initialize(flush_params)
12
11
  @flush_params = flush_params
13
12
  end
14
13
 
@@ -27,7 +26,7 @@ module Minesweeper
27
26
  def_delegators :board_params, :height, :width, :level
28
27
 
29
28
  def create_board
30
- Minesweeper::Board.new(board_params: board_params, window: window)
29
+ Minesweeper::Board.new(board_params)
31
30
  end
32
31
 
33
32
  def fill_with_cells
@@ -45,7 +44,7 @@ module Minesweeper
45
44
  end
46
45
 
47
46
  def params_builder
48
- Minesweeper::ParamsBuilder.new(window, flush_params)
47
+ Minesweeper::ParamsBuilder.new(flush_params)
49
48
  end
50
49
  end
51
50
  end
@@ -3,19 +3,12 @@
3
3
  module Minesweeper
4
4
  class GameInitializer
5
5
  def initialize
6
- @window = Window.new(0, 0, 0, 0)
6
+ @window = nil
7
7
  end
8
8
 
9
9
  def start
10
- init_screen
11
- init_colors
12
- cbreak
13
- window.keypad = true
14
- window.refresh
15
- window.addch("\n")
16
- window.addstr("Welcome to Minesweeper \n")
17
- window.addstr("screen size: rows: #{window.maxy}; columns: #{window.maxx / Minesweeper::Board::STEP} \n")
18
- window.addstr("controls: `space` to mark/unmark cell as bomb, `arrow keys` to navigate \n")
10
+ init_curses
11
+ Ui.greeting_message
19
12
  play
20
13
  rescue SystemExit, Interrupt
21
14
  ensure
@@ -31,13 +24,19 @@ module Minesweeper
31
24
 
32
25
  def play(flush_params = true)
33
26
  Minesweeper::BoardBuilder
34
- .new(window, flush_params: flush_params)
27
+ .new(flush_params)
35
28
  .build
36
29
  .play
37
30
  end
38
31
 
39
32
  attr_reader :window
40
33
 
34
+ def init_curses
35
+ init_screen
36
+ init_colors
37
+ cbreak
38
+ end
39
+
41
40
  def init_colors
42
41
  Curses.start_color
43
42
  Curses.init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK)
@@ -7,11 +7,11 @@ module Minesweeper
7
7
 
8
8
  DEFAULTS = { height: 10, width: 10, level: 'advanced' }.freeze
9
9
 
10
- attr_reader :window, :flush_params
10
+ attr_reader :flush_params, :ui
11
11
 
12
- def initialize(window, flush_params)
13
- @window = window
12
+ def initialize(flush_params)
14
13
  @flush_params = flush_params
14
+ @ui = Minesweeper::Ui
15
15
  end
16
16
 
17
17
  def_delegators :entry, :height, :width, :level
@@ -28,9 +28,9 @@ module Minesweeper
28
28
  end
29
29
 
30
30
  def build(y_position = 4)
31
- window.addstr('Start game with default parameters? (Y/N)')
32
- window.setpos(y_position, 42)
33
- str = window.getstr
31
+ ui.params_message
32
+ ui.setpos(y_position, 42)
33
+ str = ui.getstr
34
34
  params =
35
35
  if str.casecmp('y').zero?
36
36
  DEFAULTS
@@ -46,30 +46,27 @@ module Minesweeper
46
46
  instance.save
47
47
  instance
48
48
  else
49
- window.clear
50
- window.addstr("Some of the parameters were invalid \n")
51
- window.addstr(instance.errors.full_messages.join("\n"))
52
- window.addstr("\n")
49
+ ui.validation_errors(instance.errors)
53
50
  build(instance.errors.count + 1)
54
51
  end
55
52
  end
56
53
 
57
54
  def ask_x
58
- window.addstr('Number of columns: ')
59
- x = window.getstr
60
- max_x = window.maxx / Minesweeper::Board::STEP
55
+ ui.col_num
56
+ x = ui.getstr
57
+ max_x = ui.maxx / Minesweeper::Board::STEP
61
58
  x.to_i > max_x ? max_x : x
62
59
  end
63
60
 
64
61
  def ask_y
65
- window.addstr('Number of rows: ')
66
- y = window.getstr
67
- y.to_i > window.maxy ? window.maxy - 1 : y
62
+ ui.row_num
63
+ y = ui.getstr
64
+ y.to_i > ui.maxy ? ui.maxy - 1 : y
68
65
  end
69
66
 
70
67
  def ask_level
71
- window.addstr('Your Level (beginner/advanced/expert): ')
72
- window.getstr
68
+ ui.level
69
+ ui.getstr
73
70
  end
74
71
  end
75
72
  end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+ require 'forwardable'
5
+
6
+ module Minesweeper
7
+ class Ui
8
+ include ::Singleton
9
+ extend Forwardable
10
+
11
+ def self.method_missing(method_name, *arguments, &block)
12
+ if instance.respond_to?(method_name)
13
+ instance.send(method_name, *arguments, &block)
14
+ else
15
+ super
16
+ end
17
+ end
18
+
19
+ def self.respond_to_missing?(method_name, include_private = false)
20
+ instance.respond_to?(:method_name) || super
21
+ end
22
+
23
+ def_delegators :window, :clear, :addch, :addstr, :refresh, :maxy, :maxx, :getstr, :setpos
24
+
25
+ def greeting_message
26
+ clear
27
+ enable_keypad
28
+ refresh
29
+ addch("\n")
30
+ addstr("Welcome to Minesweeper \n")
31
+ addstr("screen size: rows: #{window.maxy}; columns: #{window.maxx / Minesweeper::Board::STEP} \n")
32
+ addstr("controls: `space` to mark/unmark cell as bomb, `arrow keys` to navigate \n")
33
+ end
34
+
35
+ def params_message
36
+ addstr('Start game with default parameters? (Y/N)')
37
+ end
38
+
39
+ def col_num
40
+ addstr('Number of columns: ')
41
+ end
42
+
43
+ def row_num
44
+ addstr('Number of rows: ')
45
+ end
46
+
47
+ def level
48
+ addstr('Your Level (beginner/advanced/expert): ')
49
+ end
50
+
51
+ def validation_errors(errors)
52
+ clear
53
+ addstr("Some of the parameters were invalid \n")
54
+ addstr(errors.full_messages.join("\n"))
55
+ addstr("\n")
56
+ end
57
+
58
+ def window
59
+ @window ||= Window.new(0, 0, 0, 0)
60
+ end
61
+
62
+ private
63
+
64
+ def enable_keypad
65
+ window.keypad = true
66
+ end
67
+ end
68
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Minesweeper
4
- VERSION = '0.3.3'
5
- end
4
+ VERSION = '0.4.0'
5
+ end
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.3.3
4
+ version: 0.4.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-28 00:00:00.000000000 Z
11
+ date: 2017-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -127,6 +127,7 @@ files:
127
127
  - lib/minesweeper/exceptions.rb
128
128
  - lib/minesweeper/game_initializer.rb
129
129
  - lib/minesweeper/params_builder.rb
130
+ - lib/minesweeper/ui.rb
130
131
  - lib/minesweeper/version.rb
131
132
  - minesweeper.gemspec
132
133
  - readme.md