找回密码
 点一下
查看: 3589|回复: 12

-=关于N维数组=-

[复制链接]
发表于 2006-12-26 18:35:13 | 显示全部楼层 |阅读模式
一般把处女帖发做这种内容 还是满让人头疼的 不过可以声明一下 界个素偶原创D
那么偶要说的事素 RT :P
-引言-
关于数组吧 偶有一个习惯 就是把一些数组按玩家分 例如udg_heroes[1] = 玩家1的英雄 依次类推
但是在遇到复合的情况时就比较尴尬了 例如某些地图每个玩家可能有N个英雄 那么以上的办法就不行了
解决办法自然是用2维数组 但是WE里只提供1维的:( 于是偶就想自己伪造一个多维数组
[jass]
function GetAryD2D takes integer ftEle, integer sdEle, integer maxSd returns integer
    return (sdEle - 1) * maxSd + ftEle
endfunction
[/jass]
ftEle就素指第一维元素的位置 sdEle就素第二维元素的位置 maxSd素二维元素下标
那么假如玩家总数是4 玩家1的第3个英雄就是[9] 而玩家2的第2个英雄就是[6] 依次类推
这样一来就能用一个单位变量有序的储存N个玩家的N个英雄了
[jass]
function GetRearyD2D takes integer UserD, integer maxSd, integer iEle returns integer
    if iEle == 1 then
        return ModuloInteger(UserD, maxSd)
    else
        return UserD / maxSd
    endif
endfunction
[/jass]
//这个素反运算 UserD素GetAryD2D的计算结果 也就是实际的元素位置 iEle素一个选项变量 在上例中,如果iEle = 1那么就反回第二维元素的位置 否则就返回第一维的

-再一次-
在使用N次二维数组后 又觉得相当不方便 比如要用一个iarraytem变量储存N个玩家的N个英雄的N个物品 那么二维数组又显得不够强大了..于是三维数组应运而生
[jass]
function AryD3D takes integer maxSd, integer maxRd, integer rdEle, integer sdEle, integer ftEle returns integer
return maxSd * maxRd * ( ftEle - 1 ) + maxRd * ( sdEle - 1 ) + rdEle
endfunction
[/jass]
呃 基本上和二维的方法一样
[jass]
function GetRearyD3D takes integer maxRd, integer maxSd, integer UserD,  integer iEle returns integer
    if iEle == 1 then
        return UserD / (maxRd * maxSd) + 1
    elseif iEle == 2 then
        return ModuloInteger(UserD, (maxRd * maxSd)) / maxSd + 1
    elseif iEle == 3 then
        return ModuloInteger(ModuloInteger(UserD, (maxRd * maxSd)), maxSd)
    endif
endfunction
[/jass]
//这个是反运算的函数 iEle = 1时返回第一维元素位置 类推

评分

参与人数 1威望 +20 收起 理由
白银の游戏王 + 20

查看全部评分

发表于 2006-12-26 18:38:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2006-12-26 21:19:41 | 显示全部楼层
GW的办法-0-相当烦琐呐 一是要创造单位 二是要搜索单位 这个过程-0~ 特别是第二步 还需要创建一个条件函数
可能是由于当时没有USERDADTA可以利用的原因吧?这个功能MS是1.13时加入的?
要制作物品栏的话只要用一个arrayitem变量来储存这些物品就可以了 如果是这样的话只需要知道是哪个玩家的哪个英雄需要第几个物品就可以了 只需要
[jass]
//存入
function SaveItem takes item itSource, integer iOwn, integer iHero, integer iItem returns nothing
    set items[AryD3D( CmaxHero, CmaxItem, iItem, iHero, iOwn)] = itSource
    call SetItemPositionLoc( itSource, ClItemDepository)
return
endfunction
//取出
function LoadItem takes unit uAim, integer iOwn, integer iHero, integer iItem returns nothing
    call UnitAddItemSwapped( items[AryD3D( CmaxHero, CmaxItem, iItem, iHero, iOwn)], uAim)
return
endfunction
[/jass]
其中CmaxHero为在开始定义的常数 即第二维下标, CmaxItem为第三维下标, ClItemDepository 为存放物品的隐秘地点
仅仅只需要那么两个函数就可以轻易并且快速的完成物品的存取 当然物品的最大数量自然得<8192

因此N维数组的利用可以大大的方便编程 现在仅仅是3维 那么4维5维数组的价值呢?期待ing
过几天偶有空了还会写一个求多维数组公式的小程序 这样就能避免总是记忆复杂的表达式:P
回复

使用道具 举报

发表于 2006-12-26 21:53:38 | 显示全部楼层
既然素原创那就甲酚,虽然这素基本的方法...
回复

使用道具 举报

 楼主| 发表于 2006-12-26 22:26:02 | 显示全部楼层
难道说N维数组已经使用很久了?...
伤感情的说
不过偶对WE界的认识只停留在一年前的阶段罢了 最近发现RPG地图发展的那么快 欣慰啊
回复

使用道具 举报

发表于 2006-12-26 22:41:51 | 显示全部楼层
其实通过计算下标模拟多维数组很早就有了恩恩
而且比起多维数组,偶更倾向于使用缓存恩...
回复

使用道具 举报

发表于 2006-12-26 22:55:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2006-12-26 23:03:47 | 显示全部楼层
引用第6楼everguo2006-12-26 22:55发表的:
LS居然用马甲   不过效果还不错哈


缓存的确素个好东东 以后有机会我一定好好学下

.......

口粉口粉...
米看见ID么...这素“式神”而非“马甲”...

话说偶从来都不用jass工具的,一般都素在触发器中写代码,把触发器禁用保存,再把触发器打开调试...
回复

使用道具 举报

发表于 2006-12-26 23:09:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2006-12-26 23:10:46 | 显示全部楼层
式神是指仆人?
回复

使用道具 举报

 楼主| 发表于 2006-12-26 23:14:39 | 显示全部楼层
主要是容易直接当掉WE-0-
比如endif漏写啥的...偶初学Jass总是会这样 呵呵
回复

使用道具 举报

发表于 2006-12-26 23:21:09 | 显示全部楼层
当掉素经常滴事...
所以要在触发器中写代码,把触发器禁用保存...
这样至少不会丢失东西...
回复

使用道具 举报

发表于 2006-12-27 10:10:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 20:11 , Processed in 0.043371 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表