RubyGrid 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 63c31ea89ff50e5ed3aea13d735dd7da612ea187
4
+ data.tar.gz: cd2f68ec4783d291ce4d02594393a6b62afbbe1e
5
+ SHA512:
6
+ metadata.gz: 9882afb2fc490723dc72b46ddfa2e8aff36bf15c90daf88d8ec62b781262e66e5334e823dcc8a98bb7ce8c8774fe922383412d3b695ff10c7c23d05b41ebb1e7
7
+ data.tar.gz: fffe1ce1a8f852db1e94ad4ed9b4f33bf79ce04307768ca375fc8b1273445361df136b4bad154e02d3909d9ab139fa5a680300807afeffde8fb464250ca5fe97
@@ -0,0 +1,348 @@
1
+ module RubyGrid
2
+ class Grid
3
+ # Grid constructor.
4
+ # +sizex+ and +sizey+::
5
+ # These set the desired size of the grid, 4 by default.
6
+ # +def_value+::
7
+ # The default data to store in a cell by default.
8
+ def initialize(sizex=4, sizey=4, def_value=nil)
9
+ @grid = []
10
+
11
+ # Default Grid size is 4x4
12
+ sizex = 4 unless is_number?(sizex)
13
+ sizey = 4 unless is_number?(sizey)
14
+
15
+ @size_x = sizex
16
+ @size_y = sizey
17
+ @def_value = def_value
18
+
19
+ # Build the grid and insert the default values.
20
+ @size_x.times do |x|
21
+ @grid.push([])
22
+
23
+ @size_y.times do |y|
24
+ @grid[x].push(def_value)
25
+ end
26
+ end
27
+ end
28
+
29
+ public
30
+
31
+ def sizex; @size_x; end
32
+ def sizey; @size_y; end
33
+ def grid; @grid; end
34
+
35
+ # This checks to see if a given x,y pair are within
36
+ # the boundaries of the grid.
37
+ def is_valid?(x, y)
38
+ unless (is_number?(x) and is_number?(y))
39
+ return false
40
+ end
41
+ return ((x >= 0 and x < @size_x) and (y >= 0 and y < @size_y))
42
+ end
43
+
44
+ # Returns the center coordinates of the grid
45
+ def center
46
+ x = (@size_x - 1)/2
47
+ y = (@size_y - 1)/2
48
+ return x,y
49
+ end
50
+
51
+ # Get the data in a given x,y cell.
52
+ # Returns nil if the cell is not valid.
53
+ def get_cell(x, y)
54
+ return @grid[x][y] if is_valid?(x,y)
55
+ end
56
+
57
+ # This method will return a set of cell data in a table.
58
+ # The 'cells' argument should be an array of x,y pairs of
59
+ # the cells being requested.
60
+ def get_cells(cells) # :yields: cell_data
61
+ data = []
62
+
63
+ return data unless cells.respond_to?(:collect)
64
+
65
+ cells.each do |x,y|
66
+ if is_valid?(x,y)
67
+ if block_given?
68
+ yield @grid[x][y]
69
+ else
70
+ data << @grid[x][y]
71
+ end
72
+ end
73
+ end
74
+
75
+ return block_given? ? nil : data
76
+ end
77
+
78
+ # Sets a given x,y cell to the data object
79
+ def set_cell(x,y, obj)
80
+ @grid[x][y] = obj if is_valid?(x,y)
81
+ end
82
+
83
+ # Resets a given x,y cell to the grid default value
84
+ def reset_cell(x,y)
85
+ @grid[x][y] = @def_value if is_valid?(x,y)
86
+ end
87
+
88
+ # Resets the entire grid to the default value
89
+ def reset_all
90
+ @size_x.times do |x|
91
+ @size_y.times do |y|
92
+ @grid[x][y] = @def_value
93
+ end
94
+ end
95
+ end
96
+
97
+ # This method is used to populate multiple cells at once.
98
+ # +data+::
99
+ # This argument must be an Array, with each element
100
+ # consisting of three values: x, y, and the data to
101
+ # set the cell to.
102
+ #
103
+ # Example:
104
+ #
105
+ # d = [[4, 4, "X"], [4, 5, "O"], [5, 4, "O"], [5, 5, "X"]]
106
+ # grid.populate(d)
107
+ #
108
+ # If the object to be populated is nil, it is replaced with
109
+ # the default value.
110
+ def populate(data)
111
+ return unless data.respond_to?(:collect)
112
+
113
+ data.each do |x, y, obj|
114
+ if is_valid?(x,y)
115
+ obj = @def_value if obj.nil?
116
+ @grid[x][y] = obj
117
+ end
118
+ end
119
+ return
120
+ end
121
+
122
+ # This method returns the entire grid's contents in a
123
+ # flat array suitable for feeding to #populate above.
124
+ # Useful for recreating a grid layout.
125
+ # If the +no_default+ argument is non-false, then the
126
+ # returned data Array only contains elements who's
127
+ # cells are not the default value.
128
+ # Returns +nil+ if a block is given.
129
+ def get_contents(no_default=false) # :yields: x, y, cell_data
130
+ data = []
131
+ cell_obj = nil
132
+
133
+ @size_x.times do |x|
134
+ @size_y.times do |y|
135
+ cell_obj = @grid[x][y]
136
+ unless no_default and cell_obj == @def_value
137
+ if block_given?
138
+ yield x, y, cell_obj
139
+ else
140
+ data.push([x,y,cell_obj])
141
+ end
142
+ end
143
+ end
144
+ end
145
+
146
+ return block_given? ? nil : data
147
+
148
+ end
149
+
150
+ # Convienence method to return an x,y vector pair from the
151
+ # GRID_* vector constants. Or nil if there is no such
152
+ # constant.
153
+ def get_vector(vector)
154
+ case vector
155
+ when TOP_LEFT then return -1, -1
156
+ when TOP then return -1, 0
157
+ when TOP_RIGHT then return -1, 1
158
+ when LEFT then return 0, -1
159
+ when CENTER then return 0, 0
160
+ when RIGHT then return 0, 1
161
+ when BOTTOM_LEFT then return 1, -1
162
+ when BOTTOM then return 1, 0
163
+ when BOTTOM_RIGHT then return 1, 1
164
+ else
165
+ return nil, nil
166
+ end
167
+ end
168
+
169
+ # Get a cell's neighbor in a given vector.
170
+ def get_neighbor(x,y, vector)
171
+ vx, vy = get_vector(vector)
172
+
173
+ if vx and vy
174
+ x = x + vx
175
+ y = y + vy
176
+ return @grid[x][y] if is_valid?(x,y)
177
+ end
178
+ end
179
+
180
+ # Will return an Array of 8 elements, with each element
181
+ # representing one of the 8 neighbors for the given
182
+ # x,y cell. Each element of the returned Array will consist
183
+ # of the x,y cell pair, plus the data stored there, suitable
184
+ # for use of the populate method. If the neighbor cell is
185
+ # outside the grid, then [nil, nil, OUTSIDE] is used
186
+ # for the value.
187
+ # If the given x,y values are not sane, an empty Array
188
+ # is returned instead.
189
+ def get_neighbors(x,y) # :yields: x, y, cell_data
190
+ data = []
191
+
192
+ return data unless is_valid?(x,y)
193
+
194
+ # The vectors used are x,y pairs between -1 and +1
195
+ # for the given x,y cell.
196
+ # IE:
197
+ # (-1, -1) (0, -1) (1, -1)
198
+ # (-1, 0) (0, 0) (1, 0)
199
+ # (-1, 1) (0, 1) (1, 1)
200
+ # Value of 0,0 is ignored, since that is the cell
201
+ # we are working with! :D
202
+ for gx in -1..1
203
+ for gy in -1..1
204
+ vx = x + gx
205
+ vy = y + gy
206
+
207
+ unless gx == 0 and gy == 0
208
+ if is_valid?(vx,vy)
209
+ if block_given?
210
+ yield vx, vy, @grid[vx][vy]
211
+ else
212
+ data.push([vx, vy, @grid[vx][vy]])
213
+ end
214
+ else
215
+ if block_given?
216
+ yield nil, nil, OUTSIDE
217
+ else
218
+ data.push([nil, nil, OUTSIDE])
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+ return block_given? ? nil : data
226
+ end
227
+
228
+ # This method will change the grid size. If the new size is
229
+ # smaller than the old size, data in the cells now 'outside'
230
+ # the grid is lost. If the grid is now larger, new cells are
231
+ # filled with the default value given when the grid was first
232
+ # created.
233
+ def resize(newx, newy)
234
+ unless is_number?(newx) and is_number?(newy)
235
+ return false
236
+ end
237
+
238
+ # Save old data
239
+ c = get_contents
240
+
241
+ # Reset grid.
242
+ @grid.clear
243
+
244
+ # Set the new sizes.
245
+ @size_x = newx
246
+ @size_y = newy
247
+
248
+ newx.times do |x|
249
+ @grid.push([])
250
+
251
+ newy.times do |y|
252
+ @grid[x].push(@def_value)
253
+ end
254
+ end
255
+
256
+ # Insert the old contents
257
+ populate(c)
258
+
259
+ return true
260
+ end
261
+
262
+ # This method returns an Array of all values in a given
263
+ # row 'x' value.
264
+ # If given a block, then the data in each cell in the row
265
+ # is passed to the block.
266
+ def get_row(x) # :yields: cell_data
267
+ row = []
268
+
269
+ if is_number?(x) and (x >= 0 and x < @size_x)
270
+ row = @grid[x]
271
+ end
272
+
273
+ if block_given?
274
+ row.each do |obj|
275
+ yield obj
276
+ end
277
+ end
278
+
279
+ return block_given? ? nil : row
280
+ end
281
+
282
+ # This method returns an Array of all values in a given
283
+ # column 'y' value.
284
+ # If given a block, then the data in each cell in the column
285
+ # is passed to the block.
286
+ def get_column(y) # :yields: cell_data
287
+ col = []
288
+
289
+ if is_number?(y) and (y >= 0 and y < @size_y)
290
+ @size_x.times do |x|
291
+ if block_given?
292
+ yield @grid[x][y]
293
+ else
294
+ col.push(@grid[x][y])
295
+ end
296
+ end
297
+ end
298
+
299
+ return block_given? ? nil : col
300
+ end
301
+
302
+ # This method traverses a line of cells, from a given x,y
303
+ # going in +vector+ direction. The vector arg is one of the
304
+ # Grid::* traversal constants. This will return an Array of
305
+ # the data of the cells along the traversal path or nil if
306
+ # the original x,y is not valid or if the vector is not one
307
+ # of the constant values. The first element of the Array
308
+ # will be the first cell -after- the x, y cell given as the
309
+ # argument.
310
+ # In the returned Array, each element will be in the format
311
+ # of [x, y, obj], suitable for #populate.
312
+ # If a block is given, then each x, y, and data is passed to
313
+ # the block, and nil is returned.
314
+ def traverse(x, y, vector) # :yields: x, y, cell_data
315
+ data = []
316
+
317
+ if is_valid?(x,y)
318
+ vx, vy = get_vector(vector)
319
+
320
+ return data unless vx and vy
321
+
322
+ gx = x + vx
323
+ gy = y + vy
324
+
325
+ while is_valid?(gx, gy)
326
+ obj = @grid[gx,gy]
327
+
328
+ if block_given?
329
+ yield gx, gy, obj
330
+ else
331
+ data.push([gx, gy, obj])
332
+ end
333
+
334
+ gx = gx + vx
335
+ gy = gy + vy
336
+ end
337
+ end
338
+
339
+ return block_given? ? nil : data
340
+ end
341
+
342
+ private
343
+ def is_number?(n)
344
+ (n.respond_to?(:even?) and not n.nil?)
345
+ end
346
+
347
+ end
348
+ end
@@ -0,0 +1,4 @@
1
+ module RubyGrid
2
+ VERSION = '1.0.0'
3
+ MAJOR, MINOR, TINY = VERSION.split('.')
4
+ end
data/lib/rubygrid.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'rubygrid/version'
2
+ require 'rubygrid/grid'
3
+
4
+ module RubyGrid
5
+
6
+ # Some constant values. These are set as strings instead of
7
+ # integer values to prevent clashes of data.
8
+ OUTSIDE = "OUTSIDE".freeze
9
+ NOT_VALID = "NOT_VALID".freeze
10
+ NIL_VALUE = "NIL_VALUE".freeze
11
+
12
+ # Traversal Vector Constants
13
+ TOP_LEFT = 1
14
+ TOP = 2
15
+ TOP_RIGHT = 3
16
+ LEFT = 4
17
+ CENTER = 5
18
+ RIGHT = 6
19
+ BOTTOM_LEFT = 7
20
+ BOTTOM = 8
21
+ BOTTOM_RIGHT = 9
22
+
23
+ # Wrapper for Grid#new
24
+ def RubyGrid.create(x, y, value)
25
+ return Grid.new(x, y, value)
26
+ end
27
+
28
+ # Yields each of the vector constants in turn, from top-left
29
+ # to bottom-right.
30
+ def RubyGrid.get_all_vectors # :yields: vector_constant
31
+ [TOP_LEFT,
32
+ TOP,
33
+ TOP_RIGHT,
34
+ LEFT,
35
+ CENTER,
36
+ RIGHT,
37
+ BOTTOM_LEFT,
38
+ BOTTOM,
39
+ BOTTOM_RIGHT
40
+ ].each do |v|
41
+ yield v # :yields: vector_constant
42
+ end
43
+ end
44
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: RubyGrid
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Randy Carnahan
8
+ - yacn
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-08-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: minitest
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: guard
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: guard-minitest
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ description: A simple gem for grids in Ruby
85
+ email: admin@yacn.pw
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - lib/rubygrid.rb
91
+ - lib/rubygrid/version.rb
92
+ - lib/rubygrid/grid.rb
93
+ homepage: https://github.com/yacn/Ruby-Grid
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.0.6
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Grid gem for Games or whatever else you can think of
117
+ test_files: []