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

package xq._05._01; /** * 5-1, 2, 3 * 0次職「MainCharacter」を表すクラスです。 * * @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; } /** * 性別コードに対応する性別(文字列)を返します。 * * @param code 性別コード * @return 男性 or 女性 */ private String getGender(String code) { return GenderMap.getValue(code); } /** * 髪型コードに対応する髪型(文字列)を返します。 * * @param code 髪型コード * @return ロングヘアー or セミロングヘアー or ショートヘアー */ private String getHairStyle(String code) { return HairStyleMap.getValue(code); } /** * 目の色コードに対応する目の色(文字列)を返します。 * * @param code 目の色コード * @return 黒 or 銀 */ private String getEyeColor(String code) { return EyeColorMap.getValue(code); } /** * 性別コードを返します。 * * @return 1:男性 or 2:女性 */ public String getGenderCode() { return this.genderCode; } /** * 性別コードを設定します。 * * @param genderCode 性別コード */ public void setGenderCode(String genderCode) { this.genderCode = genderCode; } /** * 髪型コードを返します。 * * @return 1:ロングヘアー or 2:セミロングヘアー or 3:ショートヘアー */ public String getHairStyleCode() { return this.hairStyleCode; } /** * 髪型コードを設定します。 * * @param hairStyleCode 髪型コード */ public void setHairStyleCode(String hairStyleCode) { this.hairStyleCode = hairStyleCode; } /** * 目の色コードを返します。 * * @return 1:黒 or 2:銀 */ public String getEyeColorCode() { return this.eyeColorCode; } /** * 目の色コードを設定します。 * * @param eyeColorCode 目の色コード */ public void setEyeColorCode(String eyeColorCode) { this.eyeColorCode = eyeColorCode; } /** * ステータスを表示します。 * */ public void viewInfo() { System.out.println("性別:" + this.getGender(this.genderCode)); System.out.println("髪型:" + this.getHairStyle(this.hairStyleCode)); System.out.println("目の色:" + this.getEyeColor(this.eyeColorCode)); System.out.println("HP:" + this.hp); System.out.println("SP:" + this.sp); } }
本問題で作成するクラス

本問題で作成するクラスは以下の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

package xq._05._01; /** * 5-1 * 1次職「Fighter」を表すクラスです。 * * @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; } /** * 情報を表示します。 * キャラクター情報、HP・SPに加えて、盾の守備力を表示します。 * */ public void viewInfo() { super.viewInfo(); System.out.println("盾の守備力:" + this.shield); } }
【Fighterクラスのテストクラス】

TestFighter.java

package xq._05._01; /** * 5-1, 3 * 1次職「Fighter」クラスの動作確認用テストクラスです。 * * @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("HPの期待値:100"); System.out.println("HPの結果:" + fighter.getHp()); System.out.println("期待値=結果:" + (fighter.getHp() == 100)); System.out.println("SPの期待値:30"); 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("残SPの期待値:20"); System.out.println("残SPの結果:" + fighter.getSp()); System.out.println("期待値=結果:" + (fighter.getSp() == 20)); //強打発動確認メソッドの動作確認(false) //SPを0にして発動できない状態にする System.out.println("SPが10未満の時、isExecutiveBashメソッドの実行結果を確認する"); System.out.println("SPを0にします"); fighter.setSp(0); //結果、falseなら正 System.out.println("バッシュが発動するかの期待値:発動しない(false)"); System.out.println("バッシュの実行結果:" + fighter.isExecutiveBash()); System.out.println("期待値=結果:" + (fighter.isExecutiveBash() == false)); } }
【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 ""