在bash上制作动画地图移动

时间:2015-04-07 20:42:48

标签: ruby arrays

我有一个2d地图,它是一个数组数组:

map = [[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1],
       [0, 0, 0, 0, 0]]

我还有一个包含动作的列表:

moves = [[0,0], [0, 1], [1, 1]]

我想在控制台上打印机芯(但我希望每次都覆盖以前的输出,例如this

所以预期的输出应该是这样的

* 0 0 0 0     0 * 0 0 0     0 0 0 0 0
0 0 0 0 0     0 0 0 0 0     0 * 0 0 0
0 1 1 1 1 --> 0 1 1 1 1 --> 0 1 1 1 1
0 0 0 0 0     0 0 0 0 0     0 0 0 0 0

我尝试了一些东西,但是我无法接近我想要的输出。

3 个答案:

答案 0 :(得分:2)

要清除屏幕并等待ENTER,请尝试以下操作:

map = [[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1],
       [0, 0, 0, 0, 0]]

loc = [0,0]
moves = [[0,0], [0, 1], [1, 1]]

def display_map(map,loc)
  system 'clear'
  loc.first.times { puts }
  map.each { |row| print ' '*loc.last; p row }
end

moves.each do |x,y|
  loc[0] += x
  loc[1] += y
  display_map(map,loc)
  gets
end  

这适用于Mac。对于其他操作系统,您可能需要将system 'clear'替换为system 'cls'

[编辑:我看到我误解了这个问题。我想这就是你想要的:

moves.each do |x,y|
  system 'clear'
  nrows.times do |i|
    ncols.times do |j|
      print (i==x && j==y) ? '*' : map[i][j]
      print ' ' if j < ncols-1
    end
    puts
  end
  gets
end

答案 1 :(得分:0)

您可以使用ANSI terminal escape codes

示例:

# Save initial cursor position
puts "\033[s"
puts <<EOF
* 0 0 0 0
0 0 0 0 0
0 1 1 1 1
0 0 0 0 0
EOF

sleep 1

# Restore initial cursor position
puts "\033[u"
puts <<EOF
0 * 0 0 0
0 0 0 0 0
0 1 1 1 1
0 0 0 0 0
EOF

sleep 1

# Restore initial cursor position
puts "\033[u"
puts <<EOF
0 0 0 0 0
0 * 0 0 0
0 1 1 1 1
0 0 0 0 0
EOF

答案 2 :(得分:0)

关注@ Cary_Swoveland解决方案,清理控制台后,我设法做到这一点:

map = [[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1],
       [0, 0, 0, 0, 0]]

moves = [[0,0], [0, 1], [1, 1]]

def display_map(map,loc)
  system "clear" or system "cls"
  # loc.first.times { puts }
  map.each { |row| p row }
end

moves.each do |x,y|
  map[x][y] = 8
  display_map(m,loc)
  map[x][y] = 0
  gets
end