GM: AI cho game

Thảo luận trong 'Tools và Engine' bắt đầu bởi >VoDich<, 6/9/06.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@:
    ok, hum nay mình bàn về AI trong GM.

    làm AI cho 1 game với GM không cần gì quá cao siêu.

    trước tiên mình cần vạch rõ AI này cho thể loại game gì.

    Ví du: 1 game hành động 2D platform

    OK, tiếp theo cần xác định AI có bao nhiêu trạng thái (TT) (đừng yên, đi bộ, chạy, nhảy lên, rớt xuống..) ta sẽ đặt hằng số cho các trạng thái đó với 1 giá trị nhất định
    ví dụ: TT đứng yên là ai_stand = 1, chạy là ai_run = 2

    và các trạng thái này có cần phải thực hiện đồng thời hay không. thí dụ vừa thở vừa chạy. vậy ta cần 1 mảng đơn giản để chỉ ra 2 trạng thái đồng thời của AI: status[0] = ai_run; status[1] = ai_breath

    sau đó dùng câu lệnh điều kiện switch để chọn tra trong những trạng thái nhất định thì phải làm gì, sẽ là 2 command switch nếu sẽ có 2 trạng thái xảy ra đồng thời.
    ví dụ:
    Mã:
    switch(status[0]){
    
    case ai_run:
     sprite_index = spr_char_run
    break;
    }
    
    Song song với các trạng thái ta sẽ có các hành động(action) của AI
    (truy tìm mục tiêu, chờ, tấn công, phòng thủ .....) cũng như status, ta đưa hết các hành động sẽ có qua hằng số. và sẽ có 1 mảng action nếu như AI có thể có nhiều hành động cùng lúc ( vừa nhảy vừa bắn, vừa chạy vừa bắn);

    ở đây với game hành động thì có thể chia ra 2 mảng như sau: action[0] cho biết các hành động bình thường như tìm diệt, né tránh, và action[1] cho hành động tấn công, vì thường các nhân vật có thể vừa né vừa tấn công hay các hành động bò trườn + tấn công, như thế sẽ thật hơn.

    cũng như phần trạng thái, cần 2 command switch.

    tiếp tục: nếu 1 game bắn súng, AI sẽ có thể được diễn tả như sau.

    - nó có mắt quan sát với chỉ 1 tia nhìn (đơn giản) hay 1 khoảng nhìn như commandos, và tiếp theo vũ khí của nó cũng có 1 tia nhìn.

    - nó luôn luôn được đặt trong trạng thái tìm kẻ thù ( nếu có các biểu hiện lạ như tiếng súng, vết đạn, máu nó sẽ truy tìm theo hướng phát ra) ta đặt các obj vết đạn, máu có chứa 1 giá trị là hướng xuất phát của nó, ví dụ vết đạn
    có dir_start = 360, xStart = 200) AI khi bắt gặp vết đạn đầu tiên sẽ kiểm tra 2 giá trị kia để có thể cho ra hướng chính xác cần phải đi, sau đó có thể set 1 biến của vết đạn để cho biết AI đã kiểm tra vết đạn này rồi, lần sau ko kiểm tra nữa

    - 1 khi AI phát hiện kẻ thù( ta dùng collision_line để kiểm tra AI có nhìn thấy mục tiêu hay không) tiếp đó sẽ kiểm tra xem hướng bắn có bị cản không, thường thì con mắt nằm cao hơn 1 khoảng với tầm tấn công của vũ khí, nếu tầm bắn không cản và mục tiêu nằm trong tầm bắn thì action[1] = ai_attack, tức ngụ chỉ AI phải tấn công, nếu tìm thấy mục tiêu nhưng hướng bắn bị cản thì action[0] = ai_huntTarget ngụ ý AI phải truy tìm mục tiêu.

    nếu sau 1 khoảng thời gian mà AI vẫn không tìm thấy hướng bắn hay mục tiêu đã ẩn nấp thì AI sẽ quay trờ lại vị trí ban đầu với action[0] = ai_search

    tất cả đều rất đơn giản để làm chỉ với các câu lệnh if else đơn giản nhất.
    để làm AI phong phú hơn thì bạn phải tìm ra các hành động mới hơn, và cách thức xử lý tình huống, mức độ ưu tiên cho các hành động của AI
    ví dụ AI nhát thì ưu tiên né tránh (khôn đó ^^) còn AI ham oánh thì ưu tiên tấn công (ngu!!) khi gặp trường hợp là bị bắn xối xả ( ta có thể dùng 1 biến hit của AI để đếm số lần tấn công này để biết bị tấn công ít hay nhiều, tuy nhiên biến hit này sau 1 thời gian sẽ reset = 0, có thể dùng alarm )

    ok, nói thì dễ nhưng làm chỉ ..... mắc công thôi, chứ chẳng khó lắm đâu. Tất nhiên những AI như nói trên sẽ có rất nhiều phép toán cần thực hiện, nếu quá nhiều con AI thế này thì game chắc chắn sẽ giảm tốc 1 cách thê thảm, vì vậy với những enemy thường thì ta làm nó ngu ngu thôi ^^. còn tên boss thì ráng nghĩ ra nhiều chiêu hay hay.

    tôi có gửi kèm 1 con BOT, tuy chưa hoàn thiện nhưng có lẽ sẽ đủ minh họa cho bài viết trên

    http://forums.gamevn.com/attachment.php?attachmentid=44848&d=1157720819

    :@}
     
  2. shadow_judge

    shadow_judge The Warrior of Light Lão Làng GVN

    Tham gia ngày:
    1/5/06
    Bài viết:
    2,081
    Hay hay, quên mất cái lệnh case, cái này tiết kiệm code lắm đó!!!
     
  3. LinhMoi22

    LinhMoi22 The Warrior of Light

    Tham gia ngày:
    6/7/05
    Bài viết:
    2,085
    Nơi ở:
    hellcity
    tuyệt code này cần thiết lắm ty nhiều
     
  4. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    chính xác rồi đó , game em luôn có dòng lệnh if , else , AI đa số đều là if else
    ngay như game anh hùng ko gian demo mà bác vodich nói em ăn cắp từ example khác phần AI , thực sự giải thuật ra rất dễ chỉ với if else , ponit_dítance , íntance _number ....
     
  5. Mozzila†hunder

    Mozzila†hunder Dragon Quest

    Tham gia ngày:
    29/5/06
    Bài viết:
    1,295
    Nơi ở:
    Ha Noi, Vietnam
    Ủa có thấy code gì đâu?
    Mỗi thế này thôi à??? Ko ngờ GM đơn giản thế. Chắc chuyển sang GM mất @-)
     
  6. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: chỉ là bàn luận cơ bản thôi mà, chỉ mang tính hướng giải quyết chứ ko giúp gì nhiều, bản thân phải tự nỗ lực thôi

    bất kì cái gì mà liên quan đến lập trình thì các câu lệnh điều kiện luôn là câu lệnh phải xài nhiều nhất, không riêng gì vấn đề AI.

    tôi có gửi kèm 1 con BOT, tuy chưa hoàn thiện nhưng có lẽ sẽ đủ minh họa cho bài viết trên

    bấm F1 để thêm thông tin
    :@}
     

    Các file đính kèm:

    • BOT.zip
      Kích thước:
      1.1 MB
      Đọc:
      43
  7. Nguyen_Kain

    Nguyen_Kain Quậy hết mình Moderator

    Tham gia ngày:
    28/5/04
    Bài viết:
    1,299
    Hơ hơ , mỗi đoạn code thế thì làm được cái gì ? Ví dụ mà !!

    Bác Mozzilla nick là gì ? Mình nhờ bác thiết kế vài cái spite được ko (chỉ là hình ảnh thôi , ko phải là game đâu , coi như là thuê ko trả lương :wink: )

    Bác vodich có thể ví dụ thêm về AI của Topdown ko ? Cái này nó góc nhìn hơi điêu nên chỉnh AI của nó hơi khó !! :whew:
     
  8. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: trên GMC có nhiều lắm, lên đó tìm , "topdown AI"

    :@}
     
  9. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    to moliza tầm bậy , đoạn script đó chả làm được gì đâu .
    với rpgxp thì các cậu có thể copy trọn vào game .
    nhưng với GM thì đa số đều phải tự viết từ đầu tới cuối , những cái copy chỉ là nhwungx đoạn hiệu ứng nhỏ .
    muốn làm GM thì pahir luyện tập kinh lắm , luyện tập xong thì thấy dễ . khakha
     
  10. Mozzila†hunder

    Mozzila†hunder Dragon Quest

    Tham gia ngày:
    29/5/06
    Bài viết:
    1,295
    Nơi ở:
    Ha Noi, Vietnam
    Hic cái radar của tui làm đơn giản hơn của GM, mà còn copy được về xài nữa chứ .: Game Maker :. = Khoai vật.
    Đoạn mã đấy phải làm đc gì chứ. Có vẻ giống coltrol switch trong RMXP :D
     
  11. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: Amen, làm ơn đừng cãi lộn, đừng vì 1 2 chữ mà bắt bẻ người khác to 2 ông lun đấy :@}
     
  12. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Biết cách thì copy thì đc thôi,hiệu ứng nhỏ quái gì,real time lighting and shadow mà nhỏ.

    Uhm,gần gần như vậy,switch case khá phổ biến trong các ngôn ngữ mà.Chỉ có thằng Python hâm là if elif như đúng rồi.

    Với lại ai lại đem AI so sánh với radar bao giờ,radar trong GM script cũng có một mẩu thôi mà vì trò nào thì radar cũng gần như nhau,còn AI thì đương nhiên phải phức tạp rồi,mỗi lúc một kiểu. Cái script trên của vodich là ví dụ minh họa khi nó đang ở state run thì chuyển hình của nó thành run thôi,còn làm trò gì tiếp thì tùy game chớ.
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này