STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    Trí Tuệ Nhân Tạo trong Games - Phần 1: Thiết Kế AI với FSM

    Khái niệm, vai trò của trí tuệ nhân tạo trong games và hiện thực một AI đơn giản được thiết kế với FSM sử dụng Cocos2d-x.
    23/01/2015
    28/09/2020
    3 phút đọc
    Trí Tuệ Nhân Tạo trong Games - Phần 1: Thiết Kế AI với FSM

    Trí tuệ nhân tạo là gì?

    Các tổ chức sống như động vật, con người đều có trí tuệ giúp trong việc đưa ra những quyết định. Máy tính chỉ là thiết bị điện tử có thể xử lý dữ liệu, phép toán logic ở tốc độ cao. Trí tuệ nhân tạo (AI) là đề tài chính của việc tạo ra máy tính có thể suy nghĩ và quyết định như tổ chức sống, thực thi những phép toán chuyên biệt.

    FSM

    Là từ viết tắt của Finite State Machine hay có thể hiểu là 1 đối tượng dùng để chuyển trạng thái. Nó là những mô hình đơn giản nhất và thông dụng nhất trong việc tạo AI, bao gồm 1 số trạng thái có hạn và trạng thái khởi tạo, sau đó nó sẽ sử dụng những sự kiện để chuyển trạng thái này sang trạng thái khác, 1 đối tượng AI chỉ có 1 trạng thái nhất định tại 1 thời điểm.

    Thành phần cơ bản

    FSM có 4 thành phần cơ bản:

    1. Trạng thái: tập hợp các trạng thái của đối tượng.
    2. Chuyển trạng thái: định nghĩa mối quan hệ giữa các trạng thái khác nhau.
    3. Quy luật: được dùng để khởi đầu 1 sự kiện chuyển trạng thái.
    4. Sự kiện: thành phần dùng để kiểm tra quy luật.

    Ví dụ

    Dưới đây là 1 FSM đơn giản về 1 con Monkey có 3 trạng thái là: stop, walk, turn.

    #ifndef __Monkey_h__
    #define __Monkey_h__  
      
    #include <time.h>  
      
    #include "cocos2d.h"  
      
    USING_NS_CC;  
      
      
    #define MAX_STOP_TIME  10  
    #define MAX_WALK_TIME  20  
      
    #define MAX_WALK_DIST  100  
      
    enum MonkeyState {  
        stSTOP,  
        stWALK,  
        stTURN  
    };  
        
    class Monkey  : public Node {  
    public:  
        Monkey()  {  
            log("Monkey()");  
        }  
      
        CREATE_FUNC(Monkey);  
      
        virtual bool init() {  
            _curPos = 0;  
            _step = 1;  
      
            changeState(stSTOP);  
      
            this->scheduleUpdate();  
      
            return true;  
        }  
      
        void changeState(MonkeyState newState) {  
            _curState = newState;  
            _curTime = time(0);          
        }  
      
        void stop() {  
            cocos2d::log("stop()");  
        }  
      
      
        void walk() {  
            _curPos += _step;  
            cocos2d::log("walk(): pos=%d", _curPos);  
        }  
      
      
        void turn() {  
            _step *= -1;  
            cocos2d::log("turn(): step=%d", _step);          
        }  
      
      
        void update(float dt) {  
            switch (_curState) {  
            case stSTOP:  
                if (isStopTimeout()) {  
                    changeState(stWALK);  
                    walk();  
                }  
                break;  
      
            case stWALK:  
                walk();  
      
                if (isWalkOutBorder()) {  
                    changeState(stTURN);  
                    turn();  
                } else if (isWalkTimeout()) {  
                    changeState(stSTOP);  
                    stop();  
                }  
                break;  
      
            case stTURN:  
                changeState(stWALK);  
                walk();  
                break;  
            }  
        }  
      
    private:  
        MonkeyState _curState;  
      
        time_t _curTime;  
      
        int    _curPos;  
        int    _step;  
      
    public:  
        bool isStopTimeout() {  
            return (time(0) - _curTime > MAX_STOP_TIME);  
        }  
      
        bool isWalkTimeout() {  
            return (time(0) - _curTime > MAX_WALK_TIME);  
        }  
       
        bool isWalkOutBorder() {  
            return (_curPos > MAX_WALK_DIST || _curPos < -MAX_WALK_DIST);  
        }  
    };  
      
    #endif // __Monkey_h__
    
    • Dòng 16-20: khởi tạo 1 enum là các trạng thái của con Monkey.
    • Dòng 30-39: khởi tạo các thuộc tính của Monkey, trạng thái đầu tiên là stop, và sau đó chạy hàm update() của Monkey.
    • Dòng 41-44: hàm có chức năng thay đổi trạng thái của Monkey.
    • Dòng 46-60: hàm trạng thái của Monkey gồm stop, walk, turn.
    • Dòng 63-89: hàm update của Monkey, ứng với giá trị của _curState sẽ có 1 trạng thái nhất định của Monkey. Chú ý kỹ các điều kiện chuyển trạng thái trong hàm update này.
    • Dòng 92-97: khai báo các thuộc tính cần có.
    • Dòng 100-110: gồm các hàm điều kiện, hàm update sẽ kiểm tra điều kiện ở các hàm này, nếu phù hợp sẽ chuyển trạng thái cho Monkey.

    Với việc hoàn tất công việc thiết kế AI ở trên thì công việc hoàn thành rất tốt nhưng nếu phát triển hơn cần thêm các trạng thái bổ sung. Với thiết kế ở trên, nếu có N state cho AI thì thời gian xử lý trung bình sẽ là N/2.

    Tham khảo

    • https://www.cocos2d-x.org
    • https://www.en.wikipedia.org

    Bài chung series

    0
    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích.. Tìm hiểu thêm.

    Đề xuất

    Trí Tuệ Nhân Tạo Trong Games - Phần 2: Thiết Kế AI Với FSM
    Hướng dẫn thiết kế AI với FSM sử dụng framework Cocos2d-x.
    SmartHome - Tổng Thể hay Rời Rạc
    Các thiết kế dựa vào tổng thể (1 giải pháp đóng gói) hay rời rạc từng ...

    Khám phá

    Hiện Thực Game Zero Với Unity - Phần 1 - Nhận Sự Kiện Button
    Hướng Dẫn Hiện Thực Game Zero Với Unity. Thiết lập môi trường phát triển ...
    Hiện Thực Game Zero Với Unity - Phần 4 - Scene Và Popup
    Hướng Dẫn Hiện Thực Game Zero Với Unity. Thiết kế hệ thống scene và ...
    Phát Triển Game Funny Halloween Pumpkins với Cocos2d-x - Phần 1
    Hướng dẫn làm game cụ thể bằng Cocos2d-x với code mẫu và game mẫu.
    Thiết Kế Giao Diện Người Dùng trên Unity
    Giới thiệu các thành phần thiết kế UI và sử dụng các công cụ hỗ trợ ...
    Thành Phần Hoá Các Đối Tượng Trong Game Với Cocos2d-x
    Hướng dẫn thành phần hoá các đối tượng trong game với Cocos2d-x
    UI - Phần 2: Thiết Kế UI Trong Cocos2d-x 3.x.x
    Tìm hiểu về một số đối tượng dùng để thiết kế UI trong Cocos2d-x.
    Cách Thiết Kế Bản Cắt Móc Khóa Mica Hoàn Chỉnh
    Bài viết hướng dẫn bạn cách thức tạo ra 1 bản thiết kế chuẩn gửi cho nhà ...
    30/06/2020
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020