Swift游戏开发之俄罗斯方块:No.3 二维数组

本文介绍了在Swift中为iOS游戏开发实现二维数组的方法,特别是针对俄罗斯方块游戏的需求。通过自定义Array2D类,利用Swift的结构体和字典特性,创建了一个通用的二维数组,用于存储和定位游戏中的block。文章详细讲解了二维数组的构造、初始化、以及自定义subscript函数的过程,并强调了传值与传引用的区别以及Swift中optional类型的使用。
摘要由CSDN通过智能技术生成

数组是一个很有用的数据结构,很多程序都建立在数组之上,我很少看到哪个应用程序不用到数组的。

而我们的俄罗斯方块显然也需要数组,而且是更为特殊的  二维数组

为什么是二维数组呢?其实我们的整个游戏区域,可以看做是一个二维数组区域,就像这样:


我们的每一个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一下应该也能找到很多答案,这里我就不展开描述了。


想要查看更多关于swift的class相关知识,请点击这里


另外我们还看到,我们的class类型是<T>, 这里如果学过c++的应该也很容易理解,其实就是模板类了,T表示任意类型,可以是int,可以是string,可以是char等等等等;就是说,我们的这个array2D是一个通用的二维数组,你想在数组里面存任何都是可以的


#2

首先我们定义了一个传统的swift array,数组里面的类型和我们的二维数组类型一样 是<T>,但是我们注意到其实这里是<T?>,多了一个

上一章节我们已经介绍过了,它表示这是一个optional的变量,也就是说可以是nil,可以不包含任何数据,而在我们的面板上,如果数组里面是ni就表示这个地方不显示任何的block

接下来是定义我们自己的init函数,init一个二维数组需要两个参数,行数和列数,前两行代码很简单,把形参中的值传给实例化后的类的两个私有变量,而用来存储数据的数组,就得用到swift原生的array类来建立了。


#3

接下来是定义我们自己的init函数,init一个二维数组需要两个参数,行数和列数,前两行代码很简单,把形参中的值传给实例化后的类的两个私有变

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值