ruby - 选择性 Ruby 数组切片

标签 ruby

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

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

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

有人有想法吗?我愿意接受一些非常疯狂的建议!

最佳答案

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

offset = y * buffer_width + x

如果您的 map 图 block 宽度为 100 个图 block ,并且您想获得图 block 5,5,则 5 * 100 + 5 = 数组索引 505 将是您的一维数组中的相应图 block 。

您可以使用它来拼凑屏幕上的可视区域。例如一个 10x10 的可 View block :从您的偏移量开始并抓取接下来的 10 个项目,添加 buffer_width 以放下一行并添加接下来的 10 个,依此类推,直到您拥有 10x10 可视区域的所有 10 行。

下面是一个较小的图 block 集示例,图 block 缓冲区宽度为 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"]

您可以将它们串在一个新的单维或多维中,您认为合适。

希望这对您有所帮助。

关于ruby - 选择性 Ruby 数组切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1130305/

相关文章:

ruby-on-rails - 我在哪里可以阅读有关 ruby​​ on rails 中的 REST 的信息?

ruby-on-rails - 如何让carrierwave在销毁记录时删除文件?

ruby - Capistrano:使用参数调用任务(内部)

ruby - 添加黑盒库以进行 Pry 调试

ruby-on-rails - RSpec2 错误代码测试

ruby OCI8 初始化缓慢

ruby - sinatra 中的离线机架

ruby-on-rails - 收到此错误 : param is missing or the value is empty: series

ruby - 在最新版本的 Ruby 中,访问实例变量是否需要同时使用 getter 和 setter 方法?

arrays - 如何找到字符串数组中的最小元素,但只考虑整数?