假设我想创造一个游戏.在游戏开始时,玩家将挑选一个怪物.
公平地挑选怪物很容易.
- // 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.
或者我将赢得GoldMonster的机会改为0.2,我必须将所有0.1改为0.2
这很难看,也不容易维护.
- // 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);
- }
你也许可以使枚举怪物复数,并让它指向一个类<?延伸怪物>如果你还想实例化怪物类.我只是想让这个例子更加清晰.