2

私はテキストベースのゲームを作成していますが、いくつかの問題があります。これは私がこれまでに持っているものです。これまでのところ、戦闘クラスと、2つの異なる武器用の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を武器に変換できません。私は武器という名前のクラスを持っていますが、それが問題になる可能性がありますか?

そしてこれが私の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

一目で修正するいくつかのこと:

  • 名前、ダメージ、弾薬、スコープ乗数など、各武器に適用されるいくつかのプロパティを定義する汎用の武器クラスを作成します。次に、プロパティを指定し、最終的に武器固有を追加する、M4やM16などの武器のサブクラスを作成します。プロパティ。
  • この行に角かっこを追加します。

    System.out.println(wepArray[w].getWeaponName); // Change to getWeaponName()
    
  • abstractM4からキーワードを削除します。

  • ranNumberGenメソッドは、現在常に0を返すため、修正してください。Math.random()[0,1[の範囲のfloatを返します。これは、それを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 ローグライク ゲーム Tyrant のコードを参照してください。

  • 武器の定義: mikera/tyrant/Weapon.java (Github は現在ダウンしているため、正確なリンクを見つけることはできませんが、Google で簡単に検索できるはずです)

アイデアは、静的継承を使用するのではなく、Map のようなゲーム オブジェクトでプロパティを設定したり、コンポーネントを構成したりすることによって、オブジェクトを作成することです。

このモデルでランダムな武器を作成したい場合、考えられるすべての武器プロトタイプのリストを取得し、そのうちの 1 つをランダムに複製して新しい武器を作成できます。

于 2012-12-23T01:10:30.820 に答える
0

「パブリック抽象クラスM4」の抽象の意味は、このクラスで新しいオブジェクトを作成できないということです。したがって、武器のすべてのコモンズフィールドを武器クラスに配置し、m4とm16で武器を拡張すると、コードがコンパイルされます。

于 2012-12-23T00:48:23.273 に答える