【问题标题】:Updating static output as input changes [closed]随着输入的变化更新静态输出[关闭]
【发布时间】:2015-08-15 23:54:19
【问题描述】:

我希望随着输入的变化更新屏幕上的构造。构造将如下所示:

puts "    |    |    "
puts "    |    |    "
puts "----+----+----"
puts "make an input (1/2/3/4/5/6)"
selection = gets.chomp
#process selection, returns value, value to be updated in construct.

我将值的空间定义为 2x3 数组。例如,返回的值可以是 '2' 以存储在空间 [0][1](第 1 行,第 2 列)中。输出应如下所示:

    |  2 |
    |    |    
----+----+----

这需要在不重新打印构造的情况下发生。当提示用户(在循环中)进行另一个选择时,应该再次更新结构而不重新打印。

【问题讨论】:

  • 你的问题是什么?
  • 不完全是这个question 的副本,因为这只是修改一行的输出,但可能是一个不错的起点。
  • 感谢@Exupery,但 \r 只会将光标向后移动一行,在这种情况下,重写必须发生在(二维数组的)特定位置。

标签: ruby command-line-interface


【解决方案1】:

我可以让你感兴趣吗,好先生,goodevil 之间的战斗?深受TTT 的启发:

require 'dispel'

class Lucky6
  BOARD = <<-BOARD.gsub /^\s+/, ''
    | X | X | X |
    | X | X | X |
    ----+---+----
  BOARD

  attr_reader :position

  def initialize
    @fields   = Array.new(6) { ' ' }
    @position = 0
  end

  def board
    index = -1
    BOARD.gsub(" X ") do
      index += 1
      field = @fields[index]
      @position == index ? "[#{field}]" : " #{field} "
    end
  end

  def set(position)
    @position = position.pred
    @fields[@position] = position
  end
end

def draw(l6)
  [l6.board, "1..6=Set r=Reset q=Quit"].join("\n")
end

Dispel::Screen.open do |screen|
  l6 = Lucky6.new
  screen.draw draw(l6)

  Dispel::Keyboard.output do |key|
    case key
    when ('1'..'6') then l6.set(key.to_i)
    when "r" then l6 = Lucky6.new
    when "q" then break
    end
    screen.draw draw(l6)
  end
end

【讨论】:

  • 好东西!但我可以要求一种非 OOP 方法和我所展示的约束.. :)
  • @codescribble,你是什么意思?将"1..6=Set" 更改为"make an input (1/2/3/4/5/6)"?从Lucky6 更改为常规Array 和方法有点微不足道。还有为什么你不喜欢“OOP 方法”
【解决方案2】:

使用technique of \r无法实现您的要求,但您可以使用如下所示的清屏技巧

matrix = [ ["", "", ""], ["", "", ""]]
pos_to_index = [[0, 0], [0, 1], [0, 2], [1,0], [1,1], [1,2]]

system("cls")

begin
    print "make an input (1/2/3/4/5/6)\n"
    selection = gets.chomp
    system("cls")

    if (selection.to_i <= pos_to_index.size)

        pos = pos_to_index[selection.to_i - 1]
        matrix[pos[0]][pos[1]] = selection

        matrix.each { |a| a.each { |i| print " #{i.empty? ? ' ' : i} |" }; puts }
        puts "---+---+----"
    end 

end while (not selection.empty?)

PS:system("cls") 适用于 Windows,如果它不适合您,请尝试 system("clear") 解释 here

【讨论】:

  • 谢谢,在这种情况下,对于每个选择,构造都会重新打印到输出中。因此,如果我做出 3 个选择,我会看到 3 个构造。我想要做的是只为任意数量的选择设置一个构造,但是,选择在构造内动态更新,而无需为每个输入选择打印出构造。结构应该在屏幕上保持静态,只有值应该根据输入选择而改变。
  • 嗨! system 'clear' 有帮助!谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 2020-10-25
相关资源
最近更新 更多