您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 教程-9-4-模拟二维数组
什么是二维数组?:在做触发的时候我们经常会接触到数组这么一个东西。数组是什么,我之前已经介绍过了,相信大家也都明白数组是怎么一回事了。但是有些时候我们会觉得数组有些不够用。打个比方,我的地图里每个玩家能选四个英雄,如果只是一个英雄的话,我可以用一个普通的数组来存储这些英雄(每个英雄储存在数组中的索引为这个玩家的索引号,比如说玩家1的英雄就存储在Heroes[1]里,玩家12的英雄就存储在Heroes[12]里),但是四个英雄的话,这么做就不行了。那么,假如魔兽里有“数组的数组”——也就是二维数组,就好了(这样玩家1的第三个英雄就可以存储在Heroes[1][3]里了)。然而残念的是魔兽里并没有这种好东西,并且魔兽里更操蛋的地方在于即使是一维数组也不能指定数组的大小,只能是固定8192这么大,要大也不行,要小也不行。那么我们怎么办?模拟二维数组:从原理上来讲,计算机中的存储空间,也是不存在一维二维的这么一个概念的。一个大小为20的一维数组,和一个大小为4*5的二维数组,实际上都是内存里一块大小为20的空间。然而为何两者不同呢?这是因为两者的访问规则不同。一维数组只有一个索引x,访问的是这20个存储空间里的第x个存储空间。而二维数组有两个索引x和y,(假设这个二维数组的大小是4*5)它访问的是这20个存储空间里的第x*5+y(并且x要小于3,y要小于4,x和y都要大于等于0)个存储空间。这样说来的话,一维数组和二维数组并没有什么本质上的区别,只要我们在访问一维数组的时候,遵循访问二维数组的规则,就可以将一维数组给当成二维数组来使用了。那么具体应该怎么做呢?范例:我做了一个二维数组的触发范例,这个触发器可以让玩家通过输入Array[x][y]=z来存储数据,而输入Array[x][y]则会输出存储在这个位置上的数据:触发器注释:输入Array[x][y],可以对一个二维数组进行读写。默认数组大小为20x10二维数组可以用来做各种各样的事情,比如我可能会用来存储三条兵线上的防御塔,或者是多面板上的文字内容。Array事件玩家-玩家1(红色)输入Array[,信息过滤方式包含字符串条件动作--------从玩家输入的聊天信息中分离出参数,这一段并不是重点--------循环动作[循环整数A]从7到((输入的聊天信息)的长度),运行(Loop-动作)Loop-动作设置GobStr1=(截取(输入的聊天信息)的循环整数A[R]-循环整数A[R]字节部分)如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件GobStr1等于]Then-动作如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件循环整数A[R]大于7Then-动作设置GobIntArray[1]=(转换(截取(输入的聊天信息)的7-(循环整数A[R]-1)字节部分)为整数)设置GobInt2=(循环整数A[R]+2)循环动作[循环整数A]从((输入的聊天信息)的长度)到((输入的聊天信息)的长度),运行(Loop-动作)Loop-动作Else-动作游戏-显示Debug信息:缺失参数跳过剩余动作Else-动作循环动作[循环整数A]从GobInt2到((输入的聊天信息)的长度),运行(Loop-动作)Loop-动作设置GobStr1=(截取(输入的聊天信息)的循环整数A[R]-循环整数A[R]字节部分)如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件GobStr1等于]Then-动作如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件循环整数A[R]大于GobInt2Then-动作设置GobIntArray[2]=(转换(截取(输入的聊天信息)的GobInt2-(循环整数A[R]-1)字节部分)为整数)设置GobInt3=(循环整数A[R]+1)循环动作[循环整数A]从((输入的聊天信息)的长度)到((输入的聊天信息)的长度),运行(Loop-动作)Loop-动作Else-动作游戏-显示Debug信息:缺失参数跳过剩余动作Else-动作--------从玩家输入的聊天信息中分离出参数,这一段并不是重点--------如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件And-所有条件成立条件GobIntArray[1]小于或等于19GobIntArray[1]大于或等于0GobIntArray[2]小于或等于9GobIntArray[2]大于或等于0Then-动作设置GobStr1=(截取(输入的聊天信息)的GobInt3-GobInt3字节部分)如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件GobStr1等于=Then-动作设置GobStr1=(截取(输入的聊天信息)的(GobInt3+1)-((输入的聊天信息)的长度)字节部分)设置GobInt1=(转换GobStr1为整数)--------访问二维数组的地址可以由首地址,一维偏移地址和二维偏移地址组成。--------设置GobIntArray[(3000+((GobIntArray[1]x10)+GobIntArray[2]))]=GobInt1游戏-显示Debug信息:(设置Array[+((转换GobIntArray[1]为字符串)+(][+((转换GobIntArray[2]为字符串)+(]=+(转换GobInt1为字符串))))))Else-动作设置GobInt1=GobIntArray[(3000+((GobIntArray[1]x10)+GobIntArray[2]))]游戏-显示Debug信息:(读取Array[+((转换GobIntArray[1]为字符串)+(][+((转换GobIntArray[2]为字符串)+(]=+(转换GobInt1为字符串))))))Else-动作游戏-显示Debug信息:数组下标越界跳过剩余动作图片版:如你所见,这上面从玩家输入的聊天信息中分离出参数的部分并不是重点。重点在于这一段:如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件And-所有条件成立条件GobIntArray[1]小于或等于19GobIntArray[1]大于或等于0GobIntArray[2]小于或等于9GobIntArray[2]大于或等于0Then-动作设置GobStr1=(截取(输入的聊天信息)的GobInt3-GobInt3字节部分)如果(所有的条件成立)则运行(Then-动作)否则运行(Else-动作)If-条件GobStr1等于=Then-动作设置GobStr1=(截取(输入的聊天信息)的(GobInt3+1)-((输入的聊天信息)的长度)字节部分)设置GobInt1=(转换GobStr1为整数)--------访问二维数组的地址可以由首地址,一维偏移地址和二维偏移地址组成。--------设置GobIntArray[(3000+((GobIntArray[1]x10)+GobIntArray[2]))]=GobInt1游戏-显示Debug信息:(设置Array[+((转换GobIntArray[1]为字符串)+(][+((转换GobIntArray[2]为字符串)+(]=+(转换GobInt1为字符串))))))Else-动作设置GobInt1=GobIntArray[(3000+((GobIntArray[1]x10)+GobIntArray[2]))]游戏-显示Debug信息:(读取Array[+((转换GobIntArray[1]为字符串)+(][+((转换GobIntArray[2]为字符串)+(]=+(转换GobInt1为字符串))))))Else-动作游戏-显示Debug信息:数组下标越界跳过剩余动作这一段展示了如何按照二维数组的访问规则对一维数组进行访问,并读取或者写入数据。我将玩家输入的聊天信息中包含的参数保存在了GobIntArray[1]和[2]中,于是乎在访问起始地址为3000的从GobIntArray中划分出的一块大小为20*10的二维数组的时候,就可以按照这种格式访问:3000(起始地址)+[1]*10(一维地址偏移)+[2](二维地址偏移)这样我们就用一维数组模拟出二维数组的效果了。
本文标题:教程-9-4-模拟二维数组
链接地址:https://www.777doc.com/doc-2386796 .html