在游戏编程项目中,如何处理具有多个实例的多个项目?

In a game programming project, how do I handle multiple items with multiple instances?

假设我有一款包含多种武器的 2 人游戏。游戏开始时,玩家可以选择自己的武器装备给自己的角色。所以如果现在,我有以下代码来实现上述场景:

public class Weapon {
    private String name;
    private int attackPoints;
    private int effectivity = 100;

    public Weapon(String name, int attackPoints) {
        this.name = name;
        this.attackPoints = attackPoints;
    }
    // ...
}

public class Character {
    private String name;
    private Weapon weapon;

    public Character(String name, Weapon weapon) {
        this.name = name;
        this.weapon = weapon;
    }
    // ...
}

public class Game {
    Scanner scanner = new Scanner(System.in);
    public void createCharacter() {
        String namePlayer = "Knight";
        String nameOpponent = "Thief";

        //Weapon Menu
        System.out.println("Select weapon");
        System.out.println("1. Dagger - Attack: 10");
        System.out.println("2. Sword - Attack 20");

        Character player;
        Character opponent;
        int choice = scanner.nextInt();

        //Weapon assignment
        switch (choice) {
        case 1:
            player = new Character(name, new Weapon("Dagger", 10));
            break;
        case 2:
            player = new Character(name, new Weapon("Sword", 20));
            break;
        }
    }
}

改写问题

我担心的是,如果我必须添加额外的武器怎么办,比如说 "Ax with 15 damage",那么我必须修改武器菜单,同时在我的文件中添加一个额外的案例开关语句。有没有可能我只需要修改某种列表,它就会处理可供玩家选择的武器列表,同时使玩家和玩家的武器实例不同对手角色?

老问题

我担心的是,每次有新武器,我都要修改武器菜单,同时修改武器分配部分。有没有更好的方法来实现它?

您的角色 class 可以拥有这样的武器列表:

public class Character {
private String name;
private List<Weapon> weapons = new ArrayList<Weapon>();

 public Character(String name) { //keep this constructor. I know I have omitted weapons variable from this constructor.
    this.name = name;        
}
// down below you have getters and setters for name and weapons
}

然后当你初始化一个新角色时,这样做:

Character player1;
...

switch (choice) {
    case 1:
        Weapon w = new Weapon("Dagger", 10));
        player = new Character(name);
        player.getWeapons().add(w);
        break;

是的,你可以..

..将每个武器创建为对象并将其添加到数组(或列表等)中,因此您不必编写代码

System.out.println("Select weapon");
System.out.println("1. Dagger - Attack: 10");
System.out.println("2. Sword - Attack 20");

你可以去

    Weapon[] weapons = new Weapon[2];
    weapons[0] = new Weapon ("Dagger",10);
    weapons[1] = new Weapon ("Sword",20);
    for (int i = 0; i < weapons.length; i++) {
        System.out.println(i+1+". "weapons[i].getName+" - "+weapons[i].getAttackPoints);
    }
    int choice = scanner.nextInt();
    player = new Character(namePlayer, weapons[choice-1]);

只是为了注意

  • class 武器有名称和攻击点的吸气剂
  • 并且该数组以此处显示的索引 0 开头

您基本上需要一个 WeaponFactory,它将知道所有可用的 Weapon。该工厂还可以根据用户输入创建特定武器的新实例。这样,我想,你会得到你想要的一切

  • 所有武器都在一个地方创建,
  • 添加新的需要改单class。

这是一个简化的例子。

public static class WeaponFactory {
    public List<Weapon> availableWeapons() {
        return Arrays.asList(new Dagger(), new Rifle());
    }

    public Weapon create(int type) {
        return availableWeapons().get(type);
    }
}

public interface Weapon {
    public abstract double attack();
    public abstract String name();
}

public static abstract class WeaponAdapter implements Weapon {
    @Override public String toString() {  return name() + " - " + attack(); }
}

public static class Dagger extends WeaponAdapter {
    @Override public double attack() { return 10; }
    @Override public String name() { return "Dagger"; }
}

public static class Rifle extends WeaponAdapter {
    @Override public double attack() { return 80; }
    @Override public String name() { return "Rifle"; }
}

效率有点低,因为实际上并不需要创建 Weapon 的新实例以在 Menu 中显示它们,但我认为就此而言已经足够了例子。

为了缓解这种情况,您可以使用一些反射或使用枚举。你基本上需要的是一个函数,它会根据它的类型创建一个武器,所以它可能像

List<Class<? extends Weapon>> weapons = Arrays.asList(Dagger.class, Rifle.class);

public Weapon create(Class<Weapon> weaponType) {
    try {
        return weaponType.newInstance();
    } catch (InstantiationException | IllegalAccessException ex) {
        throw new RuntimeException("Not possible");
    }
}

同样,所有这些都是 WeaponFactory 的一部分,它是所有 Weapon 相关的一个地方。