x*****0 发帖数: 452 | 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 |
f*******t 发帖数: 7549 | |
x*****0 发帖数: 452 | 3 嗯嗯,哈哈。对我来说有点难啊。没做个系统设计的题目。
可以给些思路吗?然后我可以顺着思路往下走。
【在 f*******t 的大作中提到】 : 不难吧
|
l******s 发帖数: 3045 | 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。可能我想得简单了,没觉得哪里有重复的可能。 |
x*****0 发帖数: 452 | 5 谢谢,谢谢啦。容我好好想想,消化消化!
况。
【在 l******s 的大作中提到】 : 抛个砖 : (1) 新增加一种 achievement, 只需输入新的 input 就行了,其它代码不能修改 : --这个似乎一个Interface可以做到,这个Interface要提前考虑到尽可能多的情况。 : (2) 添加新的属性,比如在 player 中你又可以有 girlfriend 或者 boyfriend 或者 : 拉拉或者 gay : --基本上是维护一个Key/Value list, 但新加属性的数据类型可能会很复杂,也就 : 是Value的类型很多样,如果复杂到加入一个全新的Class作为数据类型,又要求不修改 : 代码则要考虑使用Dependency Injection Container。 : 另一个方式是利用Extension的模式,也就是在已有类上进行附加方法,属性等 : ,不过不够优雅。
|
f*******t 发帖数: 7549 | 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));
}
} |
x*****0 发帖数: 452 | 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;
|