在 Ruby 中获取输入

Get an input in Ruby

我正在编写终端游戏。它每秒重写游戏领域。我希望用户通过按键进行交互。这是我想出的一个简化示例:

require 'io/console'

move = true

thr = Thread.new do
  while move do
    puts "Foo"
    sleep(1)
  end
end

loop do
  input = $stdin.getch
  if input == "a"
    move = false
    break
  end
end

看起来有效。但是我从 thr 得到了一个奇怪的输出,它弄乱了整个游戏领域:

puts 在将字符串输出到屏幕后自动附加一个换行符 (\n)。这在大多数情况下很有用,但并非总是如此。

如果您不想换行,请使用 print

print "Foo"

在这种情况下,您可能还想清除现有行;你可以用 \r 来做到这一点(对于 "carriage return"):

print "Foo\r"

这会将光标移回第 0 列。请注意,它不会 清除任何字符 − 它只会将光标移回第 0 列,因此它可以覆盖字符。例如:

print "Hello\r"
print "Foo\r"

将导致:

Foolo

因为 Foo 只输出三个字符 - 比屏幕上的少两个。要解决这个问题,我们需要添加空格:

print "Foo  \r"

还有\b(退格键)将光标向后移动一个字符:

print "Foo"
print "\b\bee"

将导致:

Fee

所有这些工作起来都相当乏味,这正是 curses 库存在的原因 ;-) 它将所有这些包装在包装函数中,这些包装函数处理擦除正确的东西,它最初是为这样的 ASCII 游戏开发 ;-) 我推荐你使用它!