在 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 游戏开发 ;-) 我推荐你使用它!
我正在编写终端游戏。它每秒重写游戏领域。我希望用户通过按键进行交互。这是我想出的一个简化示例:
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 游戏开发 ;-) 我推荐你使用它!