Techioz Blog

ターミナルで複数行の要素を 1 行に印刷するにはどうすればよいですか?

概要

チェスのグリッドを端末に出力しようとしています。各要素は行のように同じ行に隣り合って出力されます。ただし、行内の各要素の深さを 2 行にし、次の要素が最初の要素が開始したのと同じ行に印刷されるようにしたいと考えています。

単一行要素を含むこのコードは正常に動作します。

  def display_board_utf
    grid.each_with_index do |row, row_index|
      puts "\n\n"
      print ((row_index - 8).abs).to_s + ' '
      row.each_with_index do |piece, column_index|
        if piece.nil?
          if colour_grid[row_index][column_index] == :black
            print("\033[40m| nil |\033[m")
          else
            print("\033[47m| nil |\033[m")
          end
        else
          if colour_grid[row_index][column_index] == :black
            print("\033[40m|#{piece.uni_char + piece.class.to_s.chr.downcase + piece.colour.to_s.chr + colour_emoji(piece.colour)}|\033[m")
          else
            print("\033[47m|#{piece.uni_char + piece.class.to_s.chr.downcase + piece.colour.to_s.chr + colour_emoji(piece.colour)}|\033[m")
          end
        end
      end
      print ' ' + ((row_index - 8).abs).to_s
    end
    puts "\n\n"
  end

上記の出力のイメージ:

もちろん、各要素の 2 行目を出力すると改行文字が追加されます。これは、次に出力される要素が前の要素の開始行レベルで出力されないことを意味し、次のような混乱が生じます。

必要なものを達成できずに、puts/print/p と print to を試してみましたが、私の知る限り、「line up」コマンドはありません。 (別のライブラリを使用せずに) 達成しようとしているこの複数行要素の単一行タイプの出力を作成する方法について何かアイデアはありますか?

解決策

「そして、重要なのは、2 行にわたって印刷し、もう一度上の行を印刷する方法はないということだと思います。コマンドラインでの出力は一方向のみであるため、戻ってすでに印刷されているものの上に出力することはできません」 。」標準ライブラリは IO::console に同梱されています。役に立たないデモ:

require 'io/console'

c = IO::console
c.clear_screen
sleep 1
c.cursor=[10,10]
print "I am here"
sleep 1
c.cursor_up(3)
sleep 1
c.cursor_left(3)
sleep(1)
print "now I'm here!"
sleep 1
c.clear_screen

これが Windows で機能するかどうかはわかりません。