选择性Ruby数组切片

时间:2009-07-15 09:19:28

标签: ruby

我一直在慢慢学习Ruby(在这一点上,也许是我在实际学习中投入了大量时间的第一语言)所以对于你们中的许多人来说这可能是一个非常简单的问题。

我的学习玩具项目基本上是一个roguelike。目前,我有一个Map类,其中包含一个Tile对象数组,当然,这些对象代表整个地图中的每个tile。我正在尝试创建一个返回较小数组的方法(最可能的例子是显示当前可查看的地图区域)。

我的问题归结于此。由于包含所有这些切片的数组是单维的,我似乎无法想到一种干净的方法来根据该方法确定返回内容的两个x,y坐标来切割此数组的各个部分。换句话说,我似乎找不到一种简洁的方法来在两个坐标对之间进行转换,而没有一些相当丑陋的代码,我认为有一种非常简单的方法可以做到这一点,而不是“点击”。 / p>

任何人的想法?我对一些非常疯狂的建议持开放态度!

2 个答案:

答案 0 :(得分:4)

如果您的数组是单维,您可以将x和y坐标映射到数组索引,就像在vga缓冲区上执行像素一样。

offset = y * buffer_width + x

如果您的地图图块宽度为100个图块并且您想获得图块5,5,那么5 * 100 + 5 =数组索引505将是您的1维数组中的相应图块。

您可以使用此功能将屏幕上的可视区域拼凑在一起。例如,10x10可视区块:从偏移处开始并获取接下来的10个项目,添加buffer_width以删除一行并添加下一个10,依此类推,直到您的10x10可视区域全部为10行。

以下是较小的图块集的示例,图块缓冲区宽度为5,并选择可查看的3x3区域:

buffer = ['0,0', '1,0', '2,0', '3,0', '4,0',
          '0,1', '1,1', '2,1', '3,1', '4,1',
          '0,2', '1,2', '2,2', '3,2', '4,2',
          '0,3', '1,3', '2,3', '3,3', '4,3',
          '0,4', '1,4', '2,4', '3,4', '4,4']

buffer_width = 5
buffer_height = 5

# now lets say we want to grab a 3x3 slice from right 
# in the middle of the array from 1,1->3,3

x1,y1 = 1,1
x2,y2 = 3,3

view_width = x2 - x1
view_height = y2 - y1

(0..view_height).each do |row|
  offset = (y1 + row) * buffer_width + x1
  puts buffer[offset..offset+view_width].inspect
end

我们的结果将是这样的输出:

["1,1", "2,1", "3,1"]
["1,2", "2,2", "3,2"]
["1,3", "2,3", "3,3"]

你可以在一个新的单维或多维中串起来,这是你认为合适的。

希望这有帮助。

答案 1 :(得分:2)

您需要在数组切片上使用use map并将每一行映射到切片本身。

a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
a[1..2].map { |row| row[0..1] }

=> [[“d”,“e”],[“g”,“h”]]