ゲーム中のみスコアが入るように訂正しよう Javaコース上級 ミニゲーム開発編Day8「ゲーム終了後にスコアが入らないようにする」

デイトラJava
ハック
ハック

こんにちは、運営者のハックです!

Javaコース上級ミニゲーム開発編Day8の今回はゲーム終了後にスコアが入らないようにする設定に訂正したので、その内容を紹介します。

ゲーム中のみスコアが入るように訂正しよう

今回は一度ゲームコマンド実行をしてしまうと、ゲームが終了しても点数が入ってしまっている状態を直して、ゲームが終了すると点数が入らないように実装しました。作成するにあたり中級編Day23「周囲の敵を消すのを、出現させた敵に限定する」、Day24「ゲーム終了後にスコアが入らないようにする」の回を参考にしました。

実際のコード

実装するにあたり以下のコードを作成及び追加しました。

  • ゲーム終了後には点数が加算されなように、PlayerScoreクラスにgameActiveメソッドを実装
  • gameActiveメソッドにより、ゲーム開始時とゲーム終了後に場合分けした
  • 特定の鉱石以外が採掘された場合は点数が加算されないように実装
//OreMiningCommandクラス 
private void gamePlay(Player player, PlayerScore nowPlayerScore) {
// ゲーム開始時にアクティブに設定
        nowPlayerScore.setGameActive(true);
        Bukkit.getScheduler().runTaskTimer(main, Runnable -> {
            if (nowPlayerScore.getGameTime() <= 0) {
                Runnable.cancel();
// ゲームが終了したので非アクティブに設定
                nowPlayerScore.setGameActive(false);
                player.sendTitle("ゲーム終了!",
                        nowPlayerScore.getPlayerName() + " 合計" + nowPlayerScore.getScore() + "点!お疲れ様でした!",
                        0, 45, 5);
                return;
            }

            nowPlayerScore.setGameTime(nowPlayerScore.getGameTime() - 5);
        }, 0, 5 * 30);
    }


@EventHandler
        public void onBlockBreak(BlockBreakEvent e) {
            // ここにブロックが壊された時の処理を追加
            Player player = e.getPlayer();
        if (Objects.isNull(player) || playerScoreList.isEmpty()) {
            return;
        }

        playerScoreList.stream()
                .filter(p -> p.getPlayerName().equals(player.getName()))
                .findFirst()
                .ifPresent(p -> {
// ゲームが非アクティブなら何もしない
          if (!p.isGameActive()) {
                        return;
                    }
                    Material blockType = e.getBlock().getType();
                    int point = switch (blockType) {
                        case COPPER_ORE -> 5;
                        case COAL_ORE -> 10;
                        case IRON_ORE -> 15;
                        case GOLD_ORE -> 20;
                        case REDSTONE_ORE -> 50;
                        case EMERALD_ORE -> 80;
                        case DIAMOND_ORE -> 200;
                        default -> -1;
                    };

                    if (point != -1) {
                        p.setScore(p.getScore() + point);
                        player.sendMessage("ブロックを壊した!現在のスコアは" + p.getScore() + "点です!");
                    }
                });
    }
//PlayerScoreクラス
import lombok.Getter;
import lombok.Setter;

/**
 * OreMiningのゲームを実行する際のスコア情報を扱うオブジェクト。
 * プレイヤー名、合計点数、日時などの情報を持つ。
 */

@Getter
@Setter

public class PlayerScore {

    private String playerName;
    private int score;
    private int gameTime;
    private boolean gameActive;

    public  PlayerScore(String playerName){
        this.playerName = playerName;
    }

}
ねこ奈
ねこ奈

今回のコードで今までの課題が一気に解消された気がするのにゃ!

モナ
モナ

中級編の課題では「ランダムスポーンされた敵を倒した」場合にのみ点数を加算するという条件で作成していましたが、今回の鉱石採掘ゲームはゲームの特性上、中級のように「特定の場合にのみ点数を加算」させることができません。

なので、「ゲーム起動時」と「それ以外」に分けて場合分けをして、「ゲーム開始フラグが立つと点数が加算される」ようにコードを作成しました。

実装結果

特定の鉱石以外が採掘された場合は点数が加算されず、また、ゲームが終了すると点数が加算されないことを確認しました。

ねこ奈
ねこ奈

ちゃんと鉱石採掘ゲームになっているのにゃ!

モナ
モナ

目標とするゲームの形に一応できたのは嬉しいですね。

まとめ 鉱石採掘ゲームの原型が完成!

今回は特定の鉱石以外が採掘された場合は点数が加算されないように実装し、さらに、一度ゲームコマンド実行をしてしまうと、ゲームが終了しても点数が入ってしまっている状態を直して、ゲームが終了すると点数が入らないように実装することができました。

ハック
ハック

最低限鉱石採掘ゲームとして成り立つところまで実装ができました!

課題に取り組んだ時は完成まで途方もない道のりのように感じましたが、いざ作成すると自分でもここまで実装できたんだと感慨深く感じます。

とは言え、まだデータベースの実装などやることは残っています。

引き続きミニゲーム作成を進めていきます。

以上で今回の学習記録を終えます。

ここまでご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました