RPG

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