java – 如何编写一个可以轻松维护的概率算法?
发布时间:2020-05-24 10:36:25 所属栏目:Java 来源:互联网
导读:假设我想创造一个游戏.在游戏开始时,玩家将挑选一个怪物. 公平地挑选怪物很容易. // get all monsters with equal chancepublic Monster getMonsterFair(){ Monster[] monsters = {new GoldMonster(), new SilverMonster(), new BronzeMonster()};
|
假设我想创造一个游戏.在游戏开始时,玩家将挑选一个怪物. 公平地挑选怪物很容易. // get all monsters with equal chance
public Monster getMonsterFair(){
Monster[] monsters = {new GoldMonster(),new SilverMonster(),new BronzeMonster()};
int winIndex = random.nextInt(monsters.length);
return monsters[winIndex];
}
并不公平地挑选怪物. // get monsters with unequal chance
public Monster getMonsterUnFair(){
double r = Math.random();
// about 10% to win the gold one
if (r < 0.1){
return new GoldMonster();
}
// about 30% to winthe silver one
else if ( r < 0.1 + 0.2){
return new SilverMonster();
}
// about 70% to win the bronze one
else {
return new BronzeMonster();
}
}
问题是,当我在游戏中添加一个新怪物时,我必须编辑if-else. // get monsters with unequal change & special monster
public Monster getMonsterSpecial(){
double r = Math.random();
// about 10% to win the gold one
if (r < 0.1){
return new GoldMonster();
}
// about 30% to win the silver one
else if ( r < 0.1 + 0.2){
return new SilverMonster();
}
// about 50% to win the special one
else if ( r < 0.1 + 0.2 + 0.2){
return new SpecialMonster();
}
// about 50% to win the bronze one
else {
return new BronzeMonster();
}
}
如何重构这种概率算法,以便在添加新怪物并调整获胜怪物的机会时可以轻松维护代码? 解决方法基本上是@Egor Skriptunoff所说的.这应该很容易扩展.你可以使用Class< Monster>的集合.如果你不想使用枚举.enum Monster {
GOLD(1),SILVER(3),BRONZE(6) // pseudo probabilities
private int weight;
// constructor etc..
}
public Monster getMonsterSpecial() {
List<Monster> monsters = new ArrayList<>();
for(Monster monsterType : Monster.values()) {
monsters.addAll(Collections.nCopies(monsterType.getWeight(),monsterType));
}
int winIndex = random.nextInt(monsters.length);
return monsters.get(winIndex);
}
你也许可以使枚举怪物复数,并让它指向一个类<?延伸怪物>如果你还想实例化怪物类.我只是想让这个例子更加清晰. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
