打印

这个有限状态机实现的牛【C++】

[复制链接]
838|14
手机看帖
扫描二维码
随时随地手机跟帖
沙发
keer_zu|  楼主 | 2022-10-11 16:32 | 只看该作者
再给你看一个使用这个状态机的demo

// basic hfsm sample

#include <iostream>
#include "fsm.hpp"

// custom states (gerunds) and actions (infinitives)

enum {
    walking = 'WALK',
    defending = 'DEFN',

    tick = 'tick',
};

struct ant_t {
    fsm::stack fsm;
    int health, distance, flow;

    ant_t() : health(0), distance(0), flow(1) {
        // define fsm transitions: on(state,trigger) -> do lambda
        fsm.on(walking, 'init') = [&]( const fsm::args &args ) {
            std::cout << "initializing" << std::endl;
        };
        fsm.on(walking, 'quit') = [&]( const fsm::args &args ) {
            std::cout << "exiting" << std::endl;
        };
        fsm.on(walking, 'push') = [&]( const fsm::args &args ) {
            std::cout << "pushing current task." << std::endl;
        };
        fsm.on(walking, 'back') = [&]( const fsm::args &args ) {
            std::cout << "back from another task. remaining distance: " << distance << std::endl;
        };
        fsm.on(walking, tick) = [&]( const fsm::args &args ) {
            std::cout << "\r" << "\\|/-"[ distance % 4 ] << " walking " << (flow > 0 ? "-->" : "<--") << " ";
            distance += flow;
            if( 1000 == distance ) {
                std::cout << "at food!" << std::endl;
                flow = -flow;
            }
            if( -1000 == distance ) {
                std::cout << "at home!" << std::endl;
                flow = -flow;
            }
        };
        fsm.on(defending, 'init') = [&]( const fsm::args &args ) {
            health = 1000;
            std::cout << "somebody is attacking me! he has " << health << " health points" << std::endl;
        };
        fsm.on(defending, tick) = [&]( const fsm::args &args ) {
            std::cout << "\r" << "\\|/-$"[ health % 4 ] << " health: (" << health << ")   ";
            --health;
            if( health < 0 ) {
                std::cout << std::endl;
                fsm.pop();
            }
        };

        // set initial fsm state
        fsm.set( walking );
    }
};

int main() {
    ant_t ant;
    for(int i = 0; i < 12000; ++i) {
        if( 0 == rand() % 10000 ) {
            ant.fsm.push(defending);
        }
        ant.fsm.command(tick);
    }
}

使用特权

评论回复
板凳
努力搬砖| | 2022-10-11 16:34 | 只看该作者
LOOK 一下

使用特权

评论回复
地板
chailiuqing| | 2022-10-11 16:36 | 只看该作者
111111

使用特权

评论回复
5
keer_zu|  楼主 | 2022-10-11 16:37 | 只看该作者
6
keer_zu|  楼主 | 2022-10-11 16:37 | 只看该作者
7
keer_zu|  楼主 | 2022-10-11 16:38 | 只看该作者
FSM is a lightweight finite-state machine class. Both Hierarchical FSM and simple FSM implementations are provided.

使用特权

评论回复
8
han0097| | 2022-10-11 16:50 | 只看该作者
不回复还看不了

使用特权

评论回复
评论
han0097 2022-10-19 12:07 回复TA
@keer_zu :哈哈,没问题 
keer_zu 2022-10-11 16:53 回复TA
哈哈,随手回复一下,也算咱的劳动成果吧 
9
xl071310| | 2022-10-11 17:06 | 只看该作者
Thanks

使用特权

评论回复
10
keer_zu|  楼主 | 2022-10-11 17:25 | 只看该作者
xl071310 发表于 2022-10-11 17:06
Thanks

真不错

使用特权

评论回复
11
kejian2000| | 2022-12-6 08:33 | 只看该作者
这个有限状态机实现的牛

使用特权

评论回复
评论
keer_zu 2022-12-6 08:57 回复TA
是的 
12
keer_zu|  楼主 | 2022-12-6 08:57 | 只看该作者
kejian2000 发表于 2022-12-6 08:33
这个有限状态机实现的牛

是的,首先不需要修改之前代码(开闭原则),其次,接口非常简单,很容易添加到自己的应用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1350

主题

12427

帖子

53

粉丝