こんにちは、運営者のハックです!
Javaコース上級ミニゲーム開発編Day11の今回は前回MyBatisに変更した箇所をリファクタリングしたので、その内容を紹介します。
今回で一応ミニゲーム開発の必要な機能はすべて実装完了です。
最後にDB周りをリファクタリングして完成させよう
今回は前回MyBatisに変更した箇所をリファクタリングしコードを整え、ミニゲームに必要な機能を実装させました!作成するにあたり中級編Day33「ゲームを作りながら学ぶ Java実践 DB⑤(DB周りの処理をリファクタリング)」を参考にしました。
実際のコード
実装するにあたり以下のコードを作成及び追加しました。
- PlayerScoreDataクラスを作成
- データベース関係のコードをPlayerScoreDataクラスに移行
- 警告箇所のコードを改善
//OreMiningCommandクラス
public class OreMiningCommand extends BaseCommand implements Listener {
…
private final PlayerScoreData playerScoreData = new PlayerScoreData();
…
public boolean onExecutePlayerCommand(Player player, Command command, String label, String[] args) {
if(args.length == 1 && (LIST.equals(args[0]))){
//sendPlayerListメソッドの抽出を行った
sendPlayerList(player);
return false;
}
/**
* 現在登録されているスコアの一覧をメッセージで送る。
*
* @param player プレイヤー
*/
private void sendPlayerList(Player player) {
List<PlayerScore> playerScoreList = playerScoreData.selectList();
for(PlayerScore playerScore:playerScoreList){
player.sendMessage(playerScore.getId() + " | "
+ playerScore.getPlayerName()+ " | "
+ playerScore.getScore() + " | "
+ playerScore.getRegisteredAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
private void gamePlay(Player player, ExecutingPlayer nowExecutingPlayer) {
…
playerScoreData.insert(
new PlayerScore(nowExecutingPlayer.getPlayerName()
, nowExecutingPlayer.getScore()));
return;
}
//PlayerScoreDataクラス
private final SqlSessionFactory sqlSessionFactory;
private final PlayerScoreMapper mapper;
public PlayerScoreData(){
try {
InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(true);
this.mapper = session.getMapper(PlayerScoreMapper.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* プレイヤースコアテーブルから一覧でスコア情報を取得する。
*
* @return スコア引数
*/
public List<PlayerScore> selectList() {
return mapper.selectList();
}
/**
* プレイヤースコアテーブルにスコア情報を登録する。
* @param playerScore プレイヤースコア
*/
public void insert(PlayerScore playerScore){
mapper.insert(playerScore);
}
}
気持ちコードがスッキリした気がするのにゃ!
今回でミニゲームとして必要な機能はすべて実装できました。
実装結果
リファクタリング後もコマンドがが正常に作動し、また、コマンド入力によりリストが問題なく表示されることを確認しました。
ミニゲームの要件を満たしたか最終チェック
最後に鉱石採掘ミニゲームの課題の要件を満たしたかどうかを確認します。
- gameStartコマンドを実行すると「鉱石採掘によってスコアが加算されるモード」に変更されること(コマンド名はgameStartでなくても問題ありません!モードが変更されたことがわかるようにしておきましょう)
→「oremining」コマンド入力により、鉱石採掘のミニゲームがスタートするように実装。また、ゲーム終了後に点数が加算されないように調整済。 - 鉱石の種類によりスコアを設定すること(Minecraftの鉱石種別にスコアを設定しておきましょう。鉱石毎のスコアは自由に設定してください!)
→鉱石の種類に応じて点数が変更されるように実装。鉱石以外のブロックを破壊しても点数が加算されないし、表示もされないようにも調整済。 - 採掘した時点でスコアを加算すること(鉱石を「採掘」した時点でスコアを加算してください!鉱石の取得によってスコアは加算されません)
→鉱石が採掘(鉱石ブロックが破壊)された時点でスコアが加算されるように実装。 - スコアはDBに登録すること
→スコアは「ore_player_score」というデータベースに自動で保存されるように実装。 - スコアはリストとして確認できるよう設定すること
→コマンドを実行するとマインクラフトのゲーム上でスコアを確認できるように実装。 - 制限時間を設定すること
→制限時間を経過するとゲームモードが解除され、終了時にスコアが表示されるように実装 - マルチプレイの考慮は不要
→一応マルチプレイに対応するように実装
課題の機能要件を全部実装できたのにゃ!
これで卒業課題が完成したのにゃ、デイトラメンターにレビューをお願いするのにゃ?
う~ん…一応これでも提出はできるのですが…
まだ提出期限まで余裕があるため、ミニゲームとしての完成度を高めていこうと考えています。
具体的には以下の点について考える予定です。
- ゲームバランスの微調整
- 課題のプラスアルファに挑戦するかどうか(「スタート地点を強制する」又は「鉱石の取得数により追加スコアを付与する」)
- その他独自要素を追加するかどうか
まとめ 課題の機能要件は完成!後はプラスアルファ
今回は前回MyBatisに変更した箇所をリファクタリングしコードを整え、課題で提示されているミニゲームに必要な機能要件をすべて実装させました!
課題の要件は満たしましたが、現時点で「ミニゲームとして面白いか」というと正直微妙です。
デイトラサポートがあと2週間程度で終了してしまうので、残された時間を最大限に利用してミニゲームに追加要素を実装していこうと考えています。
挑戦した結果実装は無理だった場合は、今回のコードを提出します。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント