面试经验|拼多多二面|面试题|设计三国杀
4963
2021.10.15
2021.10.22
发布于 未知归属地

更新:感谢信已经收到。

昨天晚上九点半,二面PDD,给我面傻了,这辈子第一次见到这种面试,可以说十分残酷,凉凉...

“玩过卡牌游戏吗”?
“玩过三国杀”
“那我们今天晚上不聊别的,只聊三国杀”

【1】假设现在有一个开发三国杀游戏的需求,先给一个没有玩过三国杀的开发同学、测试同学,简单描述一遍三国杀。

【2】设计三国杀的算法,如何选数据结构。用三个算法设计一下三国杀(设计三个类)。

【3】A向B发动技能怎么设计?A“杀”B,B需要出闪或者掉血,如何设计

【4】假设现在需要升级为一个可以添加机器人的版本,如何设计。

【5】这三个算法选一个,10分钟之内代码写一下。

这个问题之前确实没想过,每个问题一分钟思考时间,答得一塌糊涂。今天想了一下午,对几个问题做一下个人理解,欢迎各位大佬进行讨论

三国杀的客户端主要就是做一些I/O、渲染等处理,玩家之间游戏必然经过服务器。
1、服务器上下文。服务器上下文需要大量数组成员,保存房间、玩家、大喇叭聊天等,主要的算法就是和这些数组成员进行交互,如“玩家上线”、“创建房间/准备游戏状态”等
2、玩家上下文。保存当前玩家的各种信息,如好友、武将仓库、聊天信息、当前文件的状态等。(可以看作是一个对应客户端的clientObject)
个人理解:玩家的游戏状态大致看作:大厅(未游戏)-房间内当未开启游戏(准备游戏)-房间内并游戏(正在游戏)。如果玩家逃跑了那么看作非正在游戏状态
3、游戏上下文。当前房间、当前房间的玩家、牌堆信息、current指针等。主要算法:洗牌、发牌等。
(当时让写算法,我就把 LeetCode打乱数组shuffle() 那个算法写了一遍)

对于掉血的理解:
把技能也看作一张牌,发动技能也是打牌,统一看作Card。牌可以给自己和他人使用。玩家对应Gamer接口,其中定义了回调接口:减血(void HP_down(Gamer g , int num))、加血。
玩家A先玩家B使用某张卡牌,例如A会向服务器发送put Card123 to B,服务器将Card123(假设为红桃7的杀),然后调用B的get Card123 from A 。这个时候可能会触发一些观察者事件(例如孙策激昂摸一张牌),然后玩家B需要在指定时间内向服务器回复“闪”,如果没有闪,服务器调用回调接口将B对应武将的HP减少num(Gamer的引用维护在游戏上下文实例中)。技能牌也应该类似,玩家A将技能牌传递给服务器,服务器执行相应的行为。例如B的武将是赵云,put Card999 CardXXX to A ,拿杀当闪,然后发个语音...

对于机器人的理解:
机器人玩家由房主进行添加,维护在游戏上下文中。可以维护一个机器人线程池,如果玩家需要添加机器人,就拿出几个线程,然后执行预设计好的武将客户端程序,非本回合就监听读写事件,如果在本回合就执行预设的行为...

面试遇到这种开放题,真的蚌埠住了,希望能够大佬们对这道题的讨论QAQ

评论 (5)