Cast.java
package rpg; import java.util.ArrayList; import java.util.List; public class Cast { private String name; private int hp = 10; private List<Item> list = new ArrayList<>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } public void addItem(Item item) { list.add(item); System.out.println(name + " は " + item.getName() + " をゲットした"); } public void useItem() { Item item = list.remove(0); System.out.println(name + " は " + item.getName() + " を使った"); item.use(this); } public void talk(String s) { System.out.println(" ――――――――――"); System.out.println(name + "< " + s + " |"); System.out.println(" ――――――――――"); } public void printItems() { if (list.size() == 0) { System.out.println("アイテムを持っていません"); return; } System.out.println("アイテムの一覧を表示します。"); System.out.println("-----"); for (Item item : list) { System.out.println(item.getName()); } } }
Player.java
package rpg; public class Player { public static void main(String[] args) { Cast cast = new Cast(); cast.setName("ゆうしゃ"); cast.talk("こんにちは!"); Item item = new Yakusou(); cast.addItem(item); item = new Yakusou(); cast.addItem(item); item = new Dokukeshisou(); cast.addItem(item); cast.printItems(); cast.useItem(); cast.useItem(); cast.useItem(); cast.printItems(); } }
Item.java
package rpg; public abstract class Item { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void use(Cast cast); }
Yakusou.java
package rpg; public class Yakusou extends Item { public Yakusou() { setName("やくそう"); } @Override public void use(Cast cast) { int hp = cast.getHp(); cast.setHp(hp + 10); System.out.println(cast.getName() + " のHPが " + cast.getHp() + " に増えた"); } }
Dokukeshisou.java
package rpg; public class Dokukeshisou extends Item { public Dokukeshisou() { setName("どくけしそう"); } @Override public void use(Cast cast) { System.out.println(cast.getName() + " のからだからどくがきえた"); } }
Player.java が長くなって読みにくくなってきたので、オブジェクト指向っぽく書き直してみる。
別のメソッドに分割したい部分を選択して、メニューから[リファクタリング]-[メソッドの抽出]を選択すると、Eclipseがいい感じで分割してくれる。
package rpg; public class Player { public static void main(String[] args) { createBrave(); createSlime(); } private static void createSlime() { Cast slime = new Cast(); slime.setName("スライム"); System.out.println(slime.getName() + " があらわれた!"); } private static void createBrave() { Cast cast = new Cast(); cast.setName("ゆうしゃ"); cast.talk("こんにちは!"); Item item = new Yakusou(); cast.addItem(item); item = new Yakusou(); cast.addItem(item); item = new Dokukeshisou(); cast.addItem(item); cast.printItems(); cast.useItem(); cast.useItem(); cast.useItem(); cast.printItems(); } }
Player.java
package rpg; public class Player { public static void main(String[] args) { Player player = new Player(); Cast brave = player.createBrave(); Cast slime = player.createSlime(); player.fight(brave, slime); } private Cast createSlime() { Cast slime = new Cast(); slime.setName("スライム"); System.out.println(slime.getName() + " があらわれた!"); return slime; } private Cast createBrave() { Cast cast = new Cast(); cast.setName("ゆうしゃ"); cast.talk("こんにちは!"); Item item = new Yakusou(); cast.addItem(item); item = new Yakusou(); cast.addItem(item); item = new Dokukeshisou(); cast.addItem(item); cast.printItems(); cast.useItem(); cast.useItem(); cast.useItem(); cast.printItems(); return cast; } private void fight(Cast c1, Cast c2) { int hp; while (true) { c1.attack(c2); hp = c2.getHp(); if (hp <= 0) { System.out.println(c2.getName() + " は死んでしまった"); break; } c2.attack(c1); hp = c1.getHp(); if (hp <= 0) { System.out.println(c1.getName() + " は死んでしまった"); break; } } } }
Gitを使ってソースコードを管理する
プロジェクト名「hello」を右クリックして[チーム]-[プロジェクトの共用]を選択する。
「Gitリポジトリーの構成」画面で「作成」をクリックして新しくGit管理下に置くファイルの保存先フォルダを指定する。
「完了」をクリックすると、プロジェクトがGit管理下に再配置される。
プロジェクト名の右側に「NO HEAD」と表示されればOK。
まだソースコードがGitに登録されていない状態なので、登録する操作を行う。
プロジェクトを右クリックして[チーム]-[コミット]を選択する。
「Gitステージング」のタブが表示されるので、Git管理下に置きたいファイルを選択して「+」をクリックし、「ステージされた変更」の方にファイルを移動させる。
コミットメッセージに「first commit」を入力して「コミット」をクリックする。
ファイル名の右下に黄色いアイコンが表示される。
攻撃力を変えてみる
Cast.java
package rpg; import java.util.ArrayList; import java.util.List; public class Cast { private String name; private int hp = 10; private int power = 5; private List<Item> list = new ArrayList<>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } public int getPower() { return power; } public void setPower(int power) { this.power = power; } public void addItem(Item item) { list.add(item); System.out.println(name + " は " + item.getName() + " をゲットした"); } public void useItem() { Item item = list.remove(0); System.out.println(name + " は " + item.getName() + " を使った"); item.use(this); } public void talk(String s) { System.out.println(" ――――――――――"); System.out.println(name + "< " + s + " |"); System.out.println(" ――――――――――"); } public void printItems() { if (list.size() == 0) { System.out.println("アイテムを持っていません"); return; } System.out.println("アイテムの一覧を表示します。"); System.out.println("-----"); for (Item item : list) { System.out.println(item.getName()); } } public void attack(Cast cast) { int hp = cast.getHp(); cast.setHp(hp - power); System.out.println(getName() + " が " + cast.getName() + " を攻撃(" + power + "のダメージ)"); } }
武器を持てるようにする
Item にならって、抽象クラス Weapon を作成する。
名前と攻撃力があればよさそう。
Weapon.java
package rpg; public abstract class Weapon { private String name; private int power; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPower() { return power; } public void setPower(int power) { this.power = power; } }
Cast が武器を装備できるようにする。
Cast.java
package rpg; import java.util.ArrayList; import java.util.List; public class Cast { private String name; private int hp = 10; private int power = 5; private Weapon weapon; private List<Item> list = new ArrayList<>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } public int getPower() { return power; } public void setPower(int power) { this.power = power; } public Weapon getWeapon() { return weapon; } public void setWeapon(Weapon weapon) { this.weapon = weapon; System.out.println(name + " は " + weapon.getName() + "を装備した"); } public void addItem(Item item) { list.add(item); System.out.println(name + " は " + item.getName() + " をゲットした"); } public void useItem() { Item item = list.remove(0); System.out.println(name + " は " + item.getName() + " を使った"); item.use(this); } public void talk(String s) { System.out.println(" ――――――――――"); System.out.println(name + "< " + s + " |"); System.out.println(" ――――――――――"); } public void printItems() { if (list.size() == 0) { System.out.println("アイテムを持っていません"); return; } System.out.println("アイテムの一覧を表示します。"); System.out.println("-----"); for (Item item : list) { System.out.println(item.getName()); } } public void attack(Cast cast) { int hp = cast.getHp(); cast.setHp(hp - power); System.out.println(getName() + " が " + cast.getName() + " を攻撃(" + power + "のダメージ)"); } }
ひのきのぼうを作る。
Hinokinobou.java
package rpg; public class Hinokinobou extends Weapon { public Hinokinobou() { setName("ひのきのぼう"); setPower(3); } }
勇者にひのきのぼうを装備する。
Player.java
private Cast createBrave() { Cast cast = new Cast(); cast.setName("ゆうしゃ"); cast.talk("こんにちは!"); cast.setWeapon(new Hinokinobou()); Item item = new Yakusou(); cast.addItem(item); item = new Yakusou(); cast.addItem(item); item = new Dokukeshisou(); cast.addItem(item); cast.printItems(); cast.useItem(); cast.useItem(); cast.useItem(); cast.printItems(); return cast; }
武器を持った分だけ余計にダメージを与えられるようにする。
Cast.java
public void attack(Cast cast) { int hp = cast.getHp(); int damage = power; if (weapon != null) { damage += weapon.getPower(); } cast.setHp(hp - damage); System.out.println(getName() + " が " + cast.getName() + " を攻撃(" + damage + "のダメージ)"); }
もう少し強い武器を持たせてスライムを一撃で倒したいので、銅のつるぎを作る。
DounoTsurugi.java
package rpg; public class DounoTsurugi extends Weapon { public DounoTsurugi() { setName("銅のつるぎ"); setPower(5); } }
経験値を増やしてレベルアップしたい
勇者と敵を分けるために、Cast を抽象クラスに変更する。
経験値も追加する。
Cast.java
public abstract class Cast { private int exp; private String name; private int hp = 10; private int power = 5; private Weapon weapon; private List<Item> list = new ArrayList<>(); public Cast(String name, int power, int exp) { this.name = name; this.power = power; this.exp = exp; } public int getExp() { return exp; } public void plusExp(int exp) { this.exp += exp; }
勇者のクラスとスライムのクラスを作成する。
Brave.java
package rpg; public class Brave extends Cast { public Brave() { super("ゆうしゃ", 5, 1); } }
Slime.java
package rpg; public class Slime extends Cast { public Slime() { super("スライム", 3, 3); } }
戦いに勝ったら経験値を増やす。
Player.java
private void fight(Cast c1, Cast c2) { int hp; while (true) { c1.attack(c2); hp = c2.getHp(); if (hp <= 0) { System.out.println(c2.getName() + " は死んでしまった"); System.out.println(c1.getName() + " の経験値が " + c2.getExp() + " 増えた"); c1.plusExp(c2.getExp()); break; } c2.attack(c1); hp = c1.getHp(); if (hp <= 0) { System.out.println(c1.getName() + " は死んでしまった"); break; } } }