Как визуализировать мою программу ruby, которая имитирует рост дерева? - PullRequest
0 голосов
/ 26 октября 2018

Как часть учебника Cpine введите описание ссылки здесь , я использовал Ruby для написания программы, которая имитирует рост апельсинового дерева: 1. Вы прививаете это 2. Вы ждете 3. растет 4. Вы можете собрать свои плоды и так далее ...

Теперь я хотел бы представить это как можно проще. У вас есть идеи или предложения о том, как это сделать? То есть предоставить ему интерактивный пользовательский интерфейс, который фактически показывает пользователю дерево по мере его роста? Чем проще, тем лучше.

Вот код:

class OrangeTree

  def initialize
    @age = 0
    @orangeCount = 0
    @height = 0
    puts "You planted a tree"
    height
    countTheOranges
    waitOneYear
  end

  def waitOneYear
    puts "Do you want to wait another year?"
    wantsToWait = gets.downcase.chomp
    if wantsToWait == "yes"
      puts
      oneYearPasses
    else
      puts "Goodbye"
      exit
    end
  end

  def height
    puts "The tree is #{@height} ft tall"
  end

  def oneYearPasses
    @orangeCount = 0
    puts "Another year has passed"
    @age = @age + 1
    puts "The tree is #{@age.to_s} years old"
    @height = @height + 1
    height
    orangeGrowth
    countTheOranges
    pickAnOrange
    waitOneYear
  end

  def orangeGrowth
    @orangeCount = @orangeCount + @age - 3
  end

  def countTheOranges
    if @orangeCount < 1
      puts "There are still no oranges"
    elsif @orangeCount == 1
      puts "There is one orange on the tree"
      puts "Would you like to eat an orange?"
      @wantsApple = gets.downcase.chomp
    else
    puts "There are #{@orangeCount} oranges on the tree"
    puts "Would you like to eat an orange?"
    @wantsApple = gets.downcase.chomp
    end
  end

  def pickAnOrange
    if @orangeCount > 0
      if @wantsApple == "yes"
        @orangeCount = @orangeCount - 1
        puts "That was delicious"
        if @orangeCount < 1
          puts "There are no more oranges left"
        elsif @orangeCount == 1
          puts "There is one more orange left"
        else
          puts "There are #{@orangeCount} oranges left"
          puts "Would you like another one?"
          @wantsApple = gets.downcase.chomp
          if @wantsApple == "yes"
            pickAnOrange
          end
        end
      else
        puts "Alright, hombre"
      end
    end
  end

end

tree = OrangeTree.new

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Что ж, возможно, это глупая идея, но она должна работать, не изменяя вашу программу, так что подбирайте текст для визуального представления (описания) дерева, возможно, вы можете использовать ASCII-диаграмму дерева

=> :draw_small_tree
[2] pry(main)> draw_small_tree
                                   # #### ####
                                ### /#|### |/####
                               ##/#/ ||/##/_/##/_#
                             ###  /###|/ / # ###
                           ##__#_## | #/###_/_####
                          ## #### #  #| /  #### ##/##
                           __#_--###`  |{,###---###-~
                                      }{
                                      }}{
                                      }}{
                                 ejm  {{}
                                , -=-~{ .-^- _
                                      `}
                                       {
=> nil

def draw_small_tree
  tree = <<-EOF
                                    # #### ####
                                ### \/#|### |/####
                               ##\/#/ \||/##/_/##/_#
                             ###  \/###|/ \/ # ###
                           ##_\_#\_\## | #/###_/_####
                          ## #### # \ #| /  #### ##/##
                           __#_--###`  |{,###---###-~
                                     \ }{
                                      }}{
                                      }}{
                                 ejm  {{}
                                , -=-~{ .-^- _
                                      `}
                                       {
         EOF
puts tree
end

Вы можете зайти в Google, чтобы получить больше представлений в виде дерева ASCII

0 голосов
/ 02 ноября 2018

В итоге я использовал комбинацию ответов iGian и anquegi (СПАСИБО!).

Вы можете попробовать игру по адресу: https://repl.it/@benisburgers/OrangeTree

class OrangeTree

  def initialize
    @age = 0
    @orangeCount = 0
    @height = 0
    puts "Welcome to the orange-tree game. You can leave the game at any time by typing 'exit'. "
    puts "Would you like to plant an orange tree?"
    getFirstInput
  end

  def getFirstInput
    @firstInput = gets.downcase.chomp
    if @firstInput == 'yes'
      drawTree
      puts @tree
      puts "Congratulations. You have planted an orange tree"
      puts "There are still no oranges. Would you like to wait a few more years?"
      waitFewYears?
    elsif @firstInput == 'no'
      puts "Goodbye"
      exit
    elsif @firstInput == "exit"
      puts "Goodbye"
      exit
    else
      puts "Please type 'yes', 'no', or 'exit'"
      getFirstInput
    end
  end

  def waitFewYears?
    @input = gets.downcase.chomp
    if @input == 'yes'
      puts "Here you go"
      @age = 4
      orangeGrowth
      countTheOranges
    elsif @input == 'no'
      puts "Gooybye"
      exit
    elsif @input == 'exit'
      puts "Goodbye"
      exit
    else
      puts "Please type 'yes', 'no', or 'exit'"
      waitFewYears?
    end
  end

  def waitOneYear?
    puts "Do you want to wait another year?"
    @wantsToWait = gets.downcase.chomp
    if @wantsToWait == "yes"
      puts
      oneYearPasses
    elsif @wantsToWait == "no"
      puts "Goodbye"
      exit
    elsif @wantsToWait == "exit"
      puts "Goodbye"
      exit
    else
      puts "Please type 'yes', 'no', or 'exit'"
      waitOneYear?
    end
  end

  def oneYearPasses
    @orangeCount = 0
    @tree.replace(@originalTree)
    puts "Another year has passed"
    @age = @age + 1
    puts "The tree is #{@age.to_s} years old"
    @height = @height + 1
    orangeGrowth
    countTheOranges
    pickAnOrange?
  end

  def orangeGrowth
    if @age < 20
      @orangeCount = @orangeCount + @age - 3
    else
      @orangeCount = 17
    end
    i = 0
    while i < @orangeCount
      @tree["_"] = "?"
      i = i + 1
    end
    puts @tree
  end

  def countTheOranges
    if @orangeCount < 1
      puts "There are still no oranges"
    elsif @orangeCount == 1
      puts "There is one orange on the tree"
      pickAnOrange?
    else
    puts "There are #{@orangeCount} oranges on the tree"
    pickAnOrange?
    end
  end

  def pickAnOrange?
    puts "Would you like to pick an orange?"
    @wantsApple = gets.downcase.chomp
    if @orangeCount > 0
      if @wantsApple == "yes"
        @orangeCount = @orangeCount - 1
        @tree["?"] = "_"
        puts @tree
        puts "That was delicious"
        if @orangeCount < 1
          puts "There are no more oranges left"
        elsif @orangeCount == 1
          puts "There is one more orange left"
          pickAnOrange?
        else
          puts "There are #{@orangeCount} oranges left"
          pickAnOrange?
        end
      elsif @wantsApple == "no"
        puts "Alright, hombre"
      elsif @wantsApple == "exit"
        puts "Goodbye"
        exit
      else
        puts "Please type 'yes', 'no', or 'exit'"
        pickAnOrange?
      end
    end
    waitOneYear?
  end

  def drawTree
    @tree = <<-'EOF'

                \/ |    |/
              \/ / \||/  /_/___/_
              \/   |/ \/
          _\_\_\    |  /_____/_
                \  | /          /
        __ _-----`  |{,-----------~
                  \ }{
                  }{{
                  }}{
                  {{}
            , -=-~{ .-^- _
        ejm        `}
                    {

      EOF


      @originalTree = <<-'EOF'

                    \/ |    |/
                  \/ / \||/  /_/___/_
                  \/   |/ \/
              _\_\_\    |  /_____/_
                    \  | /          /
            __ _-----`  |{,-----------~
                      \ }{
                      }{{
                      }}{
                      {{}
                , -=-~{ .-^- _
            ejm        `}
                        {

          EOF

  end

end

tree = OrangeTree.new
0 голосов
/ 26 октября 2018

Просто идея.В случае, если вам нужно адаптироваться к вашему коду.

tree = []

def stats tree
  p fruits_growth = tree.sum{ |t| t[:f] }
  p fruits_eaten = tree.sum{ |t| t[:e] }
  p fruits_on_tree = fruits_growth - fruits_eaten
  p height = tree.sum{ |t| t[:h] }
end

def show_tree tree
  puts
  tree.each { |t| print "?" * t[:h]}
  tree.each { |t| print "?" * (t[:f] - t[:e]) + "❌" * t[:e] }
  puts
end

def eat_fruits_from tree, n
  eat = n
  tree.each do |t|
    eatable = t[:f] - t[:e]
    next if eatable == 0
    if eat >= eatable
      then
        t[:e] += eatable
        eat -= eatable
      else
        t[:e] += eat
        eat = 0
    end
  end
end

def grow tree, h, f
  tree << {h: h, f: f, e: 0}
end

grow tree, 3, 0
show_tree tree #=> ???
grow tree, 4, 2
show_tree tree #=> ?????????
eat_fruits_from tree, 2
show_tree tree #=> ???????❌❌
grow tree, 4, 4
show_tree tree #=> ???????????❌❌????
eat_fruits_from tree, 3
show_tree tree #=> ???????????❌❌?❌❌❌

Массив дерева содержит серию хешей, например {:h=>3, :f=>1, :e=>0}, где :h - рост дельты по высоте, :f - фрукты и :e едят фрукты.Каждый раз, когда дерево растет, в массив добавляется новый хэш.Когда фрукты съедены, существующие хеши обновляются.

...