>VoDich<
Legend of Zelda
{@:
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ụ:
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
:@}
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
:@}

