[Tutorial] Hashtable Custom Variable

Thảo luận trong 'World Editor' bắt đầu bởi dh-g, 2/6/11.

  1. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    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
    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..
     

    Các file đính kèm:

    Chỉnh sửa cuối: 2/6/11
    AzuhaSky thích bài này.
  2. DragonKai

    DragonKai Mr & Ms Pac-Man

    Tham gia ngày:
    10/2/11
    Bài viết:
    222
    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: 2/6/11
  3. zollback

    zollback Youtube Master Race

    Tham gia ngày:
    16/5/10
    Bài viết:
    88
    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...)
     
  4. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Hashtable này không biết có thể còn lưu trữ khi load next map không dh-g?
     
  5. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    nói thật mình cảm nhận hashtable rất tiện cho tiện tạo variable nhanh chóng.

    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
     
  6. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Ý 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!;))
     
  7. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    vậy máy project kia ? tình kiếm,thần long ? cậu định làm cả 3 à =))
     
  8. raivor

    raivor Dragon Quest Lão Làng GVN

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,411
    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 :">.
     
  9. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    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
     
  10. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    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?
     
  11. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    @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: 18/2/12

Chia sẻ trang này