面试题目回顾12
面试题目
游戏背景:
古代,有一个英雄,生活在布满农田、洞穴的世界中,他为了生存不断的采集、打怪。
世界元素:
三种点:家(唯一)、农田(若干)、洞穴(若干),数据由pointList定义、一个角色(初始位置在家);
角色属性: HP(生命:最大值和初始值为100)、Exp(初始值:0,升级需要100);
游戏逻辑(代码实现):
1、将pointList中的数据与角色的距离排序;
2、根据pointList创建地图;
3、点击家、角色移动到家,HP=100;
点击洞穴、角色移动到洞穴,HP-20,Exp+10,洞穴消失;
游戏判定: 角色升级胜利,HP不足则失败。
请用自己熟悉的语言(C++、C#,或其他语言皆可),需要有完整的类定义、函数定义、变量定义、注释来实现完整的游戏逻辑,主要考察逻辑,代码习惯及设计模式;模拟API,仅供参考:
添加点: Node::addChild(Node* node)
删除点: Node::removeChild(Node* node)
点击事件: Node::OnClick = OnClickFunc(Node* node)
// 事件用法如: TheNode.OnClick = OnClickFunc;
角色移动:bool Player::move(Node* node)
移动完成事件: Player::moveEnd = MoveEndFunc(Node* node);
参考代码:
enum PointType
{
PointType_Home,
PointType_Hole,
PointType_Farm,
};
struct PointInfo
{
int id;
PointType pointType;
Vector2D position;
};
var std::vector<PointInfo> pointList;
参考答案
不过要求比较多 设计模式和可扩展性 就体现不了了
1.写一个排序算法,这个很多 快速排序之类写一个
2.直接使用循环遍历pointList中的点,然后根据地图类型,位置,等属性进行生成。
3.
enum PointType
{
Home,
Hole,
Farm,
}
struct PointInfo
{
int id;
PointType pointType;
vector2D position;
};
public class PosNode : Node
{
int id;
PointType pointType;
}
public class Player
{
int maxHp=100;//初始值
int maxExp=100;
int hp=100;
int exp=0;
public Delegate MoveEnd;
public void Move(PosNode* node)
{
//移动
if(moveEnd)
{
MoveEnd(node);
}
}
public void AddHP(int _hp)
{
hp=math.clamp(hp+_hp,0,maxHp);
if(hp<=0)
{
//失败
}
}
public void AddExp(int _exp)
{
exp+=_exp;
if(exp>maxExp)
{
//升级
}
}
}
public class GameRoot
{
//c++中std::vector<>就是C#中的List<>
var std::vector<PointInfo> pointList;
Player player;
void Start()
{
//开始创建地图
foreach(var item in pointList)
{
Node node=new Node();
node->setPosition(item.position);
node->setPointTye(item.pointType);
node->setID(item.id);
Node::addChild(node);
node::OnClick=OnClickFunc;
}
}
//点击移动事件
void OnClickFunc(PosNode* posNode)
{
player::Move(posNode);
player::MoveEnd=MoveEndFunc;
}
//移动完成事件
void MoveEndFunc(PosNode* posNode)
{
switch(posNode.pointType)
{
case Home:
{
player::AddHP(100);
break;
}
case Hole:
{
player::AddHP(-20);
player::AddExp(10);
destroy(posNode);
break;
}
case Farm:
{
player::AddHP(-10);
player::AddExp(5);
destroy(posNode);
break;
}
}
}
}