【问题标题】:Creating weapon classes and a Combat Class创建武器类和战斗类
【发布时间】:2012-12-10 01:43:15
【问题描述】:

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

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;
  }
}

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

【问题讨论】:

  • 这里有很多问题。为什么M4 是抽象的?为什么不扩展或实现Weapon?您似乎可以互换使用WeaponWeapons - 它是什么?当您的意思是 wepArray 时,您似乎也使用了 Weapons
  • 我同意@Matt。此代码甚至似乎不可编译。
  • 我会创建一个名为 Weapon 的接口,然后让每个特定的类都实现 Weapon 类。这将允许每个人都有一种方法来获取和设置随机值。特别是因为您说这些课程几乎相同。这是创建界面的绝佳机会。
  • 在开始编写 Java 之前,您需要先了解一下。这不是 Visual Basic。 codeproject.com/Articles/22769/… 花点时间阅读全文。
  • 人们是对的,但 +1 纯粹是出于创建文字游戏的意图:)

标签: java arrays class random


【解决方案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)]);
    
  • for-loop 的语法如下:

    for (variable-initialization; condition; increment)
    

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

    for (int i = 0; i < hasWeapon.length; ++i)
    {
        if (hasWeapon[i]) System.out.println(wepArray[i].getWeaponName());
    }
    

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-20
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 2015-09-27
        • 2011-09-08
        相关资源
        最近更新 更多