在游戏编程项目中,如何处理具有多个实例的多个项目?
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
相关的一个地方。
假设我有一款包含多种武器的 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
相关的一个地方。