数组是一个很有用的数据结构,很多程序都建立在数组之上,我很少看到哪个应用程序不用到数组的。
而我们的俄罗斯方块显然也需要数组,而且是更为特殊的 二维数组。
为什么是二维数组呢?其实我们的整个游戏区域,可以看做是一个二维数组区域,就像这样:
我们的每一个block都占据在这样一个20x10的区域之内,20行,10列的一个200个block的二维数组让我们可以根据(x,y)坐标来确定block的位置,而这些blocks其实就是组成我们的L形,或者Z形 等等不同但我们都熟知的俄罗斯方块;
swift提供了我们array[index]供我们使用,但是我们还需要一个自定义的array2D[x,y]来更方便我们的使用,所以,让我们来自定义属于自己的二维数组吧!
确保你选中Swiftris文件夹,然后你可以选择⌘ + N 或者 File > New > File…或者左下角的“+”号 > File 来创建新的swift类,如下图所示:
选择Swift然后点击Next, 给你的新类起个名字吧,我们叫做Array2D,意为二维数组,然后我们点击create
在编辑区域会自动打开我们刚刚建好的Array2D 类,我们照着下图进行修改
准备好了,虽然这段代码不长,但是如果你是个swift的新手,这里面却有很多学问,基本上每行都有一个知识点需要学习!
友情提醒:
-号的红色代码需要移除,+号的绿色代码需要手动加上,注释掉的#1,2,3,4 是便于给大家分段讲解,大家输入的时候可以不输入
subscript函数里面 array[(row * columns) + column] , 注意是row 而不是rows。如果你不小心写成了rows,那很显然,你的数组会越界。刚开始的时候我没有注意,就导致数组越界了。
#1
这里我们命名了一个叫做Array2D的class,在swift里面通常array是用struct 而不是用class,但是这里我们却需要一个class,因为在我们的程序里面,我们需要传引用(pass by reference),而不是传值(pass by value),class是传引用的,而struct是传值的。
关于传值和传引用的区别如果学过C++的应该不难理解,我记得Effective c++这本书里面对这部分有很详尽的解释,google一下应该也能找到很多答案,这里我就不展开描述了。
另外我们还看到,我们的class类型是<T>, 这里如果学过c++的应该也很容易理解,其实就是模板类了,T表示任意类型,可以是int,可以是string,可以是char等等等等;就是说,我们的这个array2D是一个通用的二维数组,你想在数组里面存任何都是可以的
#2
首先我们定义了一个传统的swift array,数组里面的类型和我们的二维数组类型一样 是<T>,但是我们注意到其实这里是<T?>,多了一个?
上一章节我们已经介绍过了,它表示这是一个optional的变量,也就是说可以是nil,可以不包含任何数据,而在我们的面板上,如果数组里面是ni就表示这个地方不显示任何的block
接下来是定义我们自己的init函数,init一个二维数组需要两个参数,行数和列数,前两行代码很简单,把形参中的值传给实例化后的类的两个私有变量,而用来存储数据的数组,就得用到swift原生的array类来建立了。
#3
接下来是定义我们自己的init函数,init一个二维数组需要两个参数,行数和列数,前两行代码很简单,把形参中的值传给实例化后的类的两个私有变