《游戏AI编程案例精粹(修订版)》第二章FSM章末练习

前言

看到章末的练习,用了一天做了尝试,发现太浪费时间了,下次不做了。不过这次既然做了就放到博客上来好了(ps:浪费了更多时间)。题目如下:

作业


一、准备阶段

前置工具和源码

  • 如果你没有找到这本书的源码,那么请到这里自取。
  • 笔者用的IDE是VS2017,操作系统是WIN10。
    – 所以这份源码需要更新版本。。不要指望VS的帮助有效,你需要自己新建一个工程然后拖文件,配路径。
    – 在看此文前,需要保证Buckland_Chapter2-State Machines\WestWorldWithMessaging的工程可以顺利运行。(会有一些坑,,主要是原项目用的语法太老了)
  • 成功的话,运行大概是下面这个样子的
    成功样例

设计思路

  • 因为这只苍蝇有台词,但我英语不太好,就设定成一只在学中文的苍蝇。
  • 打苍蝇的思路:
    – 苍蝇有一个位置值。
    – Bob打的时候消耗一点体力,猜一个值,猜中了就打死了。
    – 苍蝇打死就没了,以后就没交互了。

状态图

  • 大概像下面这样。当然可以优化,但我做到这样差不多了。
    状态图

二、设计步骤

1.改一些常量

// EntityName.h
enum
{
   
	ent_Miner_Bob,

	ent_Elsa,
	// 这只苍蝇叫Amy,我取的
	ent_Amy
};

inline std::string GetNameOfEntity(int n)
{
   
	switch (n)
	{
   
	case ent_Miner_Bob:

		return "Miner Bob";

	case ent_Elsa:

		return "Elsa";

	case ent_Amy:

		return "Amy";

	default:

		return "UNKNOWN!";
	}
}

enum message_type
{
   
	Msg_HiHoneyImHome,
	Msg_StewReady,
	Msg_NewGuest,
	Msg_FlyHere,
	Msg_Attack
};

//MessageTypes.h
inline std::string MsgToStr(int msg)
{
   
	switch (msg)
	{
   
	case 1:

		return "HiHoneyImHome";

	case 2:

		return "StewReady";
	
	case 3:
		//Bob对酒馆里的各位说他来了
		return "NewGuest";

	case 4:
		//用来通知Bob有一只苍蝇
		return "FlyHere";

	case 5:
		//Bob用来通知苍蝇被攻击了
		return "Attack";

	default:

		return "Not recognized!";
	}
}

2.写头文件

基本上在Bob夫妻俩的实体类和状态的基础上改一改。

// 苍蝇实体类的头文件
class SaloonsFly : public BaseGameEntity {
   
private:
	//an instance of the state machine class
	StateMachine<SaloonsFly>* m_pStateMachine;

	// 苍蝇的位置值,它本身总在酒馆,就不额外设置地点变量了
	int aDodgeValue;
	
	// 记录当前的新客人
	int aGuest;

public:
	SaloonsFly(int id) :BaseGameEntity(id),
		aDodgeValue(0)
	{
   
		//set up the state machine
		m_pStateMachine = new StateMachine<SaloonsFly>(this);

		m_pStateMachine->SetCurrentState(PracticeChinese::Instance());

		m_pStateMachine->SetGlobalState(FlysGlobalState::Instance());
	}

	~SaloonsFly() {
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值