2

我正在创建一个基于文本的游戏,但我遇到了一些问题。这就是我目前所拥有的。到目前为止,我有一个战斗类,以及两个不同武器的两个类。我正在尝试为武器本身分配生命值。但我最大的问题是在战斗课上。我正在尝试创建它,以便在随机时间随机掉落武器以及随机武器。到目前为止,在战斗课上我有这个:

public class Combat {
    final int chanceOfDrop = 3;
    static Weapons[] wepArray = {new M4(), new M16()}
    static boolean[] hasWeapon = {false, true};

    public static int  ranNumberGen(int chanceOfDrop) {
        return (int) (Math.random()*1); 
    }

    private void enemyDead() {
        boolean canDrop = false;
        if(ranNumberGen(chanceOfDrop)==0){
            canDrop = true;

        }

        if(canDrop == true){
            givePlayerWeapon(Weapon[Combat.ranNumberGen(Weapons.length)]);
        }

        private static void givePlayerWeapon(int w) {
            hasWeapon[w] = true;

            for w <(Weapons.length-1) {
                if has weapon[w] {
                    System.out.println(wepArray[w].getWeaponName);
                }
                }
        }
    }

    }
}

我在创建新的 M4() 时遇到问题,新的 M16() 显示类型不匹配:无法将 M4 形式转换为武器。我确实有一个名为 Weapons 的课程,这可能是问题吗?

这是我的 M4 类,M4 和 M16 类是相同的

public abstract class M4 {
  private Integer weaponDamage = 5;
  private Integer weaponAmmo = 25;
  private String weaponName = "M4";

  public M4(String name, int ammo, int damage) {
    name = weaponName;
    ammo = weaponAmmo;
    damage = weaponDamage;
  }

  public String getWeaponName() {
    return weaponName;
  }

  public Integer getAmmo() {
    return weaponAmmo;
  }

  public Integer getDamage() {
    return weaponDamage;
  }
}

我不认为我在这里有任何问题。不过,也许我的问题就在于此。虽然,我有一个武器课,但什么都没有。我需要那个吗?

4

3 回答 3

1

乍一看要解决的一些问题:

  • 创建一个通用的 Weapon 类,它定义了适用于每种武器的一些属性,例如名称、伤害、弹药、范围乘数等……然后为 Weapon 创建子类,例如 M4 和 M16,它们指定属性并最终添加特定于武器特性。
  • 将括号添加到此行:

    System.out.println(wepArray[w].getWeaponName); // Change to getWeaponName()
    
  • 从 M4 中删除abstract关键字。

  • 修复 ranNumberGen 方法,因为它现在总是返回 0。Math.random()返回 [0,1[ 范围内的浮点数。这意味着将其转换为 int 将始终导致 0。将其乘以n以在 [0, n [范围内获得随机 int 。你可能想要这个:

    public static int ranNumberGen(int max) {
        return (int) (Math.random() * max); 
    }
    
  • 更改此行:

    givePlayerWeapon(Weapon[Combat.ranNumberGen(Weapons.length)]);
    

    至:

    givePlayerWeapon(wepArray[Combat.ranNumberGen(wepArray.length)]);
    
  • -loop的语法for如下:

    for (variable-initialization; condition; increment)
    

    所以在你的情况下,你想要:

    for (int i = 0; i < hasWeapon.length; ++i)
    {
        if (hasWeapon[i]) System.out.println(wepArray[i].getWeaponName());
    }
    
于 2012-12-23T00:50:00.163 回答
1

在为时已晚之前,您可能需要重新考虑对游戏对象使用继承式层次结构的决定。

在实践中,我发现组件实体模型和/或原型模型更有效。您可以查看我的旧 Java roguelike 游戏 Tyrant 中的代码以获得灵感:

  • 武器定义:mikera/tyrant/Weapon.java(Github 现已关闭,因此无法找到确切的链接,但对 Google 来说应该很容易)

这个想法是您通过在类似地图的游戏对象中设置属性/组合组件来制作对象,而不是使用静态继承。

当您想在此模型中创建随机武器时,您只需获取所有可能武器原型的列表,然后随机克隆其中一个以制作新武器。

于 2012-12-23T01:10:30.820 回答
0

“公共抽象类 M4”中抽象的意思是你不能用这个类创建一个新对象。因此,您可以将武器的所有公共字段放在武器类中,并使 m4 和 m16 扩展武器,您的代码将编译。

于 2012-12-23T00:48:23.273 回答