1

私はファイナルファンタジーのキャラクターの小さなゲームを作成しています。このゲームでは、「戦い」たい人の名前を入力します。各キャラクター(5人だけ)をサブクラスとして、Statsというスーパークラスの変数( static)およびgetter/setterが定義されています。

コードはすべて私が望むように機能しますが、すべてが1つの巨大なクラスに含まれるのは好きではありません。

主な方法はここにあります。

package com.George.revision;

import java.util.Random;

import com.George.characters.Cloud;
import com.George.characters.Squall;
import com.George.characters.Stats;
import com.George.characters.TheEnemy;
import com.George.characters.ThePlayer;
import com.George.characters.Tidus;
import com.George.characters.Yuna;
import com.George.characters.Zidane;
import com.George.input.GetInput;
import com.George.input.ListNames;



public class Main {


    public static void main(String[] args) {

        ListNames.listNames();


        Stats clo = new Cloud();
        Stats squ = new Squall();
        Stats zid = new Zidane();
        Stats tid = new Tidus();
        Stats yun = new Yuna();

        String versus = GetInput.getInput("\nWhich of these Characters would you like to go up against?");

        Stats ene1 = new TheEnemy();


        switch (versus) {
        case "Cloud":
            ene1.setName(Names.CLOUD);
            ene1.setHairColor(Stats.BLONDE);
            ene1.setWep(Weapons.BUSTER_SWORD);
            ene1.setSkill(clo.skill);
            ene1.setAp(clo.ap);
            ene1.setStr(clo.str);
            ene1.setMag(clo.mag);
            break;
        case "Squall":
            ene1.setName(Names.SQUALL);
            ene1.setHairColor(Stats.BLACK);
            ene1.setWep(Weapons.LIONHEART);
            ene1.setSkill(squ.skill);
            ene1.setAp(squ.ap);
            ene1.setStr(squ.str);
            ene1.setMag(squ.mag);
            break;
        case "Zidane":
            ene1.setName(Names.ZIDANE);
            ene1.setHairColor(Stats.LIGHTBROWN);
            ene1.setWep(Weapons.THIEF_DAGGER);
            ene1.setSkill(zid.skill);
            ene1.setAp(zid.ap);
            ene1.setStr(zid.str);
            ene1.setMag(zid.mag);
            break;
        case "Tidus":           
            ene1.setName(Names.TIDUS);
            ene1.setHairColor(Stats.BLONDE);
            ene1.setWep(Weapons.CALADBOLG);
            ene1.setSkill(tid.skill);
            ene1.setAp(tid.ap);
            ene1.setStr(tid.str);
            ene1.setMag(tid.mag);
            break;
        case "Yuna":
            ene1.setName(Names.YUNA);
            ene1.setHairColor(Stats.DARKBROWN);
            ene1.setWep(Weapons.NIRVANA);
            ene1.setSkill(yun.skill);
            ene1.setAp(yun.ap);
            ene1.setStr(yun.str);
            ene1.setMag(yun.mag);
            break;
        default:
            System.out.println("You did not enter a valid character name");
            break;


        } 
        System.out.println("You have chosen to face " + ene1.name);
        System.out.println("Enemy Skill = " + ene1.skill + " Enemy Weapon = " + ene1.wep);



        System.out.println("Enemy Skill = " + ene1.skill + " Enemy Weapon = " + ene1.wep);

        int eneTotal = ene1.skill + ene1.ap + ene1.str + ene1.mag;

        Stats player = new ThePlayer();

        String plN = GetInput.getInput("What is your name?");
        player.playerName = plN;        
        System.out.println("So Your name is " + player.playerName);

        String plWep = GetInput.getInput("What is your Weapon's name?");
        player.playerWep = plWep;
        System.out.println("So your Weapon is " + player.playerWep);

        Random generator = new Random();
        int plSkill = generator.nextInt(10);
        player.skill = plSkill;
        System.out.println("Your skill level is " + player.skill);

        Random gn = new Random();
        int plAp = gn.nextInt(10 - 5) + 5;
        System.out.println("So your Attack Power is " + plAp);
        player.ap =  plAp;

        Random gns = new Random();
        int plStr = gns.nextInt(10);
        System.out.println("So your Strength is " + plStr);
        plStr = player.str;

        Random gnm = new Random();
        int plMag = gnm.nextInt(10 - 5) + 5;
        player.mag = plMag;
        System.out.println("So your Magic is " + player.mag);


        int plHax = 15;
        double doubleResult = plHax;


        double ene1Hax = 3.99;
        int intResult = (int)ene1Hax;


        double doubleValue = 6.99;
        Double doubleObj = new Double(doubleValue);
        int intR = doubleObj.intValue();

        System.out.println(intR);

        int plyrTotal = player.skill + player.ap + player.str + player.mag;

        if (plyrTotal > eneTotal) {
            System.out.println("Congratulations you beat " + ene1.name + " Please Play Again!" );

        } else if (plyrTotal == eneTotal) {
            System.out.println("You drew with " + ene1.name + " Play again and Win!");
        }
        else
        {
            System.out.println("You were not succesful this time " + ene1.name + " Defeated you by " + (eneTotal - plyrTotal) + " Please Try Again");

        }


    }

}

この後、プレイヤーの「統計」とキャラクターの乱数を生成し、統計の合計値を照合して、別のクラスに入れたい「勝者」を決定するコードがさらに増えました。私の問題は、

Mainクラスのswitchステートメントに入力された値を使用して別のクラスでene1を取得するにはどうすればよいですか。

わかりやすくするために、完全なメインメソッドに更新されました

4

4 に答える 4

1

あなたが抱えている問題の 1 つは、Enemy を Stats のサブクラスとして割り当てているが、キャラクターとは関係がないことです。したがって、敵はキャラクターの同じ属性を持っていますが、キャラクターに話しかける関係はありません。名前や色などのこれらの値をすべてコピーする代わりに、Enemy を統計値を保持する独自のエンティティにし、統計とのインターフェイスを共有します。その後、敵はそのインターフェイスを使用して、Stats クラスのさまざまなメソッドを呼び出すことができます。

public class Static implements Actions{
    // ...
}

public class Enemy implements Actions{
   private Static characterType;
}

また、今後の参考のために、質問をより一般的なものにしていただけませんか? 参考文献を理解していない人を助けるだけでなく、同様の問題を抱えている人がこれを見つけやすくなります.

于 2013-01-10T17:50:19.653 に答える
0

特定の例では、すべての敵エンティティに同じフィールドがあり、ここでは外部ストレージ (DB、ファイルなど) を使用していないため、クラス階層を使用する代わりに、敵に列挙型を使用することをお勧めします。

クラス階層は、類似点と特徴の両方を持つ複数のエンティティがある場合に適しています。たとえば、通常の敵用に 1 つのクラスを作成し、いくつかのスーパースキルを持つ「強化された」敵用に 1 つのクラスを作成すると、2 番目のクラスは最初のクラスを継承し、1 つのフィールドが追加されます。これにより、コードの重複を減らすことができ、十分な柔軟性が得られます。また、クラス階層は、このエンティティを DB などのストレージに保存する場合に、さらにいくつかの利点をもたらします。

しかし、あなたの場合、単一の Enum を使用して、アプリケーションに「ハードコーディング」された一連の敵を持つ方がより論理的です。次の解決策をお勧めします。

public enum Enemy {
    CLOUD("Cloud", "Red", "Sword", 10),
    SQUALL("Cloud", "Black", "Minigun", 999)
    // and so on
    ;

    public String name;
    public String hairColor;
    public String wep;
    public int skill;

    Enemy(String name, String hairColor, String wep, int skill /* and so on */) {
        this.name = name;
        this.hairColor = hairColor;
        this.wep = wep;
        this.skill = skill;
    }

    public static Enemy getByName(String name) {
        for (Enemy enemy : Enemy.values()) {
            if (enemy.name.equalsIgnoreCase(name)) {
                return enemy;
            }
        }
        throw new IllegalArgumentException("Enemy with the name `" + name + "` doesn't exist.");
    }
}

次に、キー名でメイン クラスの敵を初期化することができます。

String versus = GetInput.getInput("\nWhich of these Characters would you like to go up against?");
try {
    Enemy enemy = Enemy.getByName(versus);
} catch (IllegalArgumentException e) {  // processing incorrect input
    System.out.println(e.getMessage());
}

次に、この定数を他のクラスに渡して処理し、必要なものを計算できます。

public class FightCalculator {
    public int calculateScore(Enemy enemy) {
         // Some calculations here...
    }
}
于 2013-01-10T18:16:01.443 に答える
0

他の変数やテキストと同じように、そのクラスのメソッド (またはコンストラクター) に渡すことができます。いえ

 clo.setOpponent(ene1);

次に、 setOpponent の実装を次のようにします

 class Stats
 {
      private Stats opponent;
      //ALL OF YOUR OTHER CODE AND METHODS GO HERE

      public void setOpponent(Stats enemy)
      {
          opponent = enemy;
      }
 }

これは、アプリケーションの貧弱な OO 設計を考慮に入れておらず、質問に答えるだけです。より良い設計には、より多くの練習と研究が伴います (基本的な OO 設計に役立つように、IS-A と HAS-A の関係を調べてください)。

于 2013-01-10T17:53:32.263 に答える
0

Hero別のEnemyクラスを作成すると役立つ場合があります。または、キャラクターが「善人」でも「悪人」でもない場合は、おそらく単なるCharacterクラスです。以下の説明では、単純に を使用しますが、これをまたはにCharacter置き換えることができ、それでも意味があるはずです。HeroEnemy

まず、 aCharacterと aの関係とは何かStatsCharacater にはがある と思いますStats。これはCharacter、 type のメンバー変数を持つ必要があることを意味しますStats:

class Character {
    private Stats stats = new Stats();
}

Statsの新しいオブジェクトであるコンストラクターを追加できるようになりましたCharacter。これは、Characterが に格納されている値ごとにいくつかのパラメータを取得する必要があることを意味しますStatsStatsこのアプローチの利点の 1 つは、オブジェクトを設定するコードを 1 回だけ記述すれば、各caseステートメントが 1 行だけになることです。

ene1 = new Character(/* all the stats values go here */);

ここでの話の教訓は、コードを繰り返していることに気付いた場合は、その繰り返しをカプセル化するメソッドを作成することを検討する必要があるということです。

于 2013-01-10T18:26:37.163 に答える