2017-07-10 4 views
-2

私は戦闘に参加できるテキストアドベンチャーRPGゲームを作成しています。私はプレーヤーのクラスを作りました。私はこれを使ってプレーヤーのすべてのステータスを保持しています。複数の異なるクラスの選手の統計情報を使用

public class Player { 

    // Generic Stats 
    int playerLevel = 1; 
    int playerHealth = 20; 
    int EXP = 0; 
    long money = 0; 
    String name = ""; 
    String homeland = ""; 

    // Skills 
    int fighting = 5; 
    int block = 5; 
    int doctor = 5; 
    int speech = 5; 

    // Attributes 
    int damage = fighting * 2; 

    // Prints the player's stats 
    public void printStats() {   
     System.out.println(); 
     System.out.println("Level: " + playerLevel); 
     System.out.println("EXP: " + EXP); 
     System.out.println("HP: " + playerHealth); 
     System.out.println("Money: " + money); 
     System.out.println("Name: " + name); 
     System.out.println("Homeland: " + homeland); 
     System.out.println("Skills: Fighting: " + fighting + " Block: " + block + "Doctor: " + doctor + " Speech: " + speech); 
     System.out.println(); 
    } 

    // Changes the player's level 
    public void changeLevel(int newLevel) {   
     playerLevel = newLevel; 
    } 

    // Levels up the player 
    public void levelUp() { 
     playerLevel++; 
     EXP = 0; 
    } 

    // Give the player health 
    public void addHealth(int addedHealth) { 
     playerHealth = playerHealth + addedHealth; 
    } 

    // Remove the player's health 
    public void removeHealth(int removedHealth) { 
     playerHealth = playerHealth - removedHealth; 
    } 

    // Give the player money 
    public void giveMoney(int givenMoney) { 
     money = money + givenMoney; 
    } 

    // Give the player EXP 
    public void giveEXP(int addedEXP) { 
     EXP = EXP + addedEXP; 
    } 

    // Change the player's homeland 
    public void changeHomeland(String newHomeland) { 
     homeland = newHomeland; 
    } 

    // Change the player's name 
    public void changeName(String newName) { 
     name = newName; 
    } 

    // Increase Fighting 
    public void increaseFightingSkill(int amountAdded) { 
     fighting = fighting + amountAdded; 
    } 

    // Decrease Fighting 
    public void decreaseFightingSkill(int amountdecreased) { 
     fighting = fighting - amountdecreased; 
    } 

    // Increase Block 
    public void increaseBlockSkill(int amountAdded) { 
     block = block + amountAdded; 
    } 

    // Decrease Block 
    public void decreaseBlockSkill(int amountdecreased) { 
     block = block - amountdecreased; 
    } 

    // Increase Doctor 
    public void increaseDoctorSkill(int amountAdded) { 
     doctor = doctor + amountAdded;   
    } 

    // Decrease Doctor 
    public void decreaseDoctorSkill(int amountdecreased) { 
     doctor = doctor - amountdecreased; 
    } 

    // Increase Speech 
    public void increaseSpeechSkill(int amountAdded) { 
     speech = speech + amountAdded; 
    } 

    // Decrease Speech 
    public void decreaseSpeechSkill(int amountdecreased) { 
     speech = speech - amountdecreased; 
    } 

} 

ご覧のとおり、プレーヤのステータスを変更することもできます。私はメインクラスを作っています。ここでは単にプレイヤーを初期化し、プレイヤーが決定を下し、戦いを勝ち取るなどしてそのステータスを変更します。メインクラスのプレーヤーをここで初期化します。

Player player = new Player(); 

これで初期化されました。「バトル」クラスを作成しました。コンセプトは、単にバトルを初期化し、バトルの内容を変更して(コード内にドロップすることができるバトルテンプレートのように)それで済ませたいということです。みかんのように:

battle.enemySetHealth() // example modifier 
battle.start() // simply run through the battle 

問題は、私はプレイヤーのを修正することになるので、私は実際にちょうど他のプレイヤーを定義することなく、戦闘クラスのプレーヤーの統計情報を使用したい、私は、同じプレイヤオブジェクトを使用したい、です私が新しいクラスを定義すると、それはバトルクラス内で異なる統計を持ち、全体を乱してしまいます。バトルクラスのプレーヤーの統計情報を使用して、攻撃の被害、着信攻撃をブロックする機会、e.c.c.ここには戦闘クラスがあります:

import java.util.Random; 
import java.util.Scanner; 

// Battle Scene 
public class Battle { 
    //Variables 
    String enemyName = "Unnamed Enemy"; 
    int enemyHealth = 20; 
    int enemyAttack = 5; 
    int enemyDefense = 5; 
    int enemyDisposition = 0; 
    int attackDamage; 
    // Sets up tools 
    clear clear = new clear(); 
    Scanner sc = new Scanner(System.in); 
    Random rand = new Random(); 

    // Allows changing of enemy name 
    public void enemyName(String newEnemyName) { 
     enemyName = newEnemyName; 
    } 

    // Sets a new disposition for the enemy to start the fight with 
    public void enemyStartingDisposition(int newStartingDisposition) { 
     enemyDisposition = newStartingDisposition; 
    } 

    // Sets a new amount of health for the enemy to start with 
    public void enemyStartingHealth(int newStartingHealth) { 
     enemyHealth = newStartingHealth; 
    } 

    // Sets a new defense for the enemy to start with 
    public void enemyStartingDefense(int newEnemyDefense) { 
     enemyDefense = newEnemyDefense; 
    } 

    // Sets a new attack for the enemy to start with 
    public void enemyStartingAttack(int newEnemyAttack) { 
     enemyAttack = newEnemyAttack; 
    } 

    // Starts the battle 
    public void startFight() throws InterruptedException { 
     System.out.println("Woah! " + enemyName + " jumped out of nowhere!!!"); 
     System.out.println("(Attack)"); 
     System.out.println("(Talk)"); 
     System.out.println("(Run)"); 
     while (true) { 
      System.out.print("What should you do? : "); 
      String userInput = sc.nextLine(); 
      if (userInput.equals("Attack")) { 
       // hopefully put in a way to attack based on your stats 
      } if (userInput.equals("Talk")) { 
       // a way to use speech to talk your way out of the fight 
      } if (userInput.equals("Run")) { 
       //ability to run away based on agility/speed 
      } else { 
       System.out.println(); 
       System.out.println("Invalid Answer!"); 
       Thread.sleep(2000); 
       clear.Screen(); 
      } 
     } 
     //Break here 
    } 
} 

私はまた、お金と経験のように最後にプレーヤーの統計情報を変更したいと思います。だから私はこれをどのようにすることができますか?それは本当に混乱しています。

+0

可読性を高めるためにコードをフォーマットし直してください。何でこれが大切ですか?あなたがコードを読んで勉強している唯一の人なのかどうかは関係ありませんが、ボランティアのスタッフがいるサイトに投稿すれば変更されます。可能な限りコードを理解して読みやすくする。すべてのネストされたブロックは、4つのスペースでインデントされる必要があります。同じブロック上のすべてのコードは同じインデントを持つ必要があります。一行に複数の空白行があることは決してありません。これであなたの助けには大いに感謝します。 –

+0

「バトル(Battle)」は、目標に応じて2人のプレイヤー、1人のプレイヤーと1人の敵を選ぶ必要があります。 – Isac

答えて

0

実際のパラメータとしてPlayerエンティティをBattleクラスのメソッドに渡し、現在のエンティティをパラメータとして返すことができます。以下のように サンプルコード:

バトルクラスコード:

public class Battle { 
    //battle win function 
    public Player winBattle(Player player){ 
     /** 
     * win rules 
     */ 
     player.setStatus("dead"); 
     return player; 
    } 

} 

プレーヤークラスコード:

Player player = new Player(); 
Battle battle=new Battle(); 
player=battle.run(player); 
+0

だから私は基本的にプレイヤーを通して戦いを実行しますか? –

+0

なぜあなたはプレーヤーを返す必要がありますか? –

+0

@CuriousManビジネスロジック内の2つのエンティティの両方を初期化するか、メインメソッド〜 –

0

あなたはメインクラスで作成したプレイヤオブジェクトを渡すことは何ですか、あなたはしますかするつもりバトルクラスのstartfight()メソッドに渡します。その後、スタートファイトでは、プレイヤーの統計情報を再定義せずにすべてのステータスにアクセスできます。また、エネミークラスを作成してゲームのエモミーを表現すると便利です。そうすれば、あなたはバトルクラスで定義された敵のための統計を持つ必要はありません。また、PlayerとEnemyがいくつかの統計(ダメージや名前など)を共有しているため、コードの重複を避けるためにインスタンス変数としてダメージと名前を持つsuperclassを作成すると便利です。プレイヤーのプレイは常に同じなので、バトルクラスのインスタンスを1つだけ使用したいので、バトルのためにインスタンスをインスタンスにすることができます。これは、提案された変更を組み込んだコードです。

GameUnit.java

/** 
* Represents a game unit - a Player or an Enemy because they both share common stats 
*/ 
public class GameUnit { 
    int attackDamage;// your "damage" in the player class and "enemyAttack" in the battle class 
    int health = 5;// "playerHealth" in the player class and "enemyHealth" in the battle class 
    int defense = 5; 

    String name = "unnamed game unit"; 

    public void printStats() { 
     System.out.println(); 
     System.out.println("Game Unit attackDamage: " + attackDamage); 
     System.out.println("Game Unit health: " + health); 
     System.out.println("GameUnit defense: " + defense); 
    } 

    // Give the unit health 
    public void addHealth(int addedHealth) { 
     health = health + addedHealth; 
    } 

    public void setHealth(int newHealth) { 
     health = newHealth; 
    } 

    // Remove the player's health 
    public void removeHealth(int removedHealth) { 
     health = health - removedHealth; 
    } 

    // Change the unit's name 
    public void changeName(String newName) { 
     name = newName; 
    } 

    public void setAttackDamage(int attackDamage) { 
     this.attackDamage = attackDamage; 
    } 

    // Increase Block 
    public void increaseBlockSkill(int amountAdded) { 
     defense = defense + amountAdded; 
    } 

    // Decrease Block 
    public void decreaseBlockSkill(int amountdecreased) { 
     defense = defense - amountdecreased; 
    } 

    public void setDefense(int defense) { 
     this.defense = defense; 
    } 
} 

Player.java

public class Player extends GameUnit { 
    int level = 1; 
    // health is now in GameUnit because enemy needs health too 
    int EXP = 0; 
    long money = 0; 
    String homeland = ""; 

    int fighting = 5; 
    //block is defense in GameUnit 
    int doctor = 5; 
    int speech = 5; 

    // Constructor that sets name from "unnamed game unit" to Player 
    public Player() { 
     name = "Player";// Set the name declared in the GameUnit class to player because this instance is the player 
     attackDamage = fighting * 2; 
    } 

    // Override printStats in GameUnit to print the remaining player stats 
    public void printStats() { 
     super.printStats();// Prints attack damage and health 
     System.out.println("Player level: " + level); 
     System.out.println("Health: " + health); 
     System.out.println("EXP: " + EXP); 
     System.out.println("money " + money); 
     System.out.println("Homeland: " + homeland); 
     System.out.println("Skills: Fighting: " + fighting + "Doctor: " + doctor + " Speech: " + speech); 
     System.out.println(); 
    } 


    // Changes the player's level 
    public void changeLevel(int newLevel) { 

     level = newLevel; 
    } 

    // Levels up the player 
    public void levelUp() { 
     level++; 
     EXP = 0; 
    }// Give the player money 
    public void giveMoney(int givenMoney) { 
     money = money + givenMoney; 
    } 

    // Give the player EXP 
    public void giveEXP(int addedEXP) { 
     EXP = EXP + addedEXP; 
    } 

    // Change the player's homeland 
    public void changeHomeland(String newHomeland) { 
     homeland = newHomeland; 
    } 

    // Increase Fighting 
    public void increaseFightingSkill(int amountAdded) { 
     fighting = fighting + amountAdded; 
    } 

    // Decrease Fighting 
    public void decreaseFightingSkill(int amountdecreased) { 
     fighting = fighting - amountdecreased; 
    } 

    // Increase Doctor 
    public void increaseDoctorSkill(int amountAdded) { 
     doctor = doctor + amountAdded; 

    } 

    // Decrease Doctor 
    public void decreaseDoctorSkill(int amountdecreased) { 
     doctor = doctor - amountdecreased; 
    } 

    // Increase Speech 
    public void increaseSpeechSkill(int amountAdded) { 
     speech = speech + amountAdded; 
    } 

    // Decrease Speech 
    public void decreaseSpeechSkill(int amountdecreased) { 
     speech = speech - amountdecreased; 
    } 
} 

Enemy.java

public class Enemy extends GameUnit { 
    //enemyHealth is health in GameUnit 
    //enemyAttack is attackDamage in GameUnit 
    int enemyDisposition = 0; 

    //No need for setEnemy name because changeName does the perfect thing in GameUnit 

    //Set health does the job of enemyStartingHealth 
    public void setEnemyDisposition(int enemyDisposition) { 
     this.enemyDisposition = enemyDisposition; 
    } 

} 

バトル。Javaの

import java.util.*; 

public class Battle { 
    private Player player; 
    private Enemy enemy; 

    private Clear clear = new Clear();// Remember Java classes are supposed to start with upper cases 
    private Scanner sc = new Scanner(System.in); 
    private Random rand = new Random(); 

    public Battle(Player thePlayer) {// Pass our only instance of player 
     player = thePlayer;// Because objects are passed by reference in Java, 
     // player will be the same instance of Player. In other words, when 
     // you modify the player object in main, the instance variables in this 
     // player reference will change accordingly because player in this class 
     // and player in main both point to the same object 
    } 

    public void setEnemy(Enemy newEnemy) { 
     enemy = newEnemy; 
    } 

    // Starts the battle 
    public void startFight() { 

     System.out.println("Woah! " + enemy.name + " jumped out of nowhere!!!"); 
     System.out.println("(Attack)"); 
     System.out.println("(Talk)"); 
     System.out.println("(Run)"); 
     boolean won = false; 
     while (true) { 

      if (enemy.health <= 0) {// enemy is dead 
       won = true; 
       break; 
      } 

      if (player.health <= 0) {// player is dead 
       won = false; 
       break; 
      } 

      System.out.print("What should you do? : "); 
      String userInput = sc.nextLine(); 
      if (userInput.equals("Attack")) { 
       enemy.removeHealth(player.attackDamage);// hurt the enemy or whatever 
       // hopefully put in a way to attack based on your stats 
      } 
      if (userInput.equals("Talk")) { 
       if (player.speech > 10) { 
        // ... 
       } 

      } 
      if (userInput.equals("Run")) { 
       // ability to run away based on agility/speed 

      } else { 
       System.out.println(); 
       System.out.println("Invalid Answer!"); 
       try { 
        Thread.sleep(2000); 
       } catch (Exception e) { 
        // ignore all exceptions 
       } 
       clear.screen();// and methods are supposed to use lower camel case so the first word (screen) is lowercase 
      } 
     } 
     if (won) { 
      player.money += 1000; 
      player.giveEXP(10); 
      if (player.EXP > 100) { 
       player.levelUp(); 
      } 
     } else { 
      player.money -= 500; 
     } 
     // Break here 

    } 

} 

Main.java

public class Main { 

    public static void main(String[] args) { 

     Player player = new Player(); 

     Battle battle = new Battle(player);// Pass player to battle 

     Enemy firstEnemy = new Enemy(); 
     firstEnemy.changeName("First Enemy"); 

     battle.setEnemy(firstEnemy); 
     battle.startFight(); 
     // ...do other battles, create new enemies with random stats etc... 
    } 
} 

は、Javaライブラリがあまりにも階層を使用しています:link

この階層ビジネスは意味がない場合、あなたのJavaのスキルを向上させるために有益であるかもしれませんあなたのゲームを続行する前に少し。あなたが自信を失ったら、自分のゲームオブジェクト(プレイヤーと敵)をどのように表現したいのかをカプセルに入れないかもしれないので、プレイヤーと敵の共通点(健康、ブロック)を示すUML diagramを描きたいかもしれませんが、プレイヤーは敵が今あるレベル(レベル、XPなど)を持つかもしれません。この知識によって、階層を再構築できるので、すべての情報がどのように格納されているか心配する必要がなくなり、コンテンツに対して途切れることなく作業できます。

グッド継承/階層の例here

0

、受け入れ答えは十分に細かいですが、私はそれはあなたが唯一のゲーム全体で一人のプレイヤーを持っている場合、あなたはあなたのメインクラスでpublic static Playerを作成する必要があることは注目に値すると思いますように:バトルクラスで

public class Main { 

public static Player player; 

public static void main(String args[]) { 
player = new Player(); 
//... 
battle.start(); 
} 

} 

そして、あなたはプレーヤーのEXP(または他の何か)を報いるしたいときにすることができ、単に:

Main.player.rewardExp(25); 

または

Main.player.exp += 25; 
私は個人的に、これはより多くの技術的な理にかなってあなたのゲームのために感じるが、あなたはより多くのプレイヤーや敵を追加した場合、それはこのようにそれに近づくために、より理にかなって

Battle b = new Battle(player, enemy); 
battle.start(); 

プレイヤーと敵のパラメータを渡し、バトルの各インスタンスごとにそれらを変数として格納することで、バトルはそれらに簡単にアクセスできます。

** EDIT:**エンティティクラスの作成を検討することもできます。 HP、パワー、その他のプレイヤーの特定の変数(特性、統計)は、敵が持っているステータスでもあります。

同じコードを2回書き込まないようにするには、HPPOWEREXPのような変数を持つ--SUPERCLASS--を作成することができます。

プレーヤークラスと敵クラスextends Entityを持っていて、両方のクラスにそれらを書き込まなくても、それらの統計情報を両方に使用できます。 die()giveExp()loseHp()などのプリセット方法を使用することもできます。

私はそれを十分に説明しました。

関連する問題