5-1.クラス-継承

はじめに

本大問で作成するプログラム(演習課題も含む)を保存するためのパッケージを作成する。

  • パッケージ名
    web._05._01

本題

唐突だが、とあるゲームの開発に関ることになった。
ゲームタイトルは「Xincor Quest」である。
本ゲームでは、主人公が以下のアクションを取れるように開発を進めている。

  1. メインキャラクター(MainCharacterオブジェクト)の作成
  2. 敵との戦闘
  3. Fighterへジョブチェンジ
  4. ステータス
  5. 教会にいく(HP・SPの全回復)

開発は順調に進んでおり、今は「ゲームにでてくるジョブを表すクラス」の作成を行っている。
 注)ジョブ = メインキャラクターの職業[戦士、僧侶、魔法使い、遊び人など]

現在は一番最初の職である”メインキャラクター”(MainCharacterクラス)しか存在しないため、
これを元に(MainCharacterクラスを親クラスとして)、1次職のFighterクラス・Magicianクラス(子クラス)を作成しよう!

【ゲームの仕様】

1. メインキャラクター(MainCharacterオブジェクト)の作成

 あなたの代わりとなるメインキャラクターをはじめに作成しなければいけない。
 HP・SPは固定だが、メインキャラクターの容姿は好みで設定できる。
 容姿の設定項目は下表の3つである。

項目 選択値
性別 男性 or 女性
髪型 ロングヘアー or セミロングヘアー or ショートヘアー
目の色 黒 or 銀
2.敵との戦闘

 戦闘は自動で行われる。
 基本的には、メインキャラクターの攻撃⇒敵の攻撃⇒メインキャラクターの攻撃・・・となるが、
 たまに敵の先制攻撃がある。

3.Fighterへジョブチェンジ

 1回でも戦闘するとFighterへジョブチェンジすることができる。
 ※5-1-1のFighterクラスを用意しないとExceptionが発生して動かない

4.ステータス

 ステータスを表示する。

5.教会にいく(HP・SPの全回復)

 HP・SPを全回復する。
 死亡した場合もここで復活できる。

【現時点のソースファイル群(ライブラリ)】

xqライブラリVer510(右クリック⇒名前を付けてリンク先を保存) をダウンロードし、Javaのビルド・パスに追加する。
上記ライブラリでは次のクラス群を提供している。

  • Battle メインキャラクターと敵の戦闘を行うクラス
  • MainCharacter メインキャラクターを表したクラス
  • Church 教会を表したクラス
  • EyeColorMap メインキャラクターに設定できる目の色の情報を管理するクラス
  • GenderMap メインキャラクターに設定できる性別の情報を管理するクラス
  • HairStyleMap メインキャラクターに設定できる髪型の情報を管理するクラス
  • JobChanger メインキャラクターのジョブチェンジを行うクラス
  • Monster 敵を表したクラス
  • XincorQuest 本ゲームの起動クラス

手順

  1. プロジェクト直下にフォルダを新規作成する。
    「JavaTrial」上で右クリックメニュー⇒【新規】⇒【フォルダー】をクリックする。
    フォルダ名を lib として、【完了(F)】ボタンをクリックする。
  2. xqライブラリVer510(xq510.jar) をlibフォルダにコピーする。
  3. 上部メニュー「プロジェクト」 ⇒ 「プロパティ」 ⇒ サイドメニューの「Javaのビルド・パス」を表示する。
  4. ライブラリタブクリック⇒クラスパスをクリック⇒JARの追加クリック⇒libフォルダに保存した xqライブラリVer510(xq510.jar) を選択⇒【OK】ボタンをクリックする。
  5. プロパティ画面も【適用して閉じる】ボタンクリックで終了する。
  6. これで Xincor Quest が利用できる。

※使う際は、SystemStarter.java(右クリック⇒名前を付けてリンク先を保存) をダウンロードし、同パッケージ(web._05._01)に保存する。
SystemStarter.java を実行し、使う機能として 5 を入力 ⇒ エンターで実行する。
現在の仕様で、「Xincor Quest」が実行できる。


5-1-1

MainCharacterクラスの拡張1

まず、1次職「Fighter」クラスを作成する。
MainCharacterクラスを親クラスとしてFighterクラスを作成すること。
(親クラス:MainCharacterクラス、子クラス:Fighterクラス)
MainCharacterクラスの具体的なソースコードは以下のようになっている。

MainCharacter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package xq._05._01;
/**
* 5-1, 2, 3
* 0MainCharacter
*
* @author akira_ishii
*
*/
public class MainCharacter {
/** */
private String genderCode;
/** */
private String hairStyleCode;
/** */
private String eyeColorCode;
/** 80 */
protected int hp;
/** 20 */
protected int sp;
/**
*
*
* @param genderCode
* @param hairStyleCode
* @param eyeColorCode
*/
public MainCharacter(String genderCode, String hairStyleCode, String eyeColorCode) {
this.genderCode = genderCode;
this.hairStyleCode = hairStyleCode;
this.eyeColorCode = eyeColorCode;
this.hp = 80;
this.sp = 20;
}
/**
*
* 4
*
*
* @param monster
* @return
*/
public int attack(Monster monster) {
int damage = (int)(this.hp * 0.4);
monster.setHp(monster.getHp() - damage);
return damage;
}
/**
*
*
* @return true false
*/
public boolean isDead() {
return this.hp <= 0;
}
/**
* HP
*
* @return HP
*/
public int getHp() {
return this.hp;
}
/**
* HP
*
* @param hp
*/
public void setHp(int hp) {
this.hp = hp;
}
/**
* SP
*
* @return SP
*/
public int getSp() {
return this.sp;
}
/**
* SP
*
* @param sp
*/
public void setSp(int sp) {
this.sp = sp;
}
/**
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
本問題で作成するクラス

本問題で作成するクラスは以下の2つである。

  • Fighterクラス
  • Fighterクラスをテストするためのテストクラス
【①Fighterクラスの要件】
<クラス名>

クラス名は Fighter とする。

<作成するフィールド>
  • 「盾の守備力を保管するためのフィールド」を宣言する。
    変数名:shield
    アクセス修飾子:同じフォルダ・継承関係にあるクラスから参照可能
    データ型:整数型
<作成するコンストラクタ>

性別コード・髪型コード・目の色コードを設定する。
ヒットポイント(hpフィールド)・スキルポイント(spフィールド)・盾の守備力(shieldフィールド)に初期値を設定する。

引数
性別コード・髪型コード・目の色コードの3つ
※いずれもString型とする
処理
1. 親クラスの以下コンストラクタを呼び出すこと。
 ※super を利用する。
 MainCharacter(String genderCode, String hairStyleCode, String eyeColorCode)
2. ヒットポイント(hpフィールド)に 100 を代入すること。
3. スキルポイント(spフィールド)に 30 を代入すること。
4. 盾の守備力(shieldフィールド)に 5 を代入すること。
<作成するメソッド>
1. 物理攻撃メソッド
敵に物理攻撃するメソッド。
メソッド呼び出し時、敵に対して自身の残りHP(hpフィールド)の0.6倍を
ダメージとして与える。
敵のHPをダメージ分減らして上書きする。

◇メソッド名
  attack
◇引数
  戦闘対象のMonsterインスタンスを保管するMonster型変数
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理内容
  1. 敵に与えるダメージとして、自身のhpフィールドの0.6倍を計算する。
   ※ダメージは整数値とし、小数は切り捨てること。
  2. 引数のMonsterインスタンスのHPを①で計算したダメージ分減らして上書きする。
  
  例)
  自身の残りHPが10、MonsterインスタンスのHPが10とした場合、
  Monsterインスタンスへのダメージが10×0.6で6となる。
  従って、MonsterインスタンスのHPを4(10-6)で上書きする。
  
  画面表示用に敵に与えたダメージを本メソッドの処理結果として返す。
◇戻り値
  敵に与えたダメージ(整数型)
2. 強打メソッド
Fighterの特殊スキル「強打」のメソッド。
SPを 10 消費して、敵に対して自身の残りHP(hpフィールド)の 1.7倍 を
ダメージとして与える。
敵のHPをダメージ分減らして上書きする。

◇メソッド名
  executeBash
◇引数
  戦闘対象のMonsterインスタンスを保管するMonster型変数
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理
  1. 敵に与えるダメージとして、自身のhpフィールドの1.7倍を計算する。
   ※ダメージは整数値とし、小数は切り捨てること。
  2. 引数のMonsterインスタンスのHPを①で計算したダメージ分減らして上書きする。
  3. 自身のspフィールドの値を5減らして上書きする。
  
  例)
  自身の残りHPが10・残りSPが15、MonsterインスタンスのHPが20とした場合、
  Monsterインスタンスへのダメージが10×1.7で17となる。
  従って、MonsterインスタンスのHPを3(20-17)で上書きする。
  また、自身のSPも5(15-10)で上書きする
  
  画面表示用に敵に与えたダメージを本メソッドの処理結果として返す。
◇戻り値
  敵に与えたダメージ(整数型)
3. 強打発動確認メソッド
Fighterの特殊スキル「強打」を使えるか確認するメソッド。
現在のSPが 10 以上ある場合は発動可能として true を返す。
10 より小さい場合は発動不可能として false を返す。

◇メソッド名
  isExecutiveBash
◇引数
  なし
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理
  現在のSPが 10 以上ある場合は発動可能として true を返す。
  10 より小さい場合は発動不可能として false を返す。
◇戻り値
  真偽型
  true:発動可能 false:発動不可能
4. 盾のsetter・getter
他クラスから盾を参照するためのメソッド。
盾のsetメソッド, getメソッドを作成する。
5. ステータスメソッドのオーバーライド
メインキャラクター情報(性別・髪型・目の色・HP・SP情報)と、盾情報を表示するメソッド。
MainCharacterクラスのviewInfoメソッドをオーバーライドする。

◇メソッド名
  元の情報表示メソッドに準じる。
◇引数
  元の情報表示メソッドに準じる。
◇可視範囲
  元の情報表示メソッドに準じる。
◇処理
  メインキャラクターの性別・髪型・目の色・HP・SP・盾の守備力を表示する。
  性別・髪型・目の色・HP・SPに関しては、親クラスの情報表示メソッドを実行する。
  盾の守備力は本メソッドで表示する。
  表示の仕方は親クラスのviewInfoメソッドに合わせる。
◇戻り値
  なし
【②Fighterクラスをテストするためのクラス】
考え方
Fighterクラスのメソッドを、他クラスから使用して仕様通りに動作することを確認する。
動作確認のためのプログラムは全てmainメソッドに記載する。

◇クラス名
 TestFighter
◇mainメソッドですること
 1. Fighterクラスのオブジェクトを作成する。
 2. ステータスの初期値(性別, 髪型, 目の色, HP, SP, 盾の守備力)を確認する。
 3. 戦闘用にMonsterインスタンスを生成する。
 4. 物理攻撃メソッドのダメージが正しいことを確認する。
 5. 強打発動判定の結果、発動できることを確認する。
 6. 強打メソッドのダメージが正しいことを確認する。
 7. SPが 10 減って 【20】 になっていることを確認する。
 8. SPを 10 より小さい状態にし、強打発動判定の挙動を確認する。
【Fighterクラス】

Fighter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package xq._05._01;
/**
* 5-1
* 1Fighter
*
* @author akira_ishii
*
*/
public class Fighter extends MainCharacter {
/** */
protected int shield;
/**
*
*
* @param genderCode
* @param hairStyleCode
* @param eyeColorCode
*/
public Fighter(String genderCode, String hairStyleCode, String eyeColorCode) {
super(genderCode, hairStyleCode, eyeColorCode);
this.hp = 100;
this.sp = 30;
this.shield = 5;
}
/**
*
* 6
*
*
* @param monster
* @return
*/
public int attack(Monster monster) {
int damage = (int)(this.hp * 0.6);
monster.setHp(monster.getHp() - damage);
return damage;
}
/**
* 使
* 17
*
* 10
*
* @param monster
* @return
*/
public int executeBash(Monster monster) {
int damage = (int)(this.hp * 1.7);
monster.setHp(monster.getHp() - damage);
this.sp = this.sp - 10;
return damage;
}
/**
* 使
* 10使使
*
* @return true使 false使
*/
public boolean isExecutiveBash() {
return 10 <= this.sp;
}
/**
*
*
* @return
*/
public int getShield() {
return this.shield;
}
/**
*
*
* @param shield
*/
public void setShield(int shield) {
this.shield = shield;
}
/**
*
* HPSP
*
*/
public void viewInfo() {
super.viewInfo();
System.out.println("" + this.shield);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
【Fighterクラスのテストクラス】

TestFighter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package xq._05._01;
/**
* 5-1, 3
* 1Fighter
*
* @author akira_ishii
*
*/
public class TestFighter {
/**
* Fighter
*
* @param args
*/
public static void main(String[] args) {
Fighter fighter = new Fighter("1", "1", "1");
//
//true
System.out.println("1");
System.out.println("" + fighter.getGenderCode());
System.out.println("" + fighter.getGenderCode().equals("1"));
System.out.println("1");
System.out.println("" + fighter.getHairStyleCode());
System.out.println("" + fighter.getHairStyleCode().equals("1"));
System.out.println("1");
System.out.println("" + fighter.getEyeColorCode());
System.out.println("" + fighter.getEyeColorCode().equals("1"));
System.out.println("HP100");
System.out.println("HP" + fighter.getHp());
System.out.println("" + (fighter.getHp() == 100));
System.out.println("SP30");
System.out.println("SP" + fighter.getSp());
System.out.println("" + (fighter.getSp() == 30));
System.out.println("5");
System.out.println("" + fighter.getShield());
System.out.println("" + (fighter.getShield() == 5));
//
//
System.out.println("");
fighter.viewInfo();
//Monster
Monster monster = new Monster();
//
int atkDamage = fighter.attack(monster);
//true
System.out.println("60");
System.out.println("" + atkDamage);
System.out.println("" + (atkDamage == 60));
//(true)
//true
System.out.println("(true)");
System.out.println("" + fighter.isExecutiveBash());
System.out.println("" + (fighter.isExecutiveBash() == true));
//
System.out.println("1");
int bDamage = fighter.executeBash(monster);
//true
System.out.println("170");
System.out.println("" + bDamage);
System.out.println("" + (bDamage == 170));
//true
System.out.println("SP20");
System.out.println("SP" + fighter.getSp());
System.out.println("" + (fighter.getSp() == 20));
//(false)
//SP0
System.out.println("SP10isExecutiveBash");
System.out.println("SP0");
fighter.setSp(0);
//false
System.out.println("(false)");
System.out.println("" + fighter.isExecutiveBash());
System.out.println("" + (fighter.isExecutiveBash() == false));
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
【Fighterクラスを使用する場合の注意点】

Fighterクラスを使用する場合は、ライブラリの更新が必要となる。
xqライブラリVer511(右クリック⇒名前を付けてリンク先を保存) をダウンロードし、libフォルダに保存する。
Javaのビルド・パス画面のライブラリタブから xqライブラリVer510 を除去し、xqライブラリVer511 を追加すること。
xqライブラリVer511 にFighterクラスは含まれているため、ライブラリさえ更新すれば Fighter へのジョブチェンジは可能。


5-1-2

MainCharacterクラスの拡張2

次に、Fighterと同じ1次職「Magician」クラスを作成する。
MainCharacterクラスを親クラスとして作成すること。
使用するライブラリは xqライブラリVer510 でも xqライブラリVer511 でも、どちらでも構わない。

本課題で作成・提出するクラス

本課題で作成・提出するクラスは以下の2つである。

  • Magicianクラス
  • Magicianクラスをテストするためのテストクラス

【①Magicianクラスの要件】

<インポート>

import xq._05._01.MainCharacter; を入れてください。
import xq._05._01.Monster; を入れてください。

<クラス名>

クラス名は Magician とする。

<作成するフィールド>
  • Magicianは杖(ワンド)を装備できるようになるため、「杖の魔力を保管するためのフィールド」を宣言する。
    変数名:wand
    アクセス修飾子:同じフォルダ・継承関係にあるクラスから参照可能
    データ型:整数型
<作成するコンストラクタ>

性別コード・髪型コード・目の色コードを設定する。
ヒットポイント(hpフィールド)・スキルポイント(spフィールド)・杖の魔力(wandフィールド)に初期値を設定する。

引数
性別コード・髪型コード・目の色コードの3つ
※いずれもString型とする
処理
1. 親クラスの以下コンストラクタを呼び出すこと。
 ※super を利用する。
 MainCharacter(String genderCode, String hairStyleCode, String eyeColorCode)
2. ヒットポイント(hpフィールド)に 50 を代入すること。
3. スキルポイント(spフィールド)に 90 を代入すること。
4. 杖の魔力(wandフィールド)に 10 を代入すること。
<作成するメソッド>
1. 物理攻撃メソッド
敵に物理攻撃するメソッド。
メソッド呼び出し時、敵に対して自身の残りHP(hpフィールド)の0.6倍を
ダメージとして与える。
敵のHPをダメージ分減らして上書きする。

◇メソッド名
  attack
◇引数
  戦闘対象のMonsterインスタンスを保管するMonster型変数
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理内容
  1. 敵に与えるダメージとして、自身のhpフィールドの0.6倍を計算する。
   ※ダメージは整数値とし、小数は切り捨てること。
  2. 引数のMonsterインスタンスのHPを①で計算したダメージ分減らして上書きする。
  
  例)
  自身の残りHPが10、MonsterインスタンスのHPが10とした場合、
  Monsterインスタンスへのダメージが10×0.6で6となる。
  従って、MonsterインスタンスのHPを4(10-6)で上書きする。
  
  画面表示用に敵に与えたダメージを本メソッドの処理結果として返す。
◇戻り値
  敵に与えたダメージ(整数型)
2. 魔法攻撃メソッド
Magicianの特殊攻撃「魔法攻撃」のメソッド。
敵に対して自身の残りSPの0.4倍をダメージとして与える。
敵のHPをダメージ分減らして上書きする。

◇メソッド名
  attackMagic
◇引数
  戦闘対象のMonsterインスタンスを保管するMonster型変数
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理
  1. 敵に与えるダメージとして、自身のspフィールドの0.4倍を計算する。
   ※ダメージは整数値とし、小数は切り捨てること。
  2. 引数のMonsterインスタンスのHPを①で計算したダメージ分減らして上書きする。

  例)
  自身の残りSPが20、MonsterインスタンスのHPが10とした場合、
  Monsterインスタンスへのダメージが20×0.4で8となる。
  従って、MonsterインスタンスのHPを2(10-8)で上書きする。

  画面表示用に敵に与えたダメージを本メソッドの処理結果として返す。
◇戻り値
  敵に与えたダメージ(整数型)
3. めらメソッド
Magicianの特殊スキル「めら」のメソッド。
SPを 5 消費して、敵に対して杖の魔力値(wandフィールド)の5倍を
ダメージとして与える。
敵のHPをダメージ分減らして上書きする。

◇メソッド名
  executeMera
◇引数
  戦闘対象のMonsterインスタンスを保管するMonster型変数
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理
  1. 敵に与えるダメージとして、自身のwandフィールドの5倍を計算する。
   ※ダメージは整数値とし、小数は切り捨てること。
  2. 引数のMonsterインスタンスのHPを①で計算したダメージ分減らして上書きする。
  3. 自身のspフィールドの値を5減らして上書きする。
  
  例)
  自身の残りHPが10・残りSPが15・wandフィールドが6、MonsterインスタンスのHPが51とした場合、
  Monsterインスタンスへのダメージが6×5で30となる。
  従って、MonsterインスタンスのHPを21(51-30)で上書きする。
  また、自身のSPも10(15-5)で上書きする
  
  画面表示用に敵に与えたダメージを本メソッドの処理結果として返す。
◇戻り値
  敵に与えたダメージ(整数型)
4. めら発動確認メソッド
Magicianの特殊スキル「めら」を使えるか確認するメソッド。
現在のSPが 5 以上ある場合は発動可能として true を返す。
5 より小さい場合は発動不可能として false を返す。

◇メソッド名
  isExecutiveMera
◇引数
  なし
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理
  現在のSPが 5 以上ある場合は発動可能として true を返す。
  5 より小さい場合は発動不可能として false を返す。
◇戻り値
  真偽型
  true:発動可能 false:発動不可能
5. SP回復メソッド
Magicianの特殊スキル「SP回復」のメソッド。
SPを0~4のランダムな数値+ボーナスポイント「1」の合計値分回復させる。

◇メソッド名
  recoverySp
◇引数
  なし
◇可視範囲
  全てのクラスから参照可能となるようにアクセス修飾子を設定する。
◇処理
  1. 0~4のランダム数値を生成する(Randomクラスを利用する)。
  2. 「1. 」で生成した数値にボーナスポイント「1」を加算して回復量とする。
  3. 自身のspフィールドに②で算出した回復量をプラスして上書きする。
  
  例)
  自身の残りSPが15、回復量が3(ランダム数値2 + ボーナスポイント1)とでた場合、
  自身のSPを15(15+3)で上書きする。
  
  画面表示用に回復量を本メソッドの処理結果として返す。
◇戻り値
  整数型の回復量
6. 杖のsetter・getter
他クラスから杖を参照するためのメソッド。
杖のsetメソッド, getメソッドを作成する。
7. ステータスメソッドのオーバーライド
メインキャラクター情報(性別・髪型・目の色・HP・SP情報)と、杖の魔力情報を表示するメソッド。
MainCharacterクラスのviewInfoメソッドをオーバーライドする。

◇メソッド名
  元の情報表示メソッドに準じる。
◇引数
  元の情報表示メソッドに準じる。
◇可視範囲
  元の情報表示メソッドに準じる。
◇処理
  メインキャラクターの性別・髪型・目の色・HP・SP・杖の魔力を表示する。
  性別・髪型・目の色・HP・SPに関しては、親クラスの情報表示メソッドを実行する。
  杖の魔力は本メソッドで表示する。
  表示の仕方は親クラスのviewInfoメソッドに合わせる。
◇戻り値
  なし
【②Magicianクラスをテストするためのテストクラス】
考え方
Magicianクラスのメソッドを、他クラスから使用して仕様通りに動作することを確認する。
動作確認のためのプログラムは全てmainメソッドに記載する。

◇インポート
 import xq._05._01.Monster;
◇クラス名
 TestMagician
◇mainメソッドですること
 1. Magicianクラスのオブジェクトを作成する。
 2. ステータスの初期値(性別, 髪型, 目の色, HP, SP, 杖の魔力)を確認する。
 3. 戦闘用にMonsterインスタンスを生成する。
 4. 物理攻撃メソッドのダメージが正しいことを確認する。
 5. 魔法攻撃メソッドのダメージが正しいことを確認する。
 6. めら発動判定の結果、発動できることを確認する。
 7. めらメソッドのダメージが正しいことを確認する。
 8. SPが減っていることを確認する。
 9. SPが5より小さい時のめら発動判定の挙動を確認する。
 10. SP回復メソッドの挙動を確認する。

5-1-3

ArrayListクラスの拡張

この課題では 5-1-2 までのゲーム開発から離れます。 頭を切り替えてください。

Javaは、開発者が少しでも楽にシステムを作成できるように様々なライブラリ(クラス群)を提供しています。
よく使っているものとしては、String が最たる例ではないでしょうか。
何気に使っている String も実は Stringクラスが用意されていて、私達は日常的に Stringクラスを使用しています。
また、4-5以降で出てきた ArrayList や HashSet、HashMap も String同様にクラスが用意されています。
String.class や ArrayList.class といったクラスファイルは一見確認できませんが、
実は存在し、陰から私達を見守り、手助けをしてくれています。

5-1-3 では、そんな『実は存在するArrayListクラス』を継承した「新ArrayListクラス」を作成する。
単に継承するだけでは意味がないので、新ArrayListクラスにメソッドを1つ追加する。
また、動作確認用のテストクラスも作成し、新ArrayListクラスの動作も確認すること。

【新ArrayListクラスの要件】

<クラス名>

任意

<追加するメソッドの仕様>
  • 2つの文字列が渡される。
    文字列の文字数制限は特になし。
  • 渡された2つの文字列を自身が持っているか確認し、次のように処理を分ける。
    • 文字列を持っている⇒自身から削除。
    • 文字列を持っていない⇒自身に追加。
    • 2つの文字列が同一の場合⇒1つの文字列が渡されたとして処理すること。
  • メソッド名は任意とする。
!! ポイント !!
ArrayListクラスを継承するということは、
 ArrayListクラスができることは、全てできる!
ということです。
今一度 ArrayListクラスでできることを概要レベルで整理してみてください。

【テストクラスについて】

作成した新ArrayListクラスを使用し、実際に仕様通りに動くか確認するためのクラスです。
追加したメソッドだけではなく、ArrayListが元々持っているメソッドも実際に使用できるか確認する。
クラス名は任意とする。メソッドは mainメソッドに実装する。

<メソッドの仕様>
  • 新ArrayListクラスの追加したメソッドが仕様通りに動いていることを証明する。
  • 新ArrayListクラスからArrayListクラスのメソッドが使えることを確認する。
【テストパターン】
考え方
・新ArrayListクラスが他クラスと同様に利用できること。
・新ArrayListクラスのメソッドが仕様通りに動作すること。
・新ArrayListクラスからArrayListクラスのメソッドが使えること。

Copyright © Xincor miXell Co., Ltd. All rights reserved

results matching ""

    No results matching ""