Created
September 12, 2012 11:59
-
-
Save wojtekmach/3706162 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class Game | |
| XN = 100 | |
| YN = 100 | |
| def initialize | |
| @cells = {} | |
| end | |
| def add(x, y) | |
| @cells["#{x}-#{y}"] = 1 | |
| end | |
| def del(x, y) | |
| @cells.delete("#{x}-#{y}") | |
| end | |
| def alive?(x, y) | |
| @cells["#{x}-#{y}"] == 1 | |
| end | |
| def dead?(x, y) | |
| !alive?(x, y) | |
| end | |
| def neighbours(x, y) | |
| count = 0 | |
| if alive?(x - 1, y - 1) | |
| count += 1 | |
| end | |
| if alive?(x - 1, y) | |
| count += 1 | |
| end | |
| if alive?(x - 1, y + 1) | |
| count += 1 | |
| end | |
| if alive?(x, y - 1) | |
| count += 1 | |
| end | |
| if alive?(x, y + 1) | |
| count += 1 | |
| end | |
| if alive?(x + 1, y - 1) | |
| count += 1 | |
| end | |
| if alive?(x + 1, y) | |
| count += 1 | |
| end | |
| if alive?(x + 1, y + 1) | |
| count += 1 | |
| end | |
| count | |
| end | |
| def run! | |
| for_del = [] | |
| for_add = [] | |
| @cells.each do |coords, _| | |
| x, y = coords.split('-').map(&:to_i) | |
| if neighbours(x, y) < 2 | |
| for_del << [x, y] | |
| end | |
| if neighbours(x, y) > 3 | |
| for_del << [x, y] | |
| end | |
| end | |
| XN.times do |x| | |
| YN.times do |y| | |
| for_add << [x, y] if dead?(x, y) && neighbours(x, y) == 3 | |
| end | |
| end | |
| for_del.each { |x, y| del(x, y) } | |
| for_add.each { |x, y| add(x, y) } | |
| end | |
| end | |
| describe Game do | |
| let(:game) { Game.new } | |
| specify '#alive?' do | |
| game.add(0, 0) | |
| game.alive?(0, 0).should be_true | |
| game.alive?(0, 1).should be_false | |
| end | |
| specify '#del' do | |
| game.add(0, 0) | |
| game.del(0, 0) | |
| game.alive?(0, 0).should be_false | |
| end | |
| specify '#neighbours' do | |
| game.add(1, 1) | |
| game.add(1, 2) | |
| game.add(3, 3) | |
| game.add(3, 4) | |
| game.add(4, 4) | |
| game.neighbours(1, 1).should == 1 | |
| game.neighbours(1, 2).should == 1 | |
| game.neighbours(3, 3).should == 2 | |
| end | |
| describe '#run!' do | |
| it 'cell dies when less than 2 neighbours' do | |
| game.add(2, 2) | |
| game.run! | |
| game.alive?(2, 2).should be_false | |
| end | |
| it 'cell lives when 2 neighbours' do | |
| game.add(2, 2) | |
| game.add(2, 3) | |
| game.add(3, 3) | |
| game.run! | |
| game.alive?(2, 2).should be_true | |
| end | |
| it 'cell lives when 3 neighbours' do | |
| game.add(2, 2) | |
| game.add(2, 3) | |
| game.add(3, 3) | |
| game.add(1, 1) | |
| game.run! | |
| game.alive?(2, 2).should be_true | |
| end | |
| it 'cell dies when more than 3 neighbours' do | |
| game.add(2, 2) | |
| game.add(2, 3) | |
| game.add(3, 3) | |
| game.add(1, 1) | |
| game.add(1, 2) | |
| game.run! | |
| game.alive?(2, 2).should be_false | |
| end | |
| it 'cell is reviewed when 3 neighbours' do | |
| game.add(2, 3) | |
| game.add(3, 3) | |
| game.add(1, 1) | |
| game.run! | |
| game.alive?(2, 2).should be_true | |
| end | |
| it 'cell is not reviewed when 4 neighbours' do | |
| game.add(2, 3) | |
| game.add(3, 3) | |
| game.add(1, 1) | |
| game.add(1, 2) | |
| game.run! | |
| game.alive?(2, 2).should be_false | |
| end | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment