TwentyFortyEight 0.2.0 → 0.2.1

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