游戏人工智能之状态驱动智能体(二)
原创文章,转载请注明原文地址。
学习了有限状态机的相关知识以后,我们运用有限状态机的思想设计一个状态驱动智能体。
假设有一个矿工,他具有四种状态:挖矿、存钱、喝酒、睡觉,四种状态的转换关系为:默认情况下矿工挖矿,当包裹满时去银行换钱,然后再去挖矿;当疲劳值为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下载相关源代码进行学习。
如果大家看完觉得有帮助,请给我点个赞,我希望能和大家一起学习一起进步。>_<