我正在尝试编写一个方法,它将输出Rook棋子可以合法移动的有效移动(不考虑棋盘上的任何其他棋子)。下面是我写的一个工作方法。它可以访问可读(和可写,因此.dup
)@x
和@y
变量,其值是棋子在8x8网格棋盘上的零索引格式坐标的位置。但我认为这是一个非常冗长和丑陋的方法,有人能提供a)一个更好的语法方式来编写下面的内容,或者b)一个很好的替代方式来实现期望的输出。
def valid_rook_moves
moves = []
new_x = x.dup
until new_x >= 7
new_x += 1
moves.push([new_x, y])
end
new_x = x.dup
until new_x <= 0
new_x -= 1
moves.push([new_x, y])
end
new_y = y.dup
until new_y >= 7
new_y += 1
moves.push([x, new_y])
end
new_y = y.dup
until new_y <= 0
new_y -= 1
moves.push([x, new_y])
end
moves
end
例如,在@x和@y都设置为0的情况下运行此方法输出:
[[1, 0], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7]]
2条答案
按热度按时间pgccezyw1#
另一种方法...
参见Array::new、Array#product和Array#concat。
注意,对于
x = 3
和y = 5
,还有一个...
y1aodyip2#
这样的怎么样?
使用方法参数而不是使用当前位置传递位置的一个好处是,它提供了考虑未来移动序列的灵活性,而不是将您限制在下一个移动。