Kolonie bakterii (Conwayova hra života)

Ostatní jazyky Ruby Kolonie bakterii (Conwayova hra života)

Ukázkový program Kolonie bakterií (Conwayova hra života) včetně zdrojového kódu v jazyce Ruby.

require 'rexml/document'

class Colony

  # outputs colony
  def output(target)
    @height.times do |h|
      @width.times do |w|
        if (@cells[w][h])
          target.print "*"
        else
          target.print "."
        end
      end
      target.puts
    end
  end

  # performs one lifecycle
  def live
    # awful duplication of an array
    @old_cells = []
    (@width).times do |w|
      @row = []
      (@height).times do |h|
        @row << @cells[w][h]
      end
      @old_cells << @row
    end
    # and then the God comes
    @height.times do |h|
      @width.times do |w|
        # will it survive?
        @cells[w][h] = false
        if @old_cells[w][h]  # ziva bunka
          @cells[w][h] = true if (get_neighbours(w, h) == 2) || (get_neighbours(w, h) == 3)
        end
        if not @old_cells[w][h]  # mrtva bunka
          @cells[w][h] = true if (get_neighbours(w, h) == 3)
        end
      end
    end
  end

  # loads cells
  def load(fname)
    # does input file exists?
    if not File.exists?(fname)
      puts "Input file does not exists"
      exit
    end
    File.open(fname) do |f|
      doc = REXML::Document.new(f)
      @width = doc.root.elements["dimensions"].attributes["x"].to_i
      if (doc.root.elements["dimensions"].attributes.has_key?("y"))
        @height = doc.root.elements["dimensions"].attributes["y"].to_i
      else
        @height = @width
      end
      # creating matrix - also awful
      @cells = []
      (@width).times do |w|
        @row = []
        (@height).times { @row << false }
        @cells << @row
      end
      # filling matrix
      doc.root.elements["cells"].elements.each do |element|
        x = element.attributes["x"].to_i - 1
        y = element.attributes["y"].to_i - 1
        @cells[x][y] = true
      end
    end
  end

  private

  #  returns number of neighbouring cells
  def get_neighbours(x, y)
    count = 0
    # classic rectangle
    3.times do |h|
      3.times do |w|
        posx = x + w - 1
        posy = y + h - 1
        # placement correction
        posx = @width - 1 if (posx < 0)
        posx = 0 if (posx > @width - 1)
        posy = @height - 1 if (posy < 0)
        posy = 0 if (posy > @height - 1)
        if (@old_cells[posx][posy])
          count += 1
        end
      end
    end
    count -= 1 if (@old_cells[x][y]) # if center cell is alive I have to remove it
    return count
  end

end


# ------------ main program -----------


if (ARGV[0].length == 0)
  puts "Not enought arguments"
  exit
end

colony = Colony.new

colony.load(ARGV[0])

puts "Welcome to Conway's game of life"
puts "--------------------------------"
colony.output(STDOUT)
# commnads processing loop
command = ""
while (command != "x") do
  print "Enter command: "
  command = STDIN.gets.strip
  count = 1                                            # n with param.
  if command =˜ /ˆn\s+\d+/
    count = command.split(" ").last.to_i
    command = "n"
  end
  if (command =˜ /ˆn$/) || (command == "")             #n processing
    count.times { colony.live }
    colony.output(STDOUT)
  elsif command =˜ /ˆs\s+\w+\.[A-Za-z]{3}$/            # s
    begin
      fname = command.split(" ").last
      begin
        File.open(fname,"w") { |f| colony.output(f) }
        puts "Successfuly saved"
      rescue
        puts "Cannot save file"
      end
    end
  elsif (command =˜ /ˆ(h|\?)$/)                        # h
    puts "Help"
    puts "----"
    puts "n - perform lifecycle"
    puts "n y - perform next y lifecycles"
    puts "s filename.ext - saves colony into file"
    puts "h or ? -this help"
    puts "x - terminate"
  else
    puts "Unknows command or parametter, type 'h' to access help" if (command != "x")
  end

end

puts "Terminated."


 

Stáhnout

Staženo 440x (1.96 kB)
Aplikace je včetně zdrojových kódů v jazyce Ruby

 

  Aktivity (1)

Program pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
Ruby
Miniatura
Následující článek
Ruby v Linuxu - GTK

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!