面试题目回顾12

面试题目回顾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;
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值