在ruby中创建二维数组

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

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

Screenshot of 2048 by Gabriele Cirulli game for Android

现在我们已经知道了算法将如何工作,是时候考虑一下该算法将处理的数据了。这里有两种主要的选择:某种平面阵列或二维阵列。每种方法都有各自的优点,但在做出决定之前,我们需要考虑一些因素。

干拼图

在处理基于网格的谜题时,你必须寻找这样的模式,一种常见的技术是编写一个从左到右处理谜题的算法版本,然后将整个谜题旋转四次。这样,算法只需编写一次,并且只需从左到右运行。这大大降低了该项目最困难部分的复杂性和规模。

因为我们将从左到右处理这个难题,所以用数组表示行是有意义的。在Ruby中创建二维数组(或者更准确地说,您希望如何寻址以及数据的实际含义)时,您必须决定是要一个行堆栈(其中网格的每一行由数组表示)还是一个列堆栈(其中每一列都是数组)。因为我们使用的是行,所以我们将选择行。

这个2D数组是如何旋转的,我们将在实际构建这样一个数组之后讨论。

构造二维阵列

new方法可以使用一个参数来定义所需数组的大小。例如,Array.new(5)将创建一个包含5个nil对象的数组。第二个参数为您提供了一个默认值,因此Array.new(5,0)将为您提供数组[0,0,0,0]。那么如何创建二维数组呢?

错误的方法是,我经常看到人们说Array.new(4,Array.new(4,0))。换句话说,一个由4行组成的数组,每行是一个由4个零组成的数组。起初,这似乎是可行的。但是,请运行以下代码:

看起来很简单。制作一个4x4的零数组,将左上角的元素设置为1。但是把它打印出来,我们就可以…

它将整个第一列设置为1,给出了什么?创建数组时,首先调用对Array.new的最内部调用,生成一行。然后将对此行的单个引用复制4次,以填充最外层的数组。然后,每一行引用同一数组。改变一个,改变所有。

相反,我们需要使用第三种方法在Ruby中创建数组。我们不向Array.new方法传递值,而是传递一个块。每次Array.new方法需要新值时,都会执行该块。所以,如果您说Array.new(5){gets.chomp},Ruby将停止并请求输入5次。所以我们需要做的就是在这个块中创建一个新数组。所以我们以Array.new(4){Array.new(4,0)}结束。现在让我们再次尝试该测试用例。

它就像你期望的那样。

因此,即使Ruby不支持二维数组,我们仍然可以做我们需要的事情。请记住,顶级数组包含对子数组的引用,每个子数组都应该引用不同的值数组。

这个数组代表什么取决于您。在我们的例子中,这个数组是按行排列的。第一个索引是我们正在索引的行,从上到下。为了索引拼图的第一行,我们使用[0],为了索引下一行,我们使用[1]。为了索引第二行中的特定磁贴,我们使用[1][n]。然而,如果我们已经决定了专栏,那也是一样的。Ruby不知道我们在用这些数据做什么,而且因为它在技术上不支持二维数组,所以我们在这里做的是一个黑客。只有按照惯例才能访问它,一切都将保持一致。忘记下面的数据应该做什么,一切都会很快崩溃。

  • 发表于 2021-09-23 15:30
  • 阅读 ( 276 )
  • 分类:编程

你可能感兴趣的文章

红宝石(ruby)和python(python)的区别

...。闭包具有从外部作用域读取和写入变量的权限。Ruby有数组、哈希等数据类型。 rubyonrails是一个用Ruby编写的用于web开发的web框架。它很容易嵌入到超文本标记语言(HTML)中。Ruby还可以用于构建同时运行多个线程的多线程应用...

  • 发布于 2020-10-19 17:41
  • 阅读 ( 338 )

最适合新手的ruby互动介绍

...数字、字符串、属性和方法。 了解转换、数组、变量和其他方法。 查看打印、括号和字符串操作。 尝试一下方法链接、散列、键和值。 研究块、目录和方法参数。 ...

  • 发布于 2021-03-13 09:52
  • 阅读 ( 214 )

如何在excel中制作图表

... 如果您从未在Microsoft Excel中创建过图表,请从第一个图表开始。 ...

  • 发布于 2021-03-22 01:45
  • 阅读 ( 173 )

在word中创建化学方程式和图表

microsoftword是一个很好的文本格式化工具,但是如果你想**化学公式或图表呢?由于Word提供了一个新的免费插件,您现在可以直接从Word的功能区**高质量的化学公式和图表。 微软新的教育实验室最近发布了word2007和2010的新化学插...

  • 发布于 2021-04-13 20:03
  • 阅读 ( 153 )

rubymonk通过交互式练习教你ruby编程语言

...接学习,以便您可以从任何地方参与。这些课程首先介绍数组,因此在开始学习之前,您可能需要掌握一些基本的编程知识。一旦你这样做了,RubyMonk是一个很好的学习方法,因为你实际上可以一边写代码一边学习。当你学习到...

  • 发布于 2021-05-27 17:53
  • 阅读 ( 179 )

数组(array)和数组表(arraylist)的区别

...此可以从列表中添加和删除元素。 仿制药 您不能在Java中创建接口的泛型类的数组,因此数组和泛型不能并行不悖,因此无法创建泛型数组,因为数组是协变的,而泛型是不变的。虽然数组是固定长度的数据结构,但它包含同...

  • 发布于 2021-06-25 03:21
  • 阅读 ( 651 )

1天(1d)和二维阵列(2d array)的区别

一维数组和二维数组的主要区别在于,一维数组将多个数据项表示为一个列表,而二维数组将多个数据项表示为一个由行和列组成的表。 变量是存储特定类型数据的内存位置。有时,需要存储一组相同数据类型的项。数组允许...

  • 发布于 2021-07-01 10:34
  • 阅读 ( 536 )

一维阵列(one-dimensional (1d) array)和二维阵列(two-dimensional (2d) array)的区别

一维数组和二维数组的区别在于,一维数组存储相似数据的单个元素列表,而在二维数组中存储列表列表或数组列表。 数组是计算机程序设计中非常重要的一种数据结构。在计算机程序设计中,数组和结构是一个非常重要的概...

  • 发布于 2021-07-08 14:07
  • 阅读 ( 648 )

使用snippits自动重复键入

...放自定义文本字符串。在终端或文件浏览器中,在主目录中创建“.snippits”文件夹;命令行代码为:sudo mkdir~/.snippits在我们真正开始之前还有一个任务。在.snippits目录中创建一个名为“do”的新文本文件(如sudo gedit~/.snippits/do)...

  • 发布于 2021-07-30 18:16
  • 阅读 ( 124 )

ruby中的全局变量

...称$0反映了UNIX shell脚本中用于相同目的的命名约定。 $*-数组中的命令行参数,由$*(美元符号和星号)表示。例如,如果要运行./script.rb arg1 arg2,则$*将等效于%w{arg1 arg2}。这相当于特殊的ARGV数组,并且具有较少的描述性名称,...

  • 发布于 2021-09-05 06:00
  • 阅读 ( 175 )
qpwecuyxmn
qpwecuyxmn

0 篇文章

相关推荐