Redian新闻
>
坛子里某家知名p公司的知名成就系统设计
avatar
坛子里某家知名p公司的知名成就系统设计# JobHunting - 待字闺中
x*0
1
这家知名p公司有道知名设计题,名曰: 成就系统设计。搜遍了地里再加上自己的不断
脑补,终于得出了如下完整的题目:(脑补偏了,概不负责啊)
(1) Player 可以有动物,金币, level(就理解成练到几级了吧)
(2) 当 player 达到了某种 requirement 或者某几种 requirements,就会得到某种
achievement,
因为 player 达到了这种 achievement,系统当然要 reward 这个 player 一些东东啦
!(动物,
金币, level, 随便来。 然而并没有妹子。 Sad! )
以上两点就是我认为的这题这几个 objects( player, requirement, achievement,
reward) 之间的
关系。
再补充一点关于 requirement, 这里的 requirement 可以是:
a. Level>threshold ,比如你作为一个 player 终于打怪升级到了 20 级。
b. 或者 requirement 也可以是你终于收集齐了 7 个 rejects,
c. 或者 requirement 也可以是你的金币数量大于了某个 threshold
设计的关键:
(1) 新增加一种 achievement, 只需输入新的 input 就行了,其它代码不能修改
(2) 添加新的属性,比如在 player 中你又可以有 girlfriend 或者 boyfriend 或者
拉拉或者 gay
(3) 注意不要重复发送 reward
请问大家这个怎么解呢?
不知道有没有同学愿意一起讨论这道题的,我的qq:271296325
avatar
f*t
2
不难吧
avatar
x*0
3
嗯嗯,哈哈。对我来说有点难啊。没做个系统设计的题目。
可以给些思路吗?然后我可以顺着思路往下走。

【在 f*******t 的大作中提到】
: 不难吧
avatar
l*s
4
抛个砖
(1) 新增加一种 achievement, 只需输入新的 input 就行了,其它代码不能修改
--这个似乎一个Interface可以做到,这个Interface要提前考虑到尽可能多的情况。
(2) 添加新的属性,比如在 player 中你又可以有 girlfriend 或者 boyfriend 或者
拉拉或者 gay
--基本上是维护一个Key/Value list, 但新加属性的数据类型可能会很复杂,也就
是Value的类型很多样,如果复杂到加入一个全新的Class作为数据类型,又要求不修改
代码则要考虑使用Dependency Injection Container。
另一个方式是利用Extension的模式,也就是在已有类上进行附加方法,属性等
,不过不够优雅。
(3) 注意不要重复发送 reward
--这个要先定义“重复”。一般的打怪升级就是同时赚钱和经验。打过游戏的经验
,可以考虑建一个Task类,这个把Achievement,Requirement,Rewards都可以包括进
来了,Player可以Register it或者Add to his Task List,相当于签了个合同,任务
完成就给定好的Rewards。可能我想得简单了,没觉得哪里有重复的可能。
avatar
x*0
5
谢谢,谢谢啦。容我好好想想,消化消化!

况。

【在 l******s 的大作中提到】
: 抛个砖
: (1) 新增加一种 achievement, 只需输入新的 input 就行了,其它代码不能修改
: --这个似乎一个Interface可以做到,这个Interface要提前考虑到尽可能多的情况。
: (2) 添加新的属性,比如在 player 中你又可以有 girlfriend 或者 boyfriend 或者
: 拉拉或者 gay
: --基本上是维护一个Key/Value list, 但新加属性的数据类型可能会很复杂,也就
: 是Value的类型很多样,如果复杂到加入一个全新的Class作为数据类型,又要求不修改
: 代码则要考虑使用Dependency Injection Container。
: 另一个方式是利用Extension的模式,也就是在已有类上进行附加方法,属性等
: ,不过不够优雅。

avatar
f*t
6
随便说一下最基本的设计思路。
问题的核心点在于如何判断达成成就的条件,我们可以做一个event系统,游戏进行中
数据改变会publish各种event,比如升到10级,会有一个升级event:
class LevelUpEvent extends Event {
int oldLevel, newLevel;
}
achievement作为subscriber等待并处理相应的event。例子:
Level20Achievement extends EventListener {
void Handle(Event e) {
event = (LevelUpEvent)e;
if (event.newLevel == 20) {
// Reward player
}
}
}
注册相应event是:
Events.registerListener(LevelUpEvent.class, Level20Achievement.class);
所以定义新achievement只是加个class,并注册成listener。
加属性其实就是在player类里加field,并在引擎里实现相应的publisher:
class Player {
//... (other fields)
int level;
void ChangeLevel(int delta) {
int oldHP = this.HP;
this.HP += delta;
Events.publish(new HPChangedEvent(oldHP, HP));
}
}
avatar
x*0
7
谢谢,谢谢了,对数据进行监听太好了。我开始想的是对player进行监听,可是player
好多啊。

【在 f*******t 的大作中提到】
: 随便说一下最基本的设计思路。
: 问题的核心点在于如何判断达成成就的条件,我们可以做一个event系统,游戏进行中
: 数据改变会publish各种event,比如升到10级,会有一个升级event:
: class LevelUpEvent extends Event {
: int oldLevel, newLevel;
: }
: achievement作为subscriber等待并处理相应的event。例子:
: Level20Achievement extends EventListener {
: void Handle(Event e) {
: event = (LevelUpEvent)e;

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。