TwentyFortyEight 0.2.0 → 0.2.1

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: 169c96337916c0265c9bcf9f76ed322a221728be
4
- data.tar.gz: 7712f1815cc6a4e4abe44c1da513354c2b6c6be7
3
+ metadata.gz: f437369fa63361bbb433fd5498ef7107eca3072b
4
+ data.tar.gz: 5f1eda15fb4412d3e070a092cae332a0f22e8b60
5
5
  SHA512:
6
- metadata.gz: 49c55706b034d1a427dd69939bdf202eec5b97476b365fc0e95b6e3cdacc405dd6fa990939443f145603e4f365a4c93d129857106bade1cba5ff7145dd2aee23
7
- data.tar.gz: e0c82620996f5656a79057d50425d1ab9b104d001f0cefceb22ffb17795fb114abab60e4ac3a7b2d69da2f86e947559e1b7a697aa5932e8dff8c441271bf10e7
6
+ metadata.gz: dae1eb27a154ce03fc9e5c2dbe0d1930745d02556e5bb0535b3455a4ac21e10fe4afc5e680f9b4b2c7045c675531c0b27bf691b2ca040e74fb13e9e57a7bd1dd
7
+ data.tar.gz: 1164df02da194b7dea1d22e6cd0ac27994b3a6fd98fa5fa2c69f7f7fff0546cf90a100fa6b5b829aa656216f54622b020cd58988730e782c6927c738e7b1af6b
@@ -0,0 +1 @@
1
+ service_name: travis-ci
@@ -1,5 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
+ - 2.1.0
5
+ - 2.2.0
6
+ - 2.3.0
4
7
  - 2.4.0
5
8
  before_install: gem install bundler -v 1.14.1
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'TwentyFortyEight/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
+ spec.required_ruby_version = '>= 2.1'
7
8
  spec.name = 'TwentyFortyEight'
8
9
  spec.version = TwentyFortyEight::VERSION
9
10
  spec.authors = ['Sidney Liebrand']
@@ -18,7 +19,7 @@ Gem::Specification.new do |spec|
18
19
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
20
  f.match(%r{^(test|spec|features)/})
20
21
  end
21
- spec.bindir = "bin"
22
+ spec.bindir = 'bin'
22
23
  spec.executables = ['2048']
23
24
  spec.require_paths = ['lib']
24
25
 
@@ -26,6 +27,7 @@ Gem::Specification.new do |spec|
26
27
  spec.add_development_dependency 'rake', '~> 10.0'
27
28
  spec.add_development_dependency 'rspec', '~> 3.0'
28
29
  spec.add_development_dependency 'pry'
30
+ spec.add_development_dependency 'coveralls'
29
31
 
30
32
  spec.add_runtime_dependency 'curses'
31
33
  spec.add_runtime_dependency 'json'
data/bin/2048 CHANGED
@@ -2,6 +2,7 @@
2
2
  require_relative '../lib/TwentyFortyEight'
3
3
 
4
4
  options = TwentyFortyEight::Cli.parse!
5
+
5
6
  TwentyFortyEight.send options.mode, options do
6
7
  down || left || right || up
7
8
  end
@@ -103,7 +103,7 @@ module TwentyFortyEight
103
103
  def self.load_highscore(path = '~/.2048')
104
104
  path = File.expand_path path
105
105
 
106
- if File.exists?(path)
106
+ if File.exist? path
107
107
  contents = File.read path
108
108
  hsh = JSON.parse contents.start_with?('{') && contents || '{}'
109
109
  else
@@ -4,7 +4,10 @@ module TwentyFortyEight
4
4
  class Board
5
5
  attr_reader :board, :settings
6
6
 
7
+ DEFAULTS = { size: 4, fill: 0, empty: 0 }
8
+
7
9
  def initialize(opts = {})
10
+ opts = Options.new DEFAULTS.merge(opts)
8
11
  @settings = opts
9
12
  @settings[:size] = settings.board.size if settings.board?
10
13
  @board = settings.board || Board.generate(settings)
@@ -39,15 +42,14 @@ module TwentyFortyEight
39
42
  end
40
43
 
41
44
  def dup
42
- Board.new settings.merge(board: board.dup)
45
+ new settings.merge(board: board.dup)
43
46
  end
44
47
 
45
48
  private
46
49
 
47
- def self.generate(**opts)
48
- Array.new(opts[:size]) do
49
- Array.new(opts[:size]) { opts[:fill] }
50
- end
50
+ def self.generate(opts_hsh, **opts)
51
+ opts = opts_hsh.merge opts
52
+ Array.new(opts.size) { Array.new(opts.size) { opts.fill } }
51
53
  end
52
54
  end
53
55
  end
@@ -74,7 +74,7 @@ module TwentyFortyEight
74
74
  def self.defaults_for(mode)
75
75
  case mode.to_sym
76
76
  when :endless
77
- { verbose: true, delay: 100 }
77
+ { verbose: true, delay: 100, history: true }
78
78
  when :play
79
79
  { verbose: true, delay: 100 }
80
80
  else
@@ -6,6 +6,7 @@ module TwentyFortyEight
6
6
 
7
7
  def initialize(game, settings = {}, &block)
8
8
  @callable = block
9
+ @sequence = []
9
10
  @settings = settings
10
11
  @game = game
11
12
  end
@@ -15,14 +16,45 @@ module TwentyFortyEight
15
16
  instance_eval(&@callable)
16
17
  end
17
18
 
19
+ def sequence(*directions)
20
+ @sequence = directions.flatten.map(&:to_sym)
21
+ run_sequence
22
+ end
23
+
24
+ def run_sequence
25
+ return @poss.shift if @poss && @poss.any?
26
+
27
+ copy = @sequence.dup
28
+ sample = game.dup
29
+ @poss = []
30
+
31
+ while (next_move = copy.shift)
32
+ unless sample.move(next_move).changed?
33
+ @poss = nil
34
+ break
35
+ end
36
+
37
+ @poss << next_move
38
+ end
39
+
40
+ @poss && @poss.shift
41
+ end
42
+
43
+ def info?(sym)
44
+ [:won?, :lost?, :changed?, :available, :score, :prev_score].include? sym
45
+ end
46
+
47
+ def info(sym)
48
+ game.send sym
49
+ end
50
+
18
51
  def quit!
19
52
  game.quit! && :quit
20
53
  end
21
54
 
22
55
  def method_missing(sym, *args, &block)
23
- return game.send(sym) if [:won?, :lost?, :changed?, :available,
24
- :score, :prev_score].include?(sym)
25
- return sym if game.dup.action(sym, insert: false).changed?
56
+ return info sym if info? sym
57
+ return sym if game.dup.action(sym, insert: false).changed?
26
58
  end
27
59
 
28
60
  def respond_to_missing?(sym, *args, &block)
@@ -5,6 +5,7 @@ module TwentyFortyEight
5
5
  attr_reader :id, :board, :settings, :score, :prev_score, :prev_available,
6
6
  :moves, :log, :current_dir
7
7
 
8
+ DEFAULTS = { fill: 0, empty: 0 }.freeze
8
9
  MOVES = [:up, :down, :left, :right].freeze
9
10
  ACTIONS = [*MOVES, :quit].freeze
10
11
 
@@ -13,7 +14,7 @@ module TwentyFortyEight
13
14
  @score = 0
14
15
  @prev_score = 0
15
16
  @moves = 0
16
- @settings = Options.new opts.merge(rest_opts)
17
+ @settings = Options.new DEFAULTS.merge(opts.merge(rest_opts))
17
18
  @board = Board.new(settings)
18
19
  @prev_available = available
19
20
  @current_dir = nil
@@ -34,7 +35,7 @@ module TwentyFortyEight
34
35
  end
35
36
 
36
37
  def won?
37
- board.flatten.max >= 2048
38
+ board.board.flatten.max >= 2048
38
39
  end
39
40
 
40
41
  def lost?
@@ -102,7 +103,7 @@ module TwentyFortyEight
102
103
  end
103
104
 
104
105
  def dup
105
- TwentyFortyEight::Game.new settings.merge(board: board.to_a)
106
+ Game.new settings.merge(board: board.to_a)
106
107
  end
107
108
 
108
109
  private
@@ -4,8 +4,8 @@ module TwentyFortyEight
4
4
  class Logger
5
5
  attr_reader :entries
6
6
 
7
- def initialize
8
- @entries = []
7
+ def initialize(entries = [])
8
+ @entries = entries
9
9
  end
10
10
 
11
11
  def <<(info_hsh)
@@ -14,11 +14,30 @@ module TwentyFortyEight
14
14
 
15
15
  def write!(options = {})
16
16
  name = (options[:name] || "2048-#{Time.now.to_i}") + '.log.json'
17
- path = File.expand_path(options[:path]) if options[:path]
18
- path = File.join(Dir.pwd, name) unless options[:dir]
17
+ path = File.join File.expand_path(options[:path]), name if options[:path]
18
+ path = File.join(Dir.pwd, name) unless options[:dir] || options[:path]
19
19
  path = (File.join Dir.pwd, options[:dir], name) if options[:dir]
20
20
 
21
21
  File.open(path, 'w') { |f| f.write @entries.to_json }
22
22
  end
23
+
24
+ def self.load!(path)
25
+ full_path = File.expand_path path
26
+ check_file_existence! full_path
27
+
28
+ new JSON.parse(File.read(full_path), symbolize_names: true)
29
+ end
30
+
31
+ def self.destroy!(path)
32
+ full_path = File.expand_path path
33
+ check_file_existence! full_path
34
+ File.delete full_path
35
+ end
36
+
37
+ def self.check_file_existence!(path)
38
+ raise FileNotFound, 'Log does not exist' unless File.exist? path
39
+ end
40
+
41
+ class FileNotFound < StandardError; end
23
42
  end
24
43
  end
@@ -20,6 +20,7 @@ module TwentyFortyEight
20
20
 
21
21
  def merge(other)
22
22
  @options.merge! other
23
+ self
23
24
  end
24
25
 
25
26
  def to_hash
@@ -1,3 +1,3 @@
1
1
  module TwentyFortyEight
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: TwentyFortyEight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sidney Liebrand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-22 00:00:00.000000000 Z
11
+ date: 2017-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: curses
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +117,7 @@ executables:
103
117
  extensions: []
104
118
  extra_rdoc_files: []
105
119
  files:
120
+ - ".coveralls.yml"
106
121
  - ".gitignore"
107
122
  - ".rspec"
108
123
  - ".travis.yml"
@@ -136,7 +151,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
151
  requirements:
137
152
  - - ">="
138
153
  - !ruby/object:Gem::Version
139
- version: '0'
154
+ version: '2.1'
140
155
  required_rubygems_version: !ruby/object:Gem::Requirement
141
156
  requirements:
142
157
  - - ">="