游戏人工智能之状态驱动智能体(二)

游戏人工智能之状态驱动智能体(二)

原创文章,转载请注明原文地址。

学习了有限状态机的相关知识以后,我们运用有限状态机的思想设计一个状态驱动智能体。
假设有一个矿工,他具有四种状态:挖矿、存钱、喝酒、睡觉,四种状态的转换关系为:默认情况下矿工挖矿,当包裹满时去银行换钱,然后再去挖矿;当疲劳值为0时回家睡觉,睡觉会恢复疲劳值,疲劳值恢复后继续挖矿;当觉得口渴时去酒吧喝酒,觉得不渴了继续挖矿。
C#代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace SDIB
{
    class DigNugget
    {
        public int money;
        public int tired;
        public int health;

        public delegate void MinerEventHandler(Object listener,MinerEventArgs e);
        public event MinerEventHandler Miner;

        public class MinerEventArgs : EventArgs
        {
            public readonly int money;
            public readonly int tired;
            public readonly int health;

            public MinerEventArgs(int money, int tired, int health)
            {
                this.money = money;
                this.tired = tired;
                this.health = health;
            }
        }

        protected virtual void OnActive(MinerEventArgs e)
        {
            if (Miner != null)
            {
                Miner(this, e);
            }
        }

        public void Update()
        {

            while (true)
            {
                Console.WriteLine("挖矿中");
                Thread.Sleep(1000);
                tired++;
                health--;
                money++;
                MinerEventArgs mea = new MinerEventArgs(money, tired, health);
                OnActive(mea);
                if (tired >= 10)
                {
                    Console.WriteLine("累了,回家睡觉");
                    Thread.Sleep(1000);
                    //Miner += GoHome.Update;
                    GoHome.Update(this, mea);
                    continue;
                }
                if (health <= 0)
                {
                    Console.WriteLine("渴了,去酒吧喝酒");
                    Thread.Sleep(1000);
                    //Miner += GoBar.Update;
                    GoBar.Update(this, mea);
                    continue;
                }
                if (money >= 3)
                {
                    Console.WriteLine("包满了,去银行换钱");
                    Thread.Sleep(1000);
                    //Miner += GoBank.Update;
                    GoBank.Update(this, mea);
                    continue;
                }

            }

        }
    }

    class GoHome
    {
        public static void Update(Object listener, DigNugget.MinerEventArgs e)
        {
            DigNugget mine = (DigNugget)listener;
            Console.WriteLine("睡觉中");
            Thread.Sleep(mine.tired * 1000);
            mine.tired = 0;     
            Console.WriteLine("睡醒了,去挖矿");
            Thread.Sleep(1000);
        }
    }

    class GoBank
    {
        public static void Update(Object listener, DigNugget.MinerEventArgs e)
        {
            DigNugget mine = (DigNugget)listener;
            mine.money = 0;
            Console.WriteLine("存钱中");
            Thread.Sleep(1000);
            Console.WriteLine("继续去金矿干活");
            Thread.Sleep(1000);
        }
    }

    class GoBar
    {
        public static void Update(Object listener, DigNugget.MinerEventArgs e)
        {
            DigNugget mine = (DigNugget)listener;
            mine.health = 10;
            Console.WriteLine("喝水中");
            Thread.Sleep(1000);
            Console.WriteLine("不渴了,去金矿");
            Thread.Sleep(1000);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            DigNugget miner = new DigNugget();
            miner.money = 0;
            miner.tired = 0;
            miner.health = 10;
            miner.Update();
        }
    }
}

代码运行结果如下:
程序运行结果


在《游戏人工智能编程案例精粹》一书中,作者提供了类似状态机的C++实现,如果大家感兴趣可以在www.jblearning.com/catalog/9781556220784下载相关源代码进行学习。



如果大家看完觉得有帮助,请给我点个赞,我希望能和大家一起学习一起进步。>_<

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值