在Ruby中创建二维数组

以下文章是系列文章的一部分。有关本系列的更多文章,请参阅在Ruby中克隆游戏2048.有关完整和最终代码,请参阅gist。

现在我们知道算法将如何工作,现在需要考虑该算法将使用的数据。这里有两个主要选择:某种平面阵列或二维阵列。每个人都有自己的优势,但在做出决定之前,我们需要考虑一些因素。

干拼图

使用基于网格的拼图的常用技术,您必须寻找类似的图案,即编写一个版本的算法,从左到右处理拼图,然后将整个拼图旋转四次。这样,算法只需要写入一次,只需要从左到右工作。这**降低了该项目中最困难部分的复杂性和规模。

由于我们将从左到右研究难题,因此将行由数组表示是有意义的。当用Ruby制作二维数组时(或者更准确地说,你希望如何处理它以及数据的实际含义),你必须决定你是否需要一堆行(网格的每一行都用一个数组)或一堆列(每列是一个数组)。由于我们'重新使用行,我们'将选择行。

如何旋转这个2D数组,我们在实际构造这样一个数组之后,'将会到达。

构建二维阵列

这个数组方法可以引用一个参数来定义您想要的数组的大小。例如,数组(5) 将创建一个5个零对象的数组。第二个参数给你一个默认值,所以32数组(5,0)将给你数组[0,0,0,0,0]。那么你如何创建一个二维数组呢?

错误的方式,以及我看到的方式人们经常尝试的是说数组(4,数组(4,0))。换句话说,4行数组,每行4个零点数组。这似乎首先起作用。但是,运行以下代码:

看起来很简单。制作一个4x4的零点数组,将左上角的元素设置为1。但打印它,我们得到…

它将整个**列设置为1,给出了什么?当我们制作数组时,最里面的调用是数组首先被调用,创建一行。然后将对该行的单个引用重复4次以填充最外部的阵列。然后每行引用相同的数组。改变一个,改变它们。

相反,我们需要使用第三种在Ruby中创建数组的方式。而不是将值传递给数组方法,我们通过一个块。每次块被执行数组方法需要一个新的价值。所以,如果你要说数组(5) {gets.chomp},Ruby将停止并要求输入5次。所以我们只需要做的就是在这个块内创建一个新的数组。所以我们最终得到了58数组(4) {数组(4,0)}。现在让'再次尝试测试用例。

它就像你所期望的那样。

所以即使Ruby不支持二维数组,我们仍然可以做我们需要的事情。只需记住,顶层数组将引用保留给子数组,每个子数组应该引用不同的值数组。

这个数组代表的是你。在我们的例子中,这个数组被布置成行。**个索引是我们'行;重新索引开车小知识,从上到下。为了索引难题的**行,我们使用a[0],向下索引下一行,我们使用a[1]。为了在第二行中索引特定的图块,我们使用a[1][n]。但是,如果我们决定专栏……那将是一样的。Ruby不'不知道我们'正在处理这些数据,并且因为它不't technically支持二维阵列,我们在这里重新做的是一次攻击。只能按照惯例访问它,一切都会保持一致。忘记下面的数据应该做什么,一切都可以快速分解。

科普_1