Webアプリ開発

メニューから[新規]-[プロジェクト]を選択する。

SpringBootの中にある「Springスタータープロジェクト」を選択する。
Webの中にある「Spring Web」を選択して「完了」する。

プロジェクト名「demo」を右クリックして[Maven]-[プロジェクトの更新]を選択する。
「OK」をクリックすると画面下のステータスバーに何か処理が動いている表示になる。

プロジェクトの更新が終わったらプロジェクト名「demo」を右クリックして[実行]-[maven install]を選択する。
コンソールにいろいろと表示され、最後のほうに「BUILD SUCCESS」と表示されればOK!

誰もできない!

方針転換

[新規]-[動的Webプロジェクト]を選択する。

「WebContent」を右クリックして[新規]-[HTMLファイル]を選択する。
ファイ名を「index.html」に変更して「完了」する。
適当に index.html の中身を変更する。

プロジェクト名「web」を右クリックし[実行]-[サーバーで実行]を選択する。
Tomcat8.0サーバーを選択する。
「次へ」をクリックし構成済みの枠内に「web」があることを確認して「完了」する。

TDD: テスト駆動開発

勇者のLevelを経験値によって判断するクラス Level を作成する。

package rpg;

public class Level {
	public static int getLevel(int exp) {
		return 1;
	}
}

Level.java を右クリックして[新規]-[その他]を選択する。
Junitテストケースを選択して「次へ」をクリック。
getLevel()メソッドにチェックして「完了」をクリックする。

LevelTest.javaが作成される。
以下のコードを追加する。

package rpg;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class LevelTest {

	@Test
	void testGetLevel() {
		int l = Level.getLevel(0);
		assertThat(l, is(1));
	}

}

仕様を決める。

Level 経験値
1 0~10
2 11~30
3 31~60
4 61~150
5 151~

経験値が0から10まではレベル1で、経験値が11だとレベル1ではないというテストを書く。

package rpg;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class LevelTest {

	@Test
	void testGetLevel1() {
		int l = Level.getLevel(0);
		assertThat(l, is(1));
		l = Level.getLevel(10);
		assertThat(l, is(1));
		l = Level.getLevel(11);
		assertThat(l, not(1));
	}

}

このテストにパスするように、Level.java を修正する。

package rpg;

public class Level {
	public static int getLevel(int exp) {
		if (exp > 10) return 2;
		return 1;
	}
}

徐々にテストを増やしていき、Lebel.javaのコードにはテストにパスするように追加していく。

package rpg;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class LevelTest {

	@Test
	void testGetLevel1() {
		int l = Level.getLevel(0);
		assertThat(l, is(1));
		l = Level.getLevel(10);
		assertThat(l, is(1));
		l = Level.getLevel(11);
		assertThat(l, not(1));
	}

	@Test
	void testGetLevel2() {
		int l = Level.getLevel(10);
		assertThat(l, not(2));
		l = Level.getLevel(11);
		assertThat(l, is(2));
		l = Level.getLevel(30);
		assertThat(l, is(2));
		l = Level.getLevel(31);
		assertThat(l, not(2));
	}

	@Test
	void testGetLevel3() {
		int l = Level.getLevel(30);
		assertThat(l, not(3));
		l = Level.getLevel(31);
		assertThat(l, is(3));
		l = Level.getLevel(60);
		assertThat(l, is(3));
		l = Level.getLevel(61);
		assertThat(l, not(3));
	}

	@Test
	void testGetLevel4() {
		int l = Level.getLevel(60);
		assertThat(l, not(4));
		l = Level.getLevel(61);
		assertThat(l, is(4));
		l = Level.getLevel(150);
		assertThat(l, is(4));
		l = Level.getLevel(151);
		assertThat(l, not(4));
	}
}

Lebel.java

package rpg;

public class Level {
	public static int getLevel(int exp) {
		if (exp > 150) return 5;
		if (exp > 60) return 4;
		if (exp > 30) return 3;
		if (exp > 10) return 2;
		return 1;
	}
}

FizzBuzz問題をTDDで実装する

FuzzBuzzクラスを作成する。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		return null;
	}
}

FizzBuzzTest を作成する。

package hello;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		fail("まだ実装されていません");
	}

}

まず、1のときに文字列”1″が返されるという条件のテストを作成する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
	}

}

このテストにパスする最低限のコードを書く。
このような書き方を fake という。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		return "1";
	}
}

fake でテストにパスしたので、テストを追加する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
	}

}

テストにパスするようにFizzBuzzを修正する。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i == 2) return "2";
		return "1";
	}
}

テストにパスしたので、テストを追加する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
		a = fb.answer(3);
		assertThat(a, is("Fizz"));
	}

}

テストにパスするようにFizzBuzzを修正する。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i == 3) return "Fizz";
		if (i == 2) return "2";
		return "1";
	}
}

テストにパスしたので、テストを追加する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
		a = fb.answer(3);
		assertThat(a, is("Fizz"));
		a = fb.answer(4);
		assertThat(a, is("4"));
	}

}

さすがにif文で対応すると重複した処理が増えるので、数値を文字列に変換する部分をまとめる。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i == 3) return "Fizz";
		return String.valueOf(i);
	}
}

5の場合は “Buzz”と返すテストを作成する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
		a = fb.answer(3);
		assertThat(a, is("Fizz"));
		a = fb.answer(4);
		assertThat(a, is("4"));
		a = fb.answer(5);
		assertThat(a, is("Buzz"));
	}

}

テストにパスするようにFizzBuzzを修正する。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i == 5) return "Buzz";
		if (i == 3) return "Fizz";
		return String.valueOf(i);
	}
}

6は3の倍数なので “Fizz” と返す。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
		a = fb.answer(3);
		assertThat(a, is("Fizz"));
		a = fb.answer(4);
		assertThat(a, is("4"));
		a = fb.answer(5);
		assertThat(a, is("Buzz"));
		a = fb.answer(6);
		assertThat(a, is("Fizz"));
	}

}

3の倍数なら “Fizz” と返すようにする。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i == 5) return "Buzz";
		if (i % 3 == 0) return "Fizz";
		return String.valueOf(i);
	}
}

7・8・9はこのままで問題なさそうなので飛ばす。
10は5の倍数なので “Buzz” が返されるはず。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
		a = fb.answer(3);
		assertThat(a, is("Fizz"));
		a = fb.answer(4);
		assertThat(a, is("4"));
		a = fb.answer(5);
		assertThat(a, is("Buzz"));
		a = fb.answer(6);
		assertThat(a, is("Fizz"));
		a = fb.answer(10);
		assertThat(a, is("Buzz"));
	}

}

3の倍数と同様に、5の倍数は “Buzz” を返すようにする。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i % 5 == 0) return "Buzz";
		if (i % 3 == 0) return "Fizz";
		return String.valueOf(i);
	}
}

11・12・13・14は問題なさそうなので飛ばす。
15の倍数の時は “FizzBuzz” となるので、テストを追加する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class FizzBuzzTest {

	@Test
	void testAnswer() {
		FizzBuzz fb = new FizzBuzz();
		String a = fb.answer(1);
		assertThat(a, is("1"));
		a = fb.answer(2);
		assertThat(a, is("2"));
		a = fb.answer(3);
		assertThat(a, is("Fizz"));
		a = fb.answer(4);
		assertThat(a, is("4"));
		a = fb.answer(5);
		assertThat(a, is("Buzz"));
		a = fb.answer(6);
		assertThat(a, is("Fizz"));
		a = fb.answer(10);
		assertThat(a, is("Buzz"));
		a = fb.answer(15);
		assertThat(a, is("FizzBuzz"));
	}

}

テストにパスするようにFizzBuzzを修正する。

package hello;

public class FizzBuzz {
	public String answer(int i) {
		if (i % 15 == 0) return "FizzBuzz";
		if (i % 5 == 0) return "Buzz";
		if (i % 3 == 0) return "Fizz";
		return String.valueOf(i);
	}
}

世界のナベアツをテスト駆動開発で実装する

対象となるクラス Nabeatsu を作成する。

package hello;

public class Nabeatsu {
	public String answer(int i) {
		return null;
	}
}

Junitテストケースを作成する。

package hello;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class NabeatsuTest {

	@Test
	void testAnswer() {
		fail("まだ実装されていません");
	}

}

1から3までテストを書いていく。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class NabeatsuTest {

	@Test
	void testAnswer() {
		Nabeatsu n = new Nabeatsu();
		String a = n.answer(1);
		assertThat(a, is("1"));
		a = n.answer(2);
		assertThat(a, is("2"));
		a = n.answer(3);
		assertThat(a, is("さぁ~ん!"));
	}

}

3の倍数はFizzBuzzと同じなので簡単にできる。

package hello;

public class Nabeatsu {
	public String answer(int i) {
		if (i % 3 == 0) return "さぁ~ん!";
		return String.valueOf(i);

	}
}

3の倍数ではないけど3が含まれるパターンに対応する。

package hello;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class NabeatsuTest {

	@Test
	void testAnswer() {
		Nabeatsu n = new Nabeatsu();
		String a = n.answer(1);
		assertThat(a, is("1"));
		a = n.answer(2);
		assertThat(a, is("2"));
		a = n.answer(3);
		assertThat(a, is("さぁ~ん!"));
		a = n.answer(13);
		assertThat(a, is("さぁ~ん!"));
	}

}

数値を String.valueOf() で文字列に変換し、その中に “3” が含まれるかどうかを調べる。

package hello;

public class Nabeatsu {
	public String answer(int i) {
		if (i % 3 == 0) return "さぁ~ん!";
		String s = String.valueOf(i);
		if (s.contains("3")) return "さぁ~ん!";
		return s;
	}
}

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