2016-03-22 13 views
0

Ich schreibe ein Terminal-Spiel. Es überschreibt das Spielfeld jede Sekunde. Ich möchte, dass ein Benutzer durch Drücken einer Taste interagiert. Hier ist ein vereinfachtes Beispiel dafür, was ich kam mit:Erhalten Sie eine Eingabe 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 

Sieht aus wie es funktioniert. Aber ich habe eine merkwürdige Ausgabe von thr, die das gesamte Spielfeld vermasselt:

game field

+1

Wenn Sie ein Spiel erstellen, können Sie die Bibliothek ['curses'] (https://github.com/ruby/curses) verwenden und eine Ereignisschleife verwenden, die den lesbaren Status Ihrer Tastatur überprüft. Es gibt keinen Grund für Threads hier. – tadman

+0

Wie wird die korrekte Ausgabe von einem Thread durchgeführt? –

+0

Wenn ich Ihren Code versuchte, wird der "Foo" immer am Anfang der Zeile geschrieben, nicht wie in Ihrem Fall eingefügt. Dies liegt wahrscheinlich an einem Unterschied in den Terminaleinstellungen. 'puts' schreibt einen Zeilenvorschub am Ende des Strings, und das Terminal, das Sie verwenden, interpretiert den Zeilenvorschub als Zeilenumbruch. Wie ist die Ausgabe, wenn Sie schreiben "puts" Foo \ r "'? – user1934428

Antwort

0

puts automatisch eine neue Zeile anhängt (\n) nach der Zeichenfolge auf dem Bildschirm ausgibt. Dies ist in den meisten Fällen nützlich, aber nicht immer.

Verwenden print, wenn Sie nicht eine neue Zeile wollen:

print "Foo" 

In diesem Fall werden Sie wahrscheinlich auch die bestehende Linie löschen möchten; Sie können mit \r das tun (für „Carriage Return“):

print "Foo\r" 

Dieser den Cursor zurück in Spalte bewegen 0. Beachten Sie, dass es wird nicht klar alle Zeichen - es lediglich den Cursor bewegt sich zurück zu Spalte 0, damit Zeichen überschrieben werden können. So zum Beispiel dieses:

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

bewirkt:

Foolo 

Da Foo nur drei Zeichen gibt - zwei weniger als die auf dem Bildschirm. Um dies zu beheben, müssen wir Räume hinzu:

print "Foo \r" 

gibt es auch \b (Backspace), um den Cursor um ein Zeichen zu bewegen zurück:

print "Foo" 
print "\b\bee" 

bewirkt:

Fee 

Alle das ist ziemlich mühsam mit zu arbeiten, und genau der Grund, warum die curses Bibliothek existiert ;-) Es wickelt all dies in Wrapper-Funktionen, die sich mit dem Löschen der richtigen stu beschäftigen ff und es wurde ursprünglich für ASCII-Spiele wie folgt entwickelt ;-) Ich empfehle Ihnen, es zu benutzen!

+0

Danke für detaillierte Erklärung. Der Wagenrücklauf hat mein Problem gelöst. Ich schätze, nächstes Mal werde ich die Curses-Bibliothek benutzen. Wäre schön, ein Tutorial dafür zu haben. –

Verwandte Themen