text2048 0.7.0 → 0.8.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/README.md +13 -5
- data/lib/text2048/board.rb +1 -1
- data/lib/text2048/curses_view.rb +3 -2
- data/lib/text2048/curses_view/lcd.rb +70 -0
- data/lib/text2048/curses_view/tile.rb +35 -6
- data/lib/text2048/version.rb +1 -1
- data/spec/text2048/curses_view/lcd_spec.rb +225 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 185c956718085eb81aef19c630b8cee21e67d71f
|
4
|
+
data.tar.gz: efb909b378a7c05e887ac9f6a4a45c84dd47e9c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 253d485900f6ea785acd1de33bbdab69f46126319640062ffd80cc5779bb7efa8b3f7a7f750d65141bbeb86bfd60805865f966c4db10402cfbace5c381bdc494
|
7
|
+
data.tar.gz: 91f25760bb10e3b313263ec88cc6006a38d077325296b4086eadbdd5cb909452c2161ff996ad7cf8f8c0eef9d0c0426bb43ffafb54b91a367c5723a764eca79a
|
data/README.md
CHANGED
@@ -5,27 +5,30 @@ text2048
|
|
5
5
|
[][codeclimate]
|
6
6
|
[][coveralls]
|
7
7
|
[][gemnasium]
|
8
|
+
[][gittip]
|
8
9
|
|
9
10
|
Text mode 2048 game.
|
10
11
|
|
11
|
-
[][screenshot]
|
12
|
-
|
13
12
|
[gem]: https://rubygems.org/gems/text2048
|
14
13
|
[travis]: http://travis-ci.org/yasuhito/text2048
|
15
14
|
[codeclimate]: https://codeclimate.com/github/yasuhito/text2048
|
16
15
|
[coveralls]: https://coveralls.io/r/yasuhito/text2048?branch=develop
|
17
16
|
[gemnasium]: https://gemnasium.com/yasuhito/text2048
|
17
|
+
[gittip]: https://www.gittip.com/yasuhito/
|
18
|
+
|
19
|
+
[][screenshot]
|
20
|
+
|
18
21
|
[screenshot]: https://raw.github.com/yasuhito/text2048/develop/screen_shot.png
|
19
22
|
|
20
23
|
Installation
|
21
|
-
|
24
|
+
------------
|
22
25
|
|
23
26
|
```
|
24
27
|
$ gem install text2048
|
25
28
|
```
|
26
29
|
|
27
30
|
How to Play
|
28
|
-
|
31
|
+
-----------
|
29
32
|
|
30
33
|
```
|
31
34
|
$ 2048
|
@@ -35,7 +38,12 @@ $ 2048
|
|
35
38
|
- +/- for increase or decrease the size of the tiles displayed.
|
36
39
|
|
37
40
|
Links
|
38
|
-
|
41
|
+
-----
|
39
42
|
|
40
43
|
* [The official version of 2048](http://gabrielecirulli.github.io/2048/) by Gabriele Cirulli
|
41
44
|
* [bfontaine/term2048](https://github.com/bfontaine/term2048) a terminal-based version in Python
|
45
|
+
|
46
|
+
Author
|
47
|
+
------
|
48
|
+
|
49
|
+
[Yasuhito Takamiya](https://github.com/yasuhito) ([@yasuhito](http://twitter.com/yasuhito))
|
data/lib/text2048/board.rb
CHANGED
@@ -76,7 +76,7 @@ module Text2048
|
|
76
76
|
# @return [Board] a new board
|
77
77
|
def generate
|
78
78
|
tiles = @all_tiles.dup
|
79
|
-
tiles[sample_zero_tile] = Tile.new(rand < 0.
|
79
|
+
tiles[sample_zero_tile] = Tile.new(rand < 0.9 ? 2 : 4, :generated)
|
80
80
|
new_board(tiles, @score)
|
81
81
|
end
|
82
82
|
|
data/lib/text2048/curses_view.rb
CHANGED
@@ -4,6 +4,7 @@ require 'curses'
|
|
4
4
|
require 'forwardable'
|
5
5
|
require 'text2048/curses_view/colorize'
|
6
6
|
require 'text2048/curses_view/keyboard'
|
7
|
+
require 'text2048/curses_view/lcd'
|
7
8
|
require 'text2048/curses_view/tile'
|
8
9
|
require 'text2048/curses_view/tile_effects'
|
9
10
|
|
@@ -21,8 +22,8 @@ module Text2048
|
|
21
22
|
|
22
23
|
def initialize
|
23
24
|
@tiles = {}
|
24
|
-
@scale =
|
25
|
-
@scale_min =
|
25
|
+
@scale = 1
|
26
|
+
@scale_min = 0.5
|
26
27
|
@scale_step = 0.5
|
27
28
|
@keyboard = Keyboard.new
|
28
29
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# This module smells of :reek:UncommunicativeModuleName
|
4
|
+
module Text2048
|
5
|
+
class CursesView
|
6
|
+
# Renders numbers like LCDs
|
7
|
+
class LCD
|
8
|
+
BITMAPS = [
|
9
|
+
0b1111111110111,
|
10
|
+
0b1010100100100,
|
11
|
+
0b1111111011101,
|
12
|
+
0b1111111101101,
|
13
|
+
0b1011110101110,
|
14
|
+
0b1111111101011,
|
15
|
+
0b1111111111011,
|
16
|
+
0b1010110100101,
|
17
|
+
0b1111111111111,
|
18
|
+
0b1111111101111
|
19
|
+
]
|
20
|
+
|
21
|
+
TOP = 0
|
22
|
+
TOP_LEFT = 1
|
23
|
+
TOP_RIGHT = 2
|
24
|
+
MIDDLE = 3
|
25
|
+
BOTTOM_LEFT = 4
|
26
|
+
BOTTOM_RIGHT = 5
|
27
|
+
BOTTOM = 6
|
28
|
+
|
29
|
+
CORNER_TOP_LEFT = 7
|
30
|
+
CORNER_TOP_RIGHT = 8
|
31
|
+
CORNER_MIDDLE_LEFT = 9
|
32
|
+
CORNER_MIDDLE_RIGHT = 10
|
33
|
+
CORNER_BOTTOM_LEFT = 11
|
34
|
+
CORNER_BOTTOM_RIGHT = 12
|
35
|
+
|
36
|
+
def initialize(number)
|
37
|
+
@number = number
|
38
|
+
end
|
39
|
+
|
40
|
+
def render
|
41
|
+
digits = @number.to_s.split(//).map { |each| digit(each) }
|
42
|
+
digits.transpose.map { |each| each.join(' ') }.join("\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def digit(number)
|
48
|
+
lines =
|
49
|
+
[[CORNER_TOP_LEFT, TOP, CORNER_TOP_RIGHT],
|
50
|
+
[TOP_LEFT, nil, TOP_RIGHT],
|
51
|
+
[CORNER_MIDDLE_LEFT, MIDDLE, CORNER_MIDDLE_RIGHT],
|
52
|
+
[BOTTOM_LEFT, nil, BOTTOM_RIGHT],
|
53
|
+
[CORNER_BOTTOM_LEFT, BOTTOM, CORNER_BOTTOM_RIGHT]]
|
54
|
+
lines.map { |each| line(BITMAPS[number.to_i], each) }
|
55
|
+
end
|
56
|
+
|
57
|
+
# @todo This method smells of :reek:UtilityFunction
|
58
|
+
# @todo This method smells of :reek:FeatureEnvy
|
59
|
+
def line(bitmap, bits)
|
60
|
+
bits.map do |each|
|
61
|
+
if each
|
62
|
+
(bitmap & 1 << each).zero? ? ' ' : '*'
|
63
|
+
else
|
64
|
+
' '
|
65
|
+
end
|
66
|
+
end.join
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -2,21 +2,22 @@
|
|
2
2
|
|
3
3
|
require 'curses'
|
4
4
|
require 'text2048/curses_view/colorize'
|
5
|
+
require 'text2048/curses_view/lcd'
|
5
6
|
|
6
7
|
# This module smells of :reek:UncommunicativeModuleName
|
7
8
|
module Text2048
|
8
9
|
class CursesView
|
9
10
|
# Shows tiles in curses.
|
11
|
+
# rubocop:disable ClassLength
|
10
12
|
class Tile
|
11
13
|
attr_reader :width
|
12
14
|
attr_reader :height
|
13
15
|
attr_reader :color
|
14
16
|
|
15
|
-
include Curses
|
16
17
|
include Colorize
|
17
18
|
|
18
|
-
DEFAULT_HEIGHT =
|
19
|
-
DEFAULT_WIDTH =
|
19
|
+
DEFAULT_HEIGHT = 7
|
20
|
+
DEFAULT_WIDTH = 17
|
20
21
|
|
21
22
|
def self.width(scale)
|
22
23
|
@width = (DEFAULT_WIDTH * scale).to_i
|
@@ -34,6 +35,7 @@ module Text2048
|
|
34
35
|
@row = (@height + 1) * row + 2
|
35
36
|
@col = (@width + 1) * col + 1
|
36
37
|
@color = color
|
38
|
+
@scale = scale
|
37
39
|
end
|
38
40
|
|
39
41
|
def show
|
@@ -69,14 +71,40 @@ module Text2048
|
|
69
71
|
|
70
72
|
def draw_number
|
71
73
|
return if @value == 0
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
if @scale >= 1
|
75
|
+
draw_lcd_number
|
76
|
+
else
|
77
|
+
setpos(@row + @height / 2, @col)
|
78
|
+
colorize(@color) do
|
79
|
+
addstr @value.to_s.center(@width)
|
80
|
+
end
|
75
81
|
end
|
76
82
|
end
|
77
83
|
|
78
84
|
private
|
79
85
|
|
86
|
+
def draw_lcd_number
|
87
|
+
num_lcd = LCD.new(@value).render
|
88
|
+
num_lcd.split("\n").each_with_index do |each, index|
|
89
|
+
draw_lcd_line(each, @row + index + (@height - 5) / 2)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def col_padded
|
94
|
+
num_length = @value.to_s.length
|
95
|
+
@col + (@width - num_length * 4 + 1) / 2
|
96
|
+
end
|
97
|
+
|
98
|
+
# @todo This method smells of :reek:NestedIterators
|
99
|
+
# @todo This method smells of :reek:TooManyStatements
|
100
|
+
def draw_lcd_line(line, row)
|
101
|
+
line.split(//).each_with_index do |each, index|
|
102
|
+
setpos(row, col_padded + index)
|
103
|
+
color = each == '*' ? COLOR_BLACK + 100 : @color
|
104
|
+
colorize(color) { addstr each }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
80
108
|
def box_upper_left
|
81
109
|
[@row - 1, @col - 1]
|
82
110
|
end
|
@@ -131,5 +159,6 @@ module Text2048
|
|
131
159
|
end
|
132
160
|
end
|
133
161
|
end
|
162
|
+
# rubocop:enable ClassLength
|
134
163
|
end
|
135
164
|
end
|
data/lib/text2048/version.rb
CHANGED
@@ -0,0 +1,225 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'text2048'
|
4
|
+
|
5
|
+
describe Text2048::CursesView::LCD do
|
6
|
+
describe '#render' do
|
7
|
+
Given(:result) { Text2048::CursesView::LCD.new(number).render }
|
8
|
+
|
9
|
+
context 'with 0' do
|
10
|
+
When(:number) { 0 }
|
11
|
+
Then do
|
12
|
+
result ==
|
13
|
+
"***\n"\
|
14
|
+
"* *\n"\
|
15
|
+
"* *\n"\
|
16
|
+
"* *\n"\
|
17
|
+
'***'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with 1' do
|
22
|
+
When(:number) { 1 }
|
23
|
+
Then do
|
24
|
+
result ==
|
25
|
+
" *\n"\
|
26
|
+
" *\n"\
|
27
|
+
" *\n"\
|
28
|
+
" *\n"\
|
29
|
+
' *'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with 2' do
|
34
|
+
When(:number) { 2 }
|
35
|
+
Then do
|
36
|
+
result ==
|
37
|
+
"***\n"\
|
38
|
+
" *\n"\
|
39
|
+
"***\n"\
|
40
|
+
"* \n"\
|
41
|
+
'***'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with 3' do
|
46
|
+
When(:number) { 3 }
|
47
|
+
Then do
|
48
|
+
result ==
|
49
|
+
"***\n"\
|
50
|
+
" *\n"\
|
51
|
+
"***\n"\
|
52
|
+
" *\n"\
|
53
|
+
'***'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with 4' do
|
58
|
+
When(:number) { 4 }
|
59
|
+
Then do
|
60
|
+
result ==
|
61
|
+
"* *\n"\
|
62
|
+
"* *\n"\
|
63
|
+
"***\n"\
|
64
|
+
" *\n"\
|
65
|
+
' *'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'with 5' do
|
70
|
+
When(:number) { 5 }
|
71
|
+
Then do
|
72
|
+
result ==
|
73
|
+
"***\n"\
|
74
|
+
"* \n"\
|
75
|
+
"***\n"\
|
76
|
+
" *\n"\
|
77
|
+
'***'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with 6' do
|
82
|
+
When(:number) { 6 }
|
83
|
+
Then do
|
84
|
+
result ==
|
85
|
+
"***\n"\
|
86
|
+
"* \n"\
|
87
|
+
"***\n"\
|
88
|
+
"* *\n"\
|
89
|
+
'***'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'with 7' do
|
94
|
+
When(:number) { 7 }
|
95
|
+
Then do
|
96
|
+
result ==
|
97
|
+
"***\n"\
|
98
|
+
" *\n"\
|
99
|
+
" *\n"\
|
100
|
+
" *\n"\
|
101
|
+
' *'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'with 8' do
|
106
|
+
When(:number) { 8 }
|
107
|
+
Then do
|
108
|
+
result ==
|
109
|
+
"***\n"\
|
110
|
+
"* *\n"\
|
111
|
+
"***\n"\
|
112
|
+
"* *\n"\
|
113
|
+
'***'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'with 9' do
|
118
|
+
When(:number) { 9 }
|
119
|
+
Then do
|
120
|
+
result ==
|
121
|
+
"***\n"\
|
122
|
+
"* *\n"\
|
123
|
+
"***\n"\
|
124
|
+
" *\n"\
|
125
|
+
'***'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'with 16' do
|
130
|
+
When(:number) { 16 }
|
131
|
+
Then do
|
132
|
+
result ==
|
133
|
+
" * ***\n"\
|
134
|
+
" * * \n"\
|
135
|
+
" * ***\n"\
|
136
|
+
" * * *\n"\
|
137
|
+
' * ***'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'with 32' do
|
142
|
+
When(:number) { 32 }
|
143
|
+
Then do
|
144
|
+
result ==
|
145
|
+
"*** ***\n"\
|
146
|
+
" * *\n"\
|
147
|
+
"*** ***\n"\
|
148
|
+
" * * \n"\
|
149
|
+
'*** ***'
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'with 64' do
|
154
|
+
When(:number) { 64 }
|
155
|
+
Then do
|
156
|
+
result ==
|
157
|
+
"*** * *\n"\
|
158
|
+
"* * *\n"\
|
159
|
+
"*** ***\n"\
|
160
|
+
"* * *\n"\
|
161
|
+
'*** *'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'with 128' do
|
166
|
+
When(:number) { 128 }
|
167
|
+
Then do
|
168
|
+
result ==
|
169
|
+
" * *** ***\n"\
|
170
|
+
" * * * *\n"\
|
171
|
+
" * *** ***\n"\
|
172
|
+
" * * * *\n"\
|
173
|
+
' * *** ***'
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context 'with 256' do
|
178
|
+
When(:number) { 256 }
|
179
|
+
Then do
|
180
|
+
result ==
|
181
|
+
"*** *** ***\n"\
|
182
|
+
" * * * \n"\
|
183
|
+
"*** *** ***\n"\
|
184
|
+
"* * * *\n"\
|
185
|
+
'*** *** ***'
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'with 512' do
|
190
|
+
When(:number) { 512 }
|
191
|
+
Then do
|
192
|
+
result ==
|
193
|
+
"*** * ***\n"\
|
194
|
+
"* * *\n"\
|
195
|
+
"*** * ***\n"\
|
196
|
+
" * * * \n"\
|
197
|
+
'*** * ***'
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context 'with 1024' do
|
202
|
+
When(:number) { 1024 }
|
203
|
+
Then do
|
204
|
+
result ==
|
205
|
+
" * *** *** * *\n"\
|
206
|
+
" * * * * * *\n"\
|
207
|
+
" * * * *** ***\n"\
|
208
|
+
" * * * * *\n"\
|
209
|
+
' * *** *** *'
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context 'with 2048' do
|
214
|
+
When(:number) { 2048 }
|
215
|
+
Then do
|
216
|
+
result ==
|
217
|
+
"*** *** * * ***\n"\
|
218
|
+
" * * * * * * *\n"\
|
219
|
+
"*** * * *** ***\n"\
|
220
|
+
"* * * * * *\n"\
|
221
|
+
'*** *** * ***'
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: text2048
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yasuhito Takamiya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/text2048/curses_view.rb
|
54
54
|
- lib/text2048/curses_view/colorize.rb
|
55
55
|
- lib/text2048/curses_view/keyboard.rb
|
56
|
+
- lib/text2048/curses_view/lcd.rb
|
56
57
|
- lib/text2048/curses_view/tile.rb
|
57
58
|
- lib/text2048/curses_view/tile_effects.rb
|
58
59
|
- lib/text2048/monkey_patch/array.rb
|
@@ -67,6 +68,7 @@ files:
|
|
67
68
|
- spec/spec_helper.rb
|
68
69
|
- spec/text2048/app_spec.rb
|
69
70
|
- spec/text2048/board_spec.rb
|
71
|
+
- spec/text2048/curses_view/lcd_spec.rb
|
70
72
|
- text2048.gemspec
|
71
73
|
homepage: http://github.com/yasuhito/text2048
|
72
74
|
licenses:
|
@@ -97,6 +99,7 @@ test_files:
|
|
97
99
|
- spec/spec_helper.rb
|
98
100
|
- spec/text2048/app_spec.rb
|
99
101
|
- spec/text2048/board_spec.rb
|
102
|
+
- spec/text2048/curses_view/lcd_spec.rb
|
100
103
|
- features/game_over.feature
|
101
104
|
- features/move_down.feature
|
102
105
|
- features/move_left.feature
|