请选择 进入手机版 | 继续访问电脑版

GA地精研究院

 找回密码
 立即注册
查看: 9073|回复: 46

[教程] 哈希表教程——我不会告诉你这是T版的!(已添加4个演示~ 2012/07/13)

[复制链接]
发表于 2012-7-7 11:47:23 | 显示全部楼层 |阅读模式
本帖最后由 chyj4747 于 2013-3-6 02:45 编辑

此帖仅在疑难区投影一个月,错过的孩子们请到综合区翻找……
修正:错过的孩子们应该不会知道这个帖。。   

【本教程附带演示在38楼

庆祝一下吧~ 本教程前言只有一句废话:
本教程使用YDWE 1.20 中的动作作为T教材。

你确定这里是正文?:
       风和日丽的某天,一块空荡荡的荒地上建起了一座哈希小区(禁止吐槽这设定!不然我跟你急!)。哈希小区不是一般的大,放眼望去成千上万的公寓,每幢公寓的门牌号也是从0到……这房子太高了看不到顶上的门牌号。。
一天,一位骑着白马的……王子?骑白马的不一定是王子,也有可能是大法~  。。。 总之就是来入住了,向哈希中介申请了第1幢1号房,进门一看。。。“!!这不坑人嘛。。这两平米的房间怎么住啊!!”然后就被中介踹了进去……
       第二天,来了一个扛着金袋的……小偷?强盗?错了!是农民。。。这位农民大伯也想住第1幢1号房,中介查了一下记录:“非常抱歉,那间房已经住了一个老头和一匹老马。您可以选择别的房间,都是空着的。”农民大伯怒了:“你们这种城里人,就知道欺负乡下人!”中介:“⊙﹏⊙b汗… 那好吧,如果您一定要住那间房我们倒是不介意~”于是大法被踹出了门。。。【默哀三分钟……】
       第三天,农民大伯也受不了那两平米大小的房间。。决定搬走……中介说:“不行!你不能走!”大伯:“靠!你们又欺负乡下人!”中介:“……不是。。我们是真没这种单独一个住户退房的服务”这时中介老板来了电话:“算了,别跟自称乡下人一般见识,开个特别J服务给他办退房手续吧”…………于是大伯退了房
       第四天,为了解决这种不同住户要住同一间房这种的冲突,哈希中介决定采用住户的身份证号码来分配房间,于是不幸路过的剑圣被塞进了第1幢第xxxxxxxxx号房。。
       第五天来了个行李很多的旅人,哈希中介给了他第yyyyyyyyy幢1号房,然后为了不跟别的住户的东西弄混,他的东西全部塞进了同一幢的2号房、3号房、4号房……

       ……几年后,哈希小区住满了各式各样的住户,有的叫整数,有的叫实数,有的叫字符串,还有的叫句柄(小学每次考“有的…有的…还有的…”句式我都是满分你信不信~)

       某一天,哈希小区要整顿第1幢房,于是就将里面的用户全赶了出来……
       另一个某一天,哈希小区要整顿所有的房子,于是将全小区的人赶了出来……


你没瞎,这里才是正文!:
如果你坚持看完了上面某龙YY的东西呢,那么恭喜你学会了哈希表几乎所有功能~
现在开始逐条转成T:
风和日丽的某天,一块空荡荡的荒地上建起了一座哈希小区

首先呢,在ctrl+b里新建一个哈希表变量,我惯用的名字是HT(哈希表英文:HashTable,取两个大写字母)。
[trigger]
    动作
        哈希表 - 创建一个新的哈希表
        设置 HT = (最后创建的哈希表)
[/trigger]
于是哈希小区就建好了~
注:除了这个“创建一个新的哈希表”,其它哈希表动作推荐全部使用后缀带[ci]的动作

这里先说明一下,如果平时做图不使用YDWE的智能注入的话,有几个动作需要写自定义代码,其实并不是什么麻烦的事,原版UI连删除点都要自己写RemoveLocation呢~

被坑的大法入住了第1幢1号房

[trigger]
    动作
        哈希表 - 在 HT 的主索引 1 子索引 1 中保存单位 大魔法师 0000 <预设>
[/trigger]
就这么简单~ 主索引就是第几幢,子索引就是第几间

农民大伯也想住第1幢1号房,中介查了一下记录

中介所查的就是第几幢第几间里有没有住人。
[trigger]
    条件
        (子索引为 1 的 handle 类数据被保存在主索引为 1 的 HT 中) 等于 TRUE
[/trigger]
这个条件在布尔值里,那个handle呢是句柄,这里简单地记一下就是除了整数、实数、布尔值、字符串以外的所有数据类型都是句柄(比如单位、计时器)
这个条件的作用呢是判断第几幢第几间里是否有人住着~ 如果有就是TRUE,没有就是FALSE

某龙的温馨提示:
不过这里要注意的一点是:这个条件是没法判断句柄数据是否被保存在哈希表里的!!!
或者说,只要判断句柄,这个条件返回的肯定是FALSE这个结果!!!

为什么呢???
这个就是暴雪的问题了(也可能是YDWE的BJ文件有问题)。。。
这个条件开始判断的时候,会先看你要判断哪种类型的数据,是整数?实数?布尔值?字符串?还是字符串?不符合以上的数据类型就判断为FALSE,看完数据类型再去判断在还是不在。
??? “字符串?还是字符串?”
所以说,句柄这个数据根本就不会被判断到,于是判断句柄就只有FALSE……


那么上面这个问题怎么解决呢……
像RemoveLocation那样写J呗~
[trigger]
    条件
        (HaveSavedHandle( udg_HT, 1, 1 )) 等于 TRUE
[/trigger]
幸好YDWE支持任意地方写自定义代码~
Have:有;
Saved:被保存的;
Handle:句柄
udg_HT:这个就是哈希表变量HT,写入的时候记得加udg_,这个属于J的范畴所以不解释了,记住就好~
第一个1是主索引,第二个1就是子索引
放到原文的环境中
[trigger]条件:(有没有人住呢( 哈希小区, 第一幢, 第一间 )) 等于 TRUE[/trigger]

“……那好吧,如果您一定要住那间房我们倒是不介意~”于是大法被踹出了门

若将数据存在同一个地方是会冲突的,就像变量那样:
[trigger]设置 A = 1
设置 A = 2[/trigger]
那么A就是2而不是1
也就是说,如果一开始在HT的主索引1子索引1里存了大法,之后又在同一个地方存了农民的话,那么之前存的大法就没了……

开个特别J服务给他办退房手续吧

我很好奇为什么果子不把这个动作加进去。。
单独删除某哈希表某主索引某子索引里的数据的时候就要用到J了
[trigger]
    动作
        自定义代码:   call RemoveSavedInteger( udg_HT, 1, 1 )
        自定义代码:   call RemoveSavedReal( udg_HT, 1, 1 )
        自定义代码:   call RemoveSavedBoolean( udg_HT, 1, 1 )
        自定义代码:   call RemoveSavedString( udg_HT, 1, 1 )
        自定义代码:   call RemoveSavedHandle( udg_HT, 1, 1 )
[/trigger]
神马!你看晕了……别学了,直接按后退键吧~

咳咳。。
仔细一看格式几乎一样呢~ 非常好记~
call:调用(某个函数,或者说动作)
Remove:移除、删除
Saved:被储存的、已储存的
Integer:整数 | Real:实数 | Boolean:布尔值 | String:字符串 | Handle:句柄
后面的参数与之前那个条件顺序相同:哈希表变量名(记得加 udg_ 前缀),主索引,子索引
:除了整数、实数、布尔、字符以外,所有的数据都用Handle(句柄)来删除

为了解决这种不同住户要住同一间房这种的冲突,哈希中介决定采用住户的身份证号码来分配房间

嘛。。这里需要知道的一点就是,所有的句柄都有个类似身份证的数字,每个句柄的这个数字跟身份证一样是互不相同的,所以可以用这个数字来做主索引或子索引就可以避免冲突的产生~
同时这也是哈希表的关键,比如可以利用这个不同特征给单位A绑计时器,之后可以从单位A获取绑定的计时器,这样读取的计时器绝对是给单位A用的而不是给别的单位

然后就有个用不用YD的智能注入功能的分支了:
获得某个句柄的身份证号码要用下面这个动作:
[trigger]
    动作
        设置 Int = (获取 大魔法师 0000 <预设> 的整数地址)
[/trigger]
Int是整数变量,身份证号码你们不可能见过小数的吧……谁见过我核弹谁!!!

在YD的T动作里,获取不同类型的句柄的句柄值(身份证号码)被分成了很多不同的动作,上面这个T里用的是“获取单位的整数地址”,如果是计时器,那么就要用“获取计时器的整数地址”

现在来讲讲分支何在~
YDWE对这个动作做过处理的,也就是实际上这个动作是YDWE专有动作,需要用智能注入功能才能使用
那么从来不用智能注入或怕智能注入给地图增加不必要的大小的同学呢就必须自己写J了~
放心,这次总共就一句J~~~
[trigger]
    动作
        设置 Unit = 大魔法师 0000 <预设>
        自定义代码:   set udg_Int = GetHandleId( udg_Unit )
[/trigger]
Get:获取   
Handle:句柄  
Id:值(身份证ID神马的就类似这个意思~)
括号里面是上面那个Unit变量,前缀加udg_

于是不幸路过的剑圣被塞进了第1幢xxxxxxxxx号房

稍微修改下。。剑圣换大法吧……我懒得换单位。。
[trigger]
    动作
        设置 Unit = 大魔法师 0000 <预设>

        注释 ------  用智能注入  ------
        设置 Int = (获取 大魔法师 0000 <预设> 的整数地址)
        注释  ------  不用智能注入  ------
        自定义代码:   set udg_Int = GetHandleId( udg_Unit )

        哈希表 - 在 HT 的主索引 1 子索引 Int 中保存单位 Unit
[/trigger]
于是那个子索引就是这位大法的身份证Id号了~
即便还有另一个大法,根据法律每个公民必须拥有不同的身份证号码,所以获得的句柄值跟第一个大法是不同的~  于是就不会冲突~  来多少人都可以入住第1栋公寓
情景化说明
比如第一个大法的句柄值(身份证号码)是12345
那么第二个大法的句柄值就绝对不可能是12345,这里假设是67890好了
两个大法都入住第一幢,由于是用句柄值作为门牌号,所以第一个大法住12345号房,第二个住67890号房,于是没有冲突

第五天来了个行李很多的旅人,哈希中介给了他第8xxxxxxxx幢1号房,然后为了不跟别的住户的东西弄混,他的东西全部塞进了同一幢的2号房、3号房、4号房……

比如要给一个单位绑定很多数据的时候就可以用这个单位的句柄值作为主索引,数据全部存在子索引,这样由于不存在别的相同的句柄值,给别人绑定的数据肯定不会与这个单位的冲突~
[trigger]某龙的哈希教程
    事件
        单位 - 大魔法师 0000 <预设> 接受伤害
    条件
    动作
        设置 Unit = (触发单位)
        自定义代码:   set udg_Int = GetHandleId( udg_Unit )
        哈希表 - 在 HT 的主索引 Int 子索引 1 中保存单位 (伤害来源)
        哈希表 - 在 HT 的主索引 Int 子索引 2 中保存实数 (单位所受伤害)
[/trigger]

某一天,哈希小区要整顿第1幢房,于是就将里面的用户全赶了出来……
另一个某一天,哈希小区要整顿所有的房子,于是将全小区的人赶了出来……

这两个一起吧~
[trigger]未命名触发器 001
    事件
        单位 - 大魔法师 0000 <预设> 接受伤害
    条件
    动作
        设置 Unit = (触发单位)
        自定义代码:   set udg_Int = GetHandleId( udg_Unit )
        哈希表 - 在 HT 的主索引 Int 子索引 1 中保存单位 (伤害来源)
        哈希表 - 在 HT 的主索引 Int 子索引 2 中保存实数 (单位所受伤害)
        哈希表 - 清空 HT 中位于主索引 Int  之内的所有数据
        哈希表 - 清空 HT
[/trigger]
运行了倒数第二句动作后,在主索引Int里储存的全部数据全都被删除了,也就是之前保存的伤害来源和所受伤害全都从哈希表里清除了
运行了最后一句动作后不管你在HT里储存了多少数据,不管这些数据是存在哪些索引下的,通通删除

某龙的保存点:
整理下到目前为止学过的内容吧:
1. 创建哈希表
2. 储存数据
3. 判断是否储存数据
4. 移除某个子索引下的数据
5. 获取句柄值
6. 以句柄作为子索引
7. 以句柄作为主索引 (一般绑定用的是这个~)
8-9. 清除某个主索引下的所有数据;清除某个哈希表内的所有数据

如果你坚持看完了上面某龙YY的东西呢,那么恭喜你学会了哈希表几乎所有功能~

知道为什么是几乎所有吗~
因为你们还不会读取数据。。。像之前那样存了伤害来源和所受伤害后要如何取出来用呢……
[trigger]未命名触发器 001
    事件
        单位 - 大魔法师 0000 <预设> 接受伤害
    条件
    动作
        设置 Unit = (触发单位)
        自定义代码:   set udg_Int = GetHandleId( udg_Unit )
        哈希表 - 在 HT 的主索引 Int 子索引 1 中保存单位 (伤害来源)
        哈希表 - 在 HT 的主索引 Int 子索引 2 中保存实数 (单位所受伤害)
        设置 Unit = (在 HT 的主索引 Int 子索引 1 内提取单位)
        设置 Real = (在 HT 的主索引 Int 子索引 2 内提取实数)
        哈希表 - 清空 HT 中位于主索引 Int  之内的所有数据
[/trigger]
做了如上的处理后,Unit就是伤害来源了,而Real就是所受伤害值~

千万记得在用完之后要排泄哦~~~
所谓哈希表的排泄就是清除里面的数据,一般是直接清除某个主索引下的所有值~

还有一件事~
将句柄值作为索引的时候还可以这样写:
[trigger]未命名触发器 001
    事件
        单位 - 大魔法师 0000 <预设> 接受伤害
    条件
    动作
        设置 Unit = (触发单位)
        -------- 不用智能注入的同学: --------
        哈希表 - 在 HT 的主索引 (GetHandleId( udg_Unit )) 子索引 1 中保存单位 (伤害来源)
        -------- 用智能注入或不想写J的同学: --------
        哈希表 - 在 HT 的主索引 (获取 Unit 的整数地址) 子索引 2 中保存实数 (单位所受伤害)
[/trigger]
不过这种写法在需要多次获得同一个句柄值的时候完全不推荐,因为获取句柄值的运行效率比从变量读取数据要慢
         

唔。。这个东东……对于T来说似乎没什么用嘛……
嘛。。做个简单的东西给你们看下好了,虽然不用哈希表一样实现。。
[trigger]某龙的哈希教程1
    事件
        玩家 - 玩家1(红色) 按下Esc键(跳过电影)
    条件
    动作
        设置 Unit = (新建 玩家1(红色) 的 大魔法师 在(0.00,0.00),面向角度:0.00 度)
        设置 Eff = (新建特效 Abilities\Spells\Other\TalkToMe\TalkToMe.mdl 并绑定到 Unit 的 head 附加点上)
        设置 Timer = (新建的计时器)
        设置 Int = (GetHandleId( udg_Timer ))
        哈希表 - 在 HT 的主索引 Int 子索引 1 中保存单位 Unit
        哈希表 - 在 HT 的主索引 Int 子索引 2 中保存特效 Eff
        计时器 - 启动 Timer,应用计时方式: 一次性,计时周期为 3.00 秒
        触发器 - 为 某龙的哈希教程2 添加事件: (时间 - Timer 到期)
[/trigger]
[trigger] 某龙的哈希教程2
    事件
    条件
    动作
        设置 Timer = (到期的计时器)
        设置 Int = (获取 Timer 的整数地址)
        设置 Unit = (在 HT 的主索引 Int 子索引 1 内提取单位)
        设置 Eff = (在 HT 的主索引 Int 子索引 2 内提取特效)
        单位 - 杀死 Unit
        特殊效果 - 删除 Eff
        哈希表 - 清空 HT 中位于主索引 Int  之内的所有数据
        计时器 - 删除 Timer
[/trigger]
如果在“某龙的哈希教程2”里直接用之前变量保存的值而不用哈希表储存会怎样呢?
3秒内第二次按了ESC的话这些变量的值就变了,第一次3秒到期后删除的是第二次创建的单位和特效,也就是全局变量冲突~
         

再庆祝一下吧~ 本教程尾声只有两句废话:
教程到此为止……
要如何使用或者如何灵活使用完全取决于你们的想象力了~
   

额。。。又忘了……写J教程的时候已经忘过一次了

字符串也是有身份证的,不同的字符串的身份号码是不同的,不过字符串的身份号码不叫句柄值,叫什么无所谓啦~
当然,字符串的身份号码也不会和句柄的重复~
[trigger]
    动作
        设置 Int = (转换 abc 为整数)
[/trigger]
abc是字符串~
这个动作不跟那些“获取XX的整数地址”在一起,这个动作YD1.20中在最下面,“哈希表 - <1.24>获取字符串的哈希值[ci]”
 楼主| 发表于 2012-7-7 12:00:09 | 显示全部楼层
沙发自己~
我没有很仔细地复查过一遍。。所以如果有什么地方写错了或错别字什么的请在LX跟帖~
回复 支持 反对

使用道具 举报

发表于 2012-7-10 08:52:33 | 显示全部楼层
噢F@CK……

完全看不懂啊……

话说不用YDWE就一定要用代码才能使用哈希表吗?
回复 支持 反对

使用道具 举报

发表于 2012-7-10 08:55:25 | 显示全部楼层
Hash表当然是官方版本就自带的功能啊
回复 支持 反对

使用道具 举报

发表于 2012-7-10 09:22:00 | 显示全部楼层

回 麦德三世 的帖子

麦德三世:Hash表当然是官方版本就自带的功能啊 (2012-07-10 08:55)
并不是那个意思,我是指是不是哈希表在使用的时候就必须要用代码什么的?

因为我见很多人发的哈希表的演示都是用各种代码什么的,单纯靠T里面的项目不行吗?
回复 支持 反对

使用道具 举报

发表于 2012-7-10 09:26:52 | 显示全部楼层
龙兄能不能帮忙做一个演示,一个多人单体减速持续时间可无限叠加的技能演示

比如

发动技能效果

设置目标变量,添加减速光环,绑定计时整数

启动每秒计时器,计时变量每秒+1

等于或大于3时删除减速光环

而目标在持续时间内受到另一个单位的技能效果

那么就直接把计时变量清0

单纯用T的做法我会,但是据说哈希表做这类的技能效率更高更好

事实上有很大差别的么?
回复 支持 反对

使用道具 举报

发表于 2012-7-10 10:30:09 | 显示全部楼层
我从用YDWE之后才知道有哈希表…… 还觉得名字很可爱

多人什么的太耗脑细胞了,有时间慢慢看……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-10 11:11:57 | 显示全部楼层
冷漠:龙兄能不能帮忙做一个演示,一个多人单体减速持续时间可无限叠加的技能演示

比如

发动技能效果
....... (2012-07-10 09:26)
额。。。抱歉,演示是没时间做了……最近学校的程序作业一堆一堆的。。

话说不用YDWE就一定要用代码才能使用哈希表吗?
我就只用过红狼的和YD,所以像什么夜天啦,Newgen啦有没有把哈希表加入T我就不知道了……
完全看不懂啊……
关于这一点呢……好吧,我承认教程写得比较急,所以教程结构不是处理得很好。。

哈希表其实就一个使用思路:
1. 创建一个哈希表,且一般来说一个哈希表足够为全图的东西提供服务
2. 往哈希表储存数据,储存动作会问你要哈希表变量名、主索引、子索引、和被储存的数据这四个参数,被存的数据可以是任何类型:整数、实数、字符串、布尔值、单位、计时器、对话框、玩家组等等
3. 从哈希表读取数据,读取动作会问你要哈希表变量名、主索引、子索引这三个参数,然后你就可以从这个动作获得你储存的数据了,使用读取出来的数据最好使用同数据类型的变量记录,因为重复读取会占很多效率
4. 当储存的数据别无它用的时候排泄掉~


嘛。。刚才又大致浏览了一遍顶楼的东西……
全部白底黑字的确不知道哪些是重点。。我一会儿就整理下~
回复 支持 反对

使用道具 举报

发表于 2012-7-10 12:44:43 | 显示全部楼层
冷漠:

并不是那个意思,我是指是不是哈希表在使用的时候就必须要用代码什么的?

因为我见很多人发的哈希表的演示都是用各种代码什么的,单纯靠T里面的项目不行吗?


我的意思就是可以直接使用官方WE的触发器阿。


未命名.jpg
回复 支持 反对

使用道具 举报

发表于 2012-7-10 13:30:30 | 显示全部楼层
..哈希表是hash的音译加上table的直译,这翻译很坑跌
  原本意思是杂凑表,是一种数据结构,一般使用字符做索引<YDWE>是这样做的
   但是了一个好的srting函数是难得设计的,暴雪还是使用了整数为索引
  所以说,YDWE带了一个把string转成integer的函数
  hashtable主要的功能是用来传递数据,而不是存储数据<使用缓存吧>
   事实上,纯T写地图应该很少用到这功能,大家一般都是直接全局变量传递数据
  大家可能不懂什么叫传递数据,因为一般也用不到
    使用jass就比较常见hashtable的运用了,一般地图只使用一个Hash表
   索引一般都是常量,使用CONSTANT来修饰,在YDWE的语法里,可以使用C语言的
#define语法
说了这么多废话,等于没说
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-10 13:34:29 | 显示全部楼层
麦德三世:我的意思就是可以直接使用官方WE的触发器阿。

....... (2012-07-10 12:44)
还真有…………
早知道我就拿原版WE做教程了。。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 13:52:08 | 显示全部楼层

回 lia77593 的帖子

lia77593:  ..哈希表是hash的音译加上table的直译,这翻译很坑跌
  原本意思是杂凑表,是一种数据结构,一般使用字符做索引<YDWE>是这样做的
   但是了一个好的srting函数是难得设计的,暴雪还是使用了整数为索引
  所以说,YDWE带了一个把s .. (2012-07-10 13:30)
获取字符串hash这个同样也是we的自带功能。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 13:57:53 | 显示全部楼层

回 麦德三世 的帖子

麦德三世:获取字符串hash这个同样也是we的自带功能。 (2012-07-10 13:52)
     ...没有看见 ....
回复 支持 反对

使用道具 举报

发表于 2012-7-10 14:05:01 | 显示全部楼层
Hashtable的主要用途倒不是单纯的传递数据。

而是比较方便建立对象之间的对应关系。

比方说。今儿个我要做个物品。这个物品对目标单位使用后就会抽取目标的魂魄,然后你再使用这个物品,对应的单位就会立刻死亡。(这个例子其实是我03年的时候做的第一个Jass演示,而且此后我不断把这个例子拿出来举例


在这个时候呢,我们就需要在这个物品和单位之间建立对应关系了。假如我地上有100个这种物品,我要怎么知道哪个物品对应哪个单位呢?

我们可以通过获取handle函数来获得单位和物品的唯一编号。但这些编号通常很大。所以我们要把这些编号放到数组的索引里会很麻烦,而且,有时候我们不知道这个地图上到底会出现多少个这种物品,我们如果申请一个定长数组,那么要么会浪费,要么会不够用。

这时候hashtable就是一个不错的选择,我们可以把物品的handle作为哈希表的key,然后把对应的单位作为值存入。而当我们触发“使用物品”事件的时候,可以直接获取触发物品的handle,然后直接用这个handle就能一步达成地哈希表里查询到它对应的单位。

所以一般来说,哈希表的key是整数就足够了。何况哈希表还能作为一个变长数组来使用,执行效率也够高,因此是蛮好的功能。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 14:11:01 | 显示全部楼层
特别一提的是额外知识是,1.23之前其实没有哈希表这个东西。也没有获取handle的函数。

当时只有缓存,但是缓存除了key是字符串,另外单人模式时可以把数据存储到硬盘上以外,和现在的哈希表其实没啥区别。而且当时虽然没有官方的获取handle函数,但却可以用return bug和union bug来直接把handle类型的变量转换为整数。所以效果完全一样。

当然,加入hashtable后,就尽量使用hashtable吧。毕竟缓存的执行效率实在太低,而哈希表的执行效率几乎可以赶得上数组。

当然,条件合适的时候还是用数组吧,毕竟数组还是最快的。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 14:22:11 | 显示全部楼层

回 lia77593 的帖子

lia77593:

     ...没有看见 ....

未命名.jpg

关于获取字符串ID这个函数,特别需要注意的是,这个函数忽略字母的大小写,所以"ABC坦克"和"abc坦克"的处理结果是一样的。毕竟war3本来就是个忽略大小写的系统。

另一个要点是,和获取handle的函数的原理不同,这个函数并不是直接获得字符串的handle,而是通过运算字符串的内容来获得一个整数值。

毕竟,字符串的handle在保存和读取地图的时候或者其它一些意外状况下是会发生变化的,因此直接返回其handle值会不稳定。(并不是说其它handle不会变,只是string特别明显)

通过直接运算字符串内容才能保证记录下的值不会发生变动。而且就算地图不同,相同字符串的计算结果也容易预测。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 15:30:17 | 显示全部楼层

回 麦德三世 的帖子

麦德三世:Hashtable的主要用途倒不是单纯的传递数据。

而是比较方便建立对象之间的对应关系。

比方说。今儿个我要做个物品。这个物品对目标单位使用后就会抽取目标的魂魄,然后你再使用这个物品,对应的单位就会立刻死亡。(这个例子其实是我03年的时候做的第一个Jass演示,而且此后我不 .. (2012-07-10 14:05)
  .其实我想说的意思就是这个啊,汗 ....
  . 头目把这个说明白了
     本来要声明一个全局数组来达到记录的功能.....
    好吧,受教了,这个叫做建立联系
回复 支持 反对

使用道具 举报

发表于 2012-7-11 07:35:55 | 显示全部楼层
蛋疼啊,那么看来不会JASS代码的话是用不了哈希表啊……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-11 09:04:07 | 显示全部楼层
冷漠:蛋疼啊,那么看来不会JASS代码的话是用不了哈希表啊…… (2012-07-11 07:35)
其实不难学,耐下心慢慢看嘛~

而且谁说不会J用不了的。。

开启智能注入+不使用单独删除数据的话YD的T完全可以~
PS:红狼UI没有哈希表……于是我以为原版也木有哈希表。。

双休日再过来看吧~ 我会放几个演示上来(不保证没空也不坑……),而且如果时间允许,我再写个简明扼要的版本好了~
其实顶楼已经有一个演示了的说……
回复 支持 反对

使用道具 举报

发表于 2012-7-11 09:38:18 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:其实不难学,耐下心慢慢看嘛~

而且谁说不会J用不了的。。

....... (2012-07-11 09:04)
老狼的UI是1.23前做,自然没有这玩意儿。

DDWE就更是如此了,那是我04年做的。那时候1.20都没到,1.13都才出不久的样子。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2019-12-10 13:08 , Processed in 0.393298 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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