Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
BF extended 2022

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žením následujícího souboru souhlasíš s licenčními podmínkami

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

 

Všechny články v sekci
Ruby
Program pro vás napsal David Čápka
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity

 

 

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í!