kaki-lifegame 0.0.3 → 0.0.4
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/example_data/kaki-lifegame_field_sample1.dat +1 -0
- data/lib/kaki-lifegame.rb +112 -42
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89a6f9f72edd2d93a8bedfdb4203426517422582
|
4
|
+
data.tar.gz: 99fcc35b4a6d739bc2ad394976c264588bd05b2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 187b2b4f5122d8abe47fb33956742f80e19719ed68f4b8558dc9735cca698225ed31cff6af052fa222db617859bca3c38a69ed5abea888852ee4c68c18a3c3a8
|
7
|
+
data.tar.gz: 4bb812802145dd5828377f6c304d39a9c4d59aa003a7e14f6ba6aff85e52955a99a0d64016af988b809894269bc6d6e245133a197b012211ae5538da9e26e576
|
@@ -1,3 +1,4 @@
|
|
1
|
+
Size : (large)
|
1
2
|
Step : 0
|
2
3
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
3
4
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
data/lib/kaki-lifegame.rb
CHANGED
@@ -2,17 +2,19 @@ require 'gtk2'
|
|
2
2
|
|
3
3
|
module LifeGame
|
4
4
|
class Field
|
5
|
-
Width, Height = 85, 60
|
6
5
|
MG = 4
|
7
6
|
|
8
7
|
def initialize
|
8
|
+
@width, @height = 70, 50
|
9
|
+
@size = :small
|
9
10
|
clear
|
10
11
|
@step = @stored_step = 0
|
11
12
|
@reserved = copy
|
12
13
|
@store = []
|
13
14
|
end
|
14
|
-
attr_reader :step
|
15
|
-
|
15
|
+
attr_reader :step, :size
|
16
|
+
attr_accessor :width, :height
|
17
|
+
|
16
18
|
def set_cell(x, y)
|
17
19
|
@field[y + MG][x + MG] = 1
|
18
20
|
end
|
@@ -48,13 +50,13 @@ module LifeGame
|
|
48
50
|
end
|
49
51
|
|
50
52
|
def each_cell
|
51
|
-
(
|
52
|
-
(
|
53
|
+
(@height + (MG - 1) * 2).times do |y|
|
54
|
+
(@width + (MG - 1) * 2).times {|x| yield(x - MG + 1, y - MG + 1)}
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
56
58
|
def new_field
|
57
|
-
Array.new(
|
59
|
+
Array.new(@height + MG * 2) {Array.new(@width + MG * 2, 0)}
|
58
60
|
end
|
59
61
|
|
60
62
|
def copy
|
@@ -84,17 +86,27 @@ module LifeGame
|
|
84
86
|
end
|
85
87
|
|
86
88
|
def load(file_name)
|
87
|
-
|
89
|
+
size = nil
|
88
90
|
open(file_name, "r") do |io|
|
91
|
+
m = /^Size : \((.+)\)$/.match(io.gets.chomp)
|
92
|
+
unless m
|
93
|
+
puts "読み込みエラーです"
|
94
|
+
break
|
95
|
+
end
|
96
|
+
@field = []
|
97
|
+
size = m[1].to_sym
|
89
98
|
@step = io.gets.chomp.scan(/\d+/)[0].to_i
|
90
99
|
io.each_line do |line|
|
91
100
|
@field << line.chomp.split(",").map(&:to_i)
|
92
101
|
end
|
93
102
|
end
|
103
|
+
return false unless size
|
104
|
+
change_window_size(size, false)
|
94
105
|
end
|
95
106
|
|
96
107
|
def save(file_name)
|
97
108
|
open(file_name, "w") do |io|
|
109
|
+
io.puts "Size : (#{@size.to_s})"
|
98
110
|
io.puts "Step : #{@step}"
|
99
111
|
@field.each {|x| io.puts x.map(&:to_s).join(",")}
|
100
112
|
end
|
@@ -113,6 +125,17 @@ module LifeGame
|
|
113
125
|
@field = @store.pop
|
114
126
|
@step -= 1
|
115
127
|
end
|
128
|
+
|
129
|
+
def change_window_size(size, f = true)
|
130
|
+
return false if @size == size
|
131
|
+
@size = size
|
132
|
+
@width, @height = (@size == :small) ? [70, 50] : [85, 60]
|
133
|
+
clear if f
|
134
|
+
@step = @stored_step = 0
|
135
|
+
@reserved = copy
|
136
|
+
@store = []
|
137
|
+
true
|
138
|
+
end
|
116
139
|
end
|
117
140
|
|
118
141
|
class FieldArea < Gtk::DrawingArea
|
@@ -120,13 +143,14 @@ module LifeGame
|
|
120
143
|
Space = 1
|
121
144
|
|
122
145
|
L = CellSize + Space * 2
|
123
|
-
AreaW, AreaH = Field::Width * L, Field::Height * L
|
124
146
|
|
125
147
|
WaitChange = 50
|
126
148
|
|
127
149
|
def initialize(field)
|
128
150
|
super()
|
129
|
-
|
151
|
+
|
152
|
+
@areaw, @areah = field.width * L, field.height * L
|
153
|
+
set_size_request(@areaw, @areah)
|
130
154
|
|
131
155
|
@f = field
|
132
156
|
|
@@ -169,6 +193,7 @@ module LifeGame
|
|
169
193
|
set_wait_time
|
170
194
|
end
|
171
195
|
attr_writer :time_goes, :label1, :label2
|
196
|
+
attr_reader :areaw, :areah, :size
|
172
197
|
|
173
198
|
def set_color(color_name)
|
174
199
|
@gc.rgb_fg_color = @color[color_name]
|
@@ -220,8 +245,8 @@ module LifeGame
|
|
220
245
|
end
|
221
246
|
|
222
247
|
def each_cell
|
223
|
-
|
224
|
-
|
248
|
+
@f.height.times do |y|
|
249
|
+
@f.width.times {|x| yield(x, y)}
|
225
250
|
end
|
226
251
|
end
|
227
252
|
|
@@ -235,7 +260,7 @@ module LifeGame
|
|
235
260
|
def scatter
|
236
261
|
co1 = co2 = 0
|
237
262
|
while co1 < 100 and co2 < 5000
|
238
|
-
x, y = rand(
|
263
|
+
x, y = rand(@f.width), rand(@f.height)
|
239
264
|
if @f.get_cell(x, y).zero?
|
240
265
|
set_cell(x, y)
|
241
266
|
co1 += 1
|
@@ -250,14 +275,16 @@ module LifeGame
|
|
250
275
|
end
|
251
276
|
|
252
277
|
def load_file(file_name)
|
253
|
-
@f.load(file_name)
|
278
|
+
is_change = @f.load(file_name)
|
279
|
+
area_size_change if is_change
|
254
280
|
redraw
|
255
281
|
show_step
|
282
|
+
return is_change
|
256
283
|
end
|
257
284
|
|
258
285
|
def background_renewal
|
259
286
|
set_color(@grid ? :grid_color : :black)
|
260
|
-
window.draw_rectangle(@gc, true, 0, 0,
|
287
|
+
window.draw_rectangle(@gc, true, 0, 0, @areaw, @areah)
|
261
288
|
redraw
|
262
289
|
end
|
263
290
|
|
@@ -301,13 +328,31 @@ module LifeGame
|
|
301
328
|
redraw
|
302
329
|
show_step
|
303
330
|
end
|
331
|
+
|
332
|
+
def change_window_size(size)
|
333
|
+
if @f.change_window_size(size)
|
334
|
+
area_size_change
|
335
|
+
show_step
|
336
|
+
true
|
337
|
+
else
|
338
|
+
false
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
def area_size_change
|
343
|
+
@areaw, @areah = @f.width * L, @f.height * L
|
344
|
+
end
|
304
345
|
end
|
305
346
|
|
306
347
|
class SideBar < Gtk::VBox
|
307
|
-
|
348
|
+
MGN = 3
|
349
|
+
SideBar_W = 130
|
350
|
+
|
351
|
+
def initialize(field_area, main_window)
|
308
352
|
super()
|
309
|
-
set_size_request(
|
353
|
+
set_size_request(SideBar_W, field_area.areah)
|
310
354
|
@farea = field_area
|
355
|
+
@mainw = main_window
|
311
356
|
@edit_mode = true
|
312
357
|
|
313
358
|
set_box1
|
@@ -347,12 +392,12 @@ module LifeGame
|
|
347
392
|
|
348
393
|
box = Gtk::VBox.new
|
349
394
|
pack_start(box, false, false, 0)
|
350
|
-
box.pack_start(start_bt, false, false,
|
351
|
-
box.pack_start(stop_bt , false, false,
|
352
|
-
box.pack_start(step_bt , false, false,
|
353
|
-
box.pack_start(back_bt , false, false,
|
354
|
-
box.pack_start(l, false, false,
|
355
|
-
box.pack_start(Gtk::HSeparator.new, false, false,
|
395
|
+
box.pack_start(start_bt, false, false, MGN)
|
396
|
+
box.pack_start(stop_bt , false, false, MGN)
|
397
|
+
box.pack_start(step_bt , false, false, MGN)
|
398
|
+
box.pack_start(back_bt , false, false, MGN)
|
399
|
+
box.pack_start(l, false, false, MGN)
|
400
|
+
box.pack_start(Gtk::HSeparator.new, false, false, 5)
|
356
401
|
end
|
357
402
|
|
358
403
|
def set_box2
|
@@ -384,10 +429,10 @@ module LifeGame
|
|
384
429
|
|
385
430
|
box = Gtk::VBox.new
|
386
431
|
pack_start(box, false, false, 0)
|
387
|
-
box.pack_start(l1 , false, false,
|
388
|
-
box.pack_start(small_box, false, false,
|
389
|
-
box.pack_start(l2 , false, false,
|
390
|
-
box.pack_start(Gtk::HSeparator.new, false, false,
|
432
|
+
box.pack_start(l1 , false, false, MGN)
|
433
|
+
box.pack_start(small_box, false, false, MGN)
|
434
|
+
box.pack_start(l2 , false, false, MGN)
|
435
|
+
box.pack_start(Gtk::HSeparator.new, false, false, 5)
|
391
436
|
end
|
392
437
|
|
393
438
|
def set_box3
|
@@ -423,11 +468,11 @@ module LifeGame
|
|
423
468
|
|
424
469
|
box = Gtk::VBox.new
|
425
470
|
pack_start(box, false, false, 0)
|
426
|
-
box.pack_start(scatter_bt, false, false,
|
427
|
-
box.pack_start(grid_bt , false, false,
|
428
|
-
box.pack_start(small_box , false, false,
|
429
|
-
box.pack_start(clear_bt , false, false,
|
430
|
-
box.pack_start(Gtk::HSeparator.new, false, false,
|
471
|
+
box.pack_start(scatter_bt, false, false, MGN)
|
472
|
+
box.pack_start(grid_bt , false, false, MGN)
|
473
|
+
box.pack_start(small_box , false, false, MGN)
|
474
|
+
box.pack_start(clear_bt , false, false, MGN)
|
475
|
+
box.pack_start(Gtk::HSeparator.new, false, false, 5)
|
431
476
|
end
|
432
477
|
|
433
478
|
def set_box4
|
@@ -444,9 +489,9 @@ module LifeGame
|
|
444
489
|
|
445
490
|
box = Gtk::VBox.new
|
446
491
|
pack_start(box, false, false, 0)
|
447
|
-
box.pack_start(preserve_bt, false, false,
|
448
|
-
box.pack_start(restore_bt , false, false,
|
449
|
-
box.pack_start(Gtk::HSeparator.new, false, false,
|
492
|
+
box.pack_start(preserve_bt, false, false, MGN)
|
493
|
+
box.pack_start(restore_bt , false, false, MGN)
|
494
|
+
box.pack_start(Gtk::HSeparator.new, false, false, 5)
|
450
495
|
end
|
451
496
|
|
452
497
|
def set_box5
|
@@ -463,27 +508,52 @@ module LifeGame
|
|
463
508
|
load_bt.signal_connect("clicked") do
|
464
509
|
if @edit_mode
|
465
510
|
file_name = select_file("Load File", Gtk::FileChooser::ACTION_OPEN)
|
466
|
-
|
511
|
+
if file_name
|
512
|
+
main_window_change(@farea.load_file(file_name))
|
513
|
+
end
|
467
514
|
end
|
468
515
|
end
|
469
516
|
|
470
517
|
box = Gtk::VBox.new
|
471
518
|
pack_start(box, false, false, 0)
|
472
|
-
box.pack_start(save_bt, false, false,
|
473
|
-
box.pack_start(load_bt, false, false,
|
474
|
-
box.pack_start(Gtk::HSeparator.new, false, false,
|
519
|
+
box.pack_start(save_bt, false, false, MGN)
|
520
|
+
box.pack_start(load_bt, false, false, MGN)
|
521
|
+
box.pack_start(Gtk::HSeparator.new, false, false, MGN)
|
475
522
|
end
|
476
523
|
|
477
524
|
def set_box6
|
478
525
|
close_bt = Gtk::Button.new("終了")
|
526
|
+
large_bt = Gtk::Button.new("大")
|
527
|
+
small_bt = Gtk::Button.new("小")
|
479
528
|
|
480
529
|
close_bt.signal_connect("clicked") do
|
481
530
|
Gtk.main_quit if @edit_mode
|
482
531
|
end
|
483
532
|
|
533
|
+
large_bt.signal_connect("clicked") do
|
534
|
+
change_window_size(:large) if @edit_mode
|
535
|
+
end
|
536
|
+
|
537
|
+
small_bt.signal_connect("clicked") do
|
538
|
+
change_window_size(:small) if @edit_mode
|
539
|
+
end
|
540
|
+
|
541
|
+
small_box = Gtk::HBox.new
|
542
|
+
small_box.pack_start(large_bt , true, true, 1)
|
543
|
+
small_box.pack_start(small_bt, true, true, 1)
|
544
|
+
|
484
545
|
box = Gtk::VBox.new
|
485
546
|
pack_start(box, false, false, 0)
|
486
|
-
box.pack_start(
|
547
|
+
box.pack_start(small_box, false, false, MGN)
|
548
|
+
box.pack_start(close_bt , false, false, MGN)
|
549
|
+
end
|
550
|
+
|
551
|
+
def change_window_size(size)
|
552
|
+
main_window_change(@farea.change_window_size(size))
|
553
|
+
end
|
554
|
+
|
555
|
+
def main_window_change(is_change)
|
556
|
+
@mainw.set_size_request(@farea.areaw + SideBar_W, @farea.areah) if is_change
|
487
557
|
end
|
488
558
|
|
489
559
|
def select_file(title, mode)
|
@@ -507,12 +577,12 @@ module LifeGame
|
|
507
577
|
|
508
578
|
field = Field.new
|
509
579
|
field_area = FieldArea.new(field)
|
510
|
-
side_bar = SideBar.new(field_area)
|
580
|
+
side_bar = SideBar.new(field_area, self)
|
511
581
|
|
512
582
|
box = Gtk::HBox.new
|
513
583
|
add(box)
|
514
|
-
box.pack_start(field_area, true, true, 0)
|
515
|
-
box.pack_start(side_bar ,
|
584
|
+
box.pack_start(field_area, true , true, 0)
|
585
|
+
box.pack_start(side_bar , false, true, 0)
|
516
586
|
|
517
587
|
signal_connect("destroy") {Gtk.main_quit}
|
518
588
|
show_all
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kaki-lifegame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- obelisk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gtk2
|