[Tutorial] Hashtable Custom Variable

  • Thread starter Thread starter dh-g
  • Ngày gửi Ngày gửi

dh-g

Fire in the hole!
Lão Làng GVN
Tham gia ngày
29/8/09
Bài viết
2,654
Reaction score
5,688
Bay h mình xin up bài tut này hướng dẫn mọi người cách sử dụng Hashtable và tác dụng thật của Hashtable là gì..:D


Hashing là cái gì?

Hashtable (mảng băm) là một cấu trúc dữ liệu cho phép lưu trữ & tìm kiếm giá trị (dạng chuỗi ký tự X Y) ở độ dạng Custom Variable. Nghĩa là tốc độ tìm kiếm phần tử luôn là một hằng số, dù số phần tử lên đến cả tỷ. củng có thể sử dụng ký tự dc.
Một Hashtable là gì? phần 2
Một Hashtable là gì?
Để bắt đầu, nó là một cấu trúc dữ liệu có khả năng giữ gần như bất kỳ loại dữ liệu trong Wc3. Nó có thể giữ nguyên, đơn vị, các hiệu ứng đặc biệt, và bất cứ điều gì khác mà bạn đã bao giờ sẽ cần phải lưu trữ.
Tôi biết những gì bạn đang suy nghĩ. "Nếu hashtables chỉ là mảng lớn, tại sao chúng ta cần chúng?" Hashtables bởi chính họ là không quá hữu ích, nhưng khi chúng ta sử dụng chúng với Xử lý ID họ thực sự có thể được vô cùng hữu ích. Chúng cho phép chúng tôi để "đính kèm" dữ liệu để xử lý có thể được lấy ra sau đó. Chúng tôi sẽ bao gồm này ngay bây giờ.

Tại sao hastable gọi là custom variable?

Tại vì hashtable là sử dạng cấu trúc định tùy biến như Variable chỉ khác 1 điều hashtable tự tạo tùy biến Variable không cần phải vào Ctrl +B Variables tạo lập tên giá trị tùy biến.

ví dụ trong Variable thì thế này.
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Set TempUnit = (Triggering unit)
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Unit - Kill TempUnit
còn trong Hastable Variable thì
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - Kill (Load (Key unit) of (Key unit) in Hastabletmp)
tại sao thế này dc? cái này sẽ giải thích ở phần tiếp theo.

Cách sử dụng hastable làm sao ?

bước 1 chúng ta lập trước 1 trigger thế này để làm bộ nhớ hastable
Mã:
int
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/events.gif[/IMG]Events
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/page.gif[/IMG]Map initialization
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/cond.gif[/IMG]Conditions
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/actions.gif[/IMG]Actions
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Create a hashtable
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Set Hastabletmp = (Last created hashtable)
cách nhớ giá trị
trong Variable
Mã:
AUS
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/events.gif[/IMG]Events
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - A unit Starts the effect of an ability
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/cond.gif[/IMG]Conditions
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/if.gif[/IMG](Ability being cast) Equal to Thunder Clap
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/actions.gif[/IMG]Actions
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Set TempUnit = (Triggering unit)
        Unit - Create 1 Footman for (Owner of (Triggering unit)) at (Center of (Playable map area)) facing Default building facing degrees
cách nhớ giá trị
trong Hastable
Mã:
AUS
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/events.gif[/IMG]Events
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - A unit Starts the effect of an ability
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/cond.gif[/IMG]Conditions
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/if.gif[/IMG](Ability being cast) Equal to Thunder Clap
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/actions.gif[/IMG]Actions
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Save Handle Of(Triggering unit) as (Key unit) of (Key unit) in Hastabletmp
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - Create 1 Footman for (Owner of (Load (Key unit) of (Key unit) in Hastabletmp)) at (Center of (Playable map area)) facing Default building facing degrees

liều này khác gì ? chẳng khác gì cả , cả 2 điều thực hiện tùy biến nhân hastable nó khó hơn 1 chút. lý do nó lưu bộ nhớ Variable theo dạng phân từ ký tự hoặc số theo X Y nên khác 1 chút so với Variable, Variable save dạng TempUnit = Triggering unit còn hastable thì thế mà khác nó lưu nhớ giá trị trong 1 bộ nhớ chung và cách xài chung nhau.

Vậy Hashtable và Variable ai tốt hơn ?

theo như so sánh Hashtable và Variable là không thể so sánh ai tốt ai không tốt cả :-?? lý do Hashtable là lưu nhớ tùy biến của Variable mục đích sử dụng khả năng hoạt động cao còn Variable thì cách lưu nhớ tùy biến đơn giản.

Cách sử dụng hashtable và cách nhập hashtable sẻ như thế nào ?

bước 1 tạo 1 trigger và tạo 1 value nhớ lại điểm tắt (Last created hashtable)
Mã:
int
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/events.gif[/IMG]Events
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/page.gif[/IMG]Map initialization
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/cond.gif[/IMG]Conditions
    [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/actions.gif[/IMG]Actions
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Create a hashtable
        [IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Set Hastabletmp = (Last created hashtable)
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Save Handle Of(Triggering unit) as [B][COLOR="red"](Key unit)[/COLOR][/B] of [COLOR="blue"][B](Key unit)[/B][/COLOR] in Hastabletmp
mục key tô màu R là key X
mục key tô màu B là key Y
2 giá trị này rất quan trọng trong hashtable value có thể bị trùng nhau khi 2 trigger bạn sử dụng giá trị cùng nhau ví dụ
sử dụng tại trigger phần 1
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Save Handle Of(Triggering unit) as (Key unit) of (Key unit) in Hastabletmp
và 1 trigger khác nếu sử dụng
Mã:
[s][IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Save Handle Of(Triggering unit) as (Key unit) of (Key unit) in Hastabletmp[/s]
thế là sai bạn có thể sử dụng kiểu
Mã:
[b][IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Save Handle Of(Triggering unit) as (Key unit2) of (Key unit2) in Hastabletmp[/b]
(Key unit2) hoặc (Key unit3)

cách lấy giá trị tùy biến từ Hashtable
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - Kill (Load [B][COLOR="red"](Key unit2)[/COLOR][/B] of [COLOR="blue"][B](Key unit2)[/B][/COLOR] in Hastabletmp)
muốn xóa 1 giá trị thì sử dụng kiểu
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Hashtable - Clear all child hashtables of child (Key unit2) in Hastabletmp
tương tự như
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Set TempUnit = No unit
tại sao lại xóa dc? lý do mình xóa mục key có tên là unit2 key này sử dụng giá trị (Triggering unit) được qua No unit
cách load giá trị thì sử dụng tên key XY không bắt buộc bạn phải sử dụng tên unit bạn có thể sử dụng bất kỳ 1 tên giá trị nào chỉ cần cần load và cần save đúng cách
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - Create 1 Footman for [B](Owner of (Load (Key unit) of (Key unit) in Hastabletmp))[/B] at (Center of (Playable map area)) facing Default building facing degrees

Hashtable có phải là MUI ko ?

Hashtable tùy biến giá trị như hẹt Variable việc tùy biến giá trị bạn có thể sử dụng
MUI Integer hoặc MUI Group ví dụ
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/set.gif[/IMG]Set TempUnit[MUI] = (Triggering unit)
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - Create 1 Footman for (Owner of TempUnit[MUI]) at (Center of (Playable map area)) facing Default building facing degrees
còn Hashtable thì
Mã:
[IMG]http://www.hiveworkshop.com/forums/images_all/trigger/unit.gif[/IMG]Unit - Create 1 Footman for (Owner of (Load MUI of (Key unit) in Hastabletmp)) at (Center of (Playable map area)) facing Default building facing degrees

bạn có thể sử dụng 1 key XY 1 key dạng Integer[MUI] 1 key dạng name để lưu lại giá trị tùy biến kiểu MUI

việc hướng dẫn mình chỉ viết tới đây thôi nếu có bị nếu không hiểu hay thắc mắc thì liên hệ mình..
 

Attachments

Chỉnh sửa cuối:
Bài viết dễ hiểu thanks nhé
Lúc đầu chả biết cái đó là gì :D
 
Chỉnh sửa cuối:
Dù sao thì hashtable trong war cũng ko đc nhanh lắm... nếu có thể tốt nhất là học vJass và dùng 1 lib chuyên dùng để indexing nào đó (UnitIndexer, AIDS, PUI...)
 
Hashtable này không biết có thể còn lưu trữ khi load next map không dh-g?
 
Dù sao thì hashtable trong war cũng ko đc nhanh lắm... nếu có thể tốt nhất là học vJass và dùng 1 lib chuyên dùng để indexing nào đó (UnitIndexer, AIDS, PUI...)

nói thật mình cảm nhận hashtable rất tiện cho tiện tạo variable nhanh chóng.

Hashtable này không biết có thể còn lưu trữ khi load next map không dh-g?

100% là không hashtable chỉ có hiệu lực trong 1 bản đồ nếu muốn hỗ trợ next map thì sử dụng game cache
 
100% là không hashtable chỉ có hiệu lực trong 1 bản đồ nếu muốn hỗ trợ next map thì sử dụng game cache

Ý dà....Game cache thì chết mất! khổ mỗi load và tạo!;))
Tại hạ làm xong thần long định làm tiếp RPG mà kiểu này chắc gian hồ bất tái ngộ rồi!;))
 
Ý dà....Game cache thì chết mất! khổ mỗi load và tạo!;))
Tại hạ làm xong thần long định làm tiếp RPG mà kiểu này chắc gian hồ bất tái ngộ rồi!;))

vậy máy project kia ? tình kiếm,thần long ? cậu định làm cả 3 à =))
 
Cách sử dụng Hashtable không phải là khó. Nếu không muốn nói là cực đơn giản.
Nhưng sử dụng nó như thế nào để có hiệu quả (ví dụ như MUI 1 skill dồn dmg chẳng hạn, hay ghi nhớ từng unit sau khi bị cast skill mà vẫn load chính xác được khi cast lại vào unit đó...) là cực khó. Tut này vẫn chưa nêu được nhiều công dụng khác của hashtable. Và cái này thì chỉ cần google cũng ra :">.
 
Cách sử dụng Hashtable không phải là khó. Nếu không muốn nói là cực đơn giản.
Nhưng sử dụng nó như thế nào để có hiệu quả (ví dụ như MUI 1 skill dồn dmg chẳng hạn, hay ghi nhớ từng unit sau khi bị cast skill mà vẫn load chính xác được khi cast lại vào unit đó...) là cực khó. Tut này vẫn chưa nêu được nhiều công dụng khác của hashtable. Và cái này thì chỉ cần google cũng ra :">.

tạm thời post nhiêu đó thôi đau đầu quá (:|
cái việc hashtable trong TUT này chỉ giải thích sử dụng ra sao là good rồi :D
 
Mã:
Set TempUnit = (Triggering unit)
Unit - Create 1 Footman for (Owner of (Triggering unit)) at (Center of (Playable map area)) facing Default building facing degrees

vừa đặt biến TempUnit xong ở dưới lại dùng Triggering unit, vậy đặt biến làm gì?

Mã:
Hashtable - Save Handle Of(Triggering unit) as (Key unit) of (Key unit) in Hastabletmp
Unit - Create 1 Footman for (Owner of (Load (Key unit) of (Key unit) in Hastabletmp)) at (Center of (Playable map area)) facing Default building facing degrees

cách trên và cách dùng variable, đúng là không khác nhau, tuy nhiên cách này chậm hơn trông thấy, không ai làm vậy cả

--------

Mã:
Unit - Kill (Load (Key unit2) of (Key unit2) in Hastabletmp)

lấy ví dụ về cách lấy unit trong hashtable sao lại dùng ví dụ này?
cái này:

Mã:
Set TempUnit = Load (Key unit2) of (Key unit2) in Hastabletmp

ko tốt hơn?
 
@Tom_Kazansky:

à cái việc này em chỉ đưa ra 1 cái ví dụ thôi ấy mà :-s
 
Chỉnh sửa cuối:
Back
Top