前言
看到章末的练习,用了一天做了尝试,发现太浪费时间了,下次不做了。不过这次既然做了就放到博客上来好了(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() {