gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:33:14 25 4
gpt4 key购买 nike

假设我有一款包含多种武器的 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;
}
}
}

改写问题

我担心的是,如果我必须添加额外的武器怎么办,例如说“具有 15 伤害的斧头”,那么我必须修改武器菜单,同时在我的 switch 中添加一个额外的 case陈述。有没有可能我只需要修改某种列表,它就会处理可供玩家选择的武器列表,同时使玩家和玩家的武器实例不同对手角色?

老问题

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

最佳答案

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

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

这是一个简化的例子。

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 中显示它们,但我认为这已经足够了为了这个例子。

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

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 的一个地方。

关于java - 在游戏编程项目中,如何处理具有多个实例的多个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com