時間制限の設定は難しい Javaコース上級 ミニゲーム開発編Day5「マルチプレイ対応・時間制限の実装」

デイトラJava
ハック
ハック

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

Javaコース上級ミニゲーム開発編Day5の今回はマルチプレイの対応と、ミニゲームの時間制限の設定を追加をしたので、その内容を紹介します。

マルチプレイ対応をしよう

今回は最初にマルチプレイ対応の実装を行いました。作成するにあたり中級編Day16「マルチプレイ対応」の回を参考にしました。

実際のコード

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

  • PlayerScoreクラス追加
  • 新規のプレイヤー情報をリストに追加するメソッドを抽出
//OreMiningCommandクラス
 @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(sender instanceof Player player){
            if(playerScoreList.isEmpty()){
                addNewPlayer(player);
            } else {
                for(PlayerScore playerScore : playerScoreList){
                    if(!playerScore.getPlayerName().equals(player.getName())){
                        addNewPlayer(player);
                    }
                }
            }
       InitStatus(player);
        }

 @EventHandler
        public void onBlockBreak(BlockBreakEvent e) {
            // ここにブロックが壊された時の処理を追加
            Player player = e.getPlayer();
        if (Objects.isNull(player) || playerScoreList.isEmpty()) {
            return;
        }
        for(PlayerScore playerScore : playerScoreList){
            if(playerScore.getPlayerName().equals(player.getName())){
                playerScore.setScore(playerScore.getScore()+10);
                player.sendMessage("ブロックを壊した!現在のスコアは" + playerScore.getScore() + "点です!");
            }
        }
    }

   /**
     * 新規のプレイヤー情報をリストに追加します。
     *
     * @param player コマンドを実行したプレイヤー
     */

    private void addNewPlayer(Player player) {
        PlayerScore newPlayer = new PlayerScore();
        newPlayer.setPlayerName(player.getName());
        playerScoreList.add(newPlayer);
    }
//PlayerScoreクラス
package plugin.oremining.data;
import lombok.Getter;
import lombok.Setter;
/**
 * OreMiningのゲームを実行する際のスコア情報を扱うオブジェクト。
 * プレイヤー名、合計点数、日時などの情報を持つ。
 */

@Getter
@Setter

public class PlayerScore {

    private String playerName;
    private int score;

}
モナ
モナ

作成したコードは中級編で作成したコードとほぼ同じなので、特に解説することはありません。

中級編の同じくLombokを使用して「@Getter」「@Setter」のようにアノテーションを付与するだけでゲッターやセッター等のメソッドを自動生成しています。

ねこ奈
ねこ奈

ちなみにLombokはIntelliJでプラグインを別途インストールしないと使えないから、注意するのにゃ!

実行結果

画像は作成したコードを実行した結果です。マルチプレイ対応実装しても、コマンド入力によりきちんと点数が加算されていることを確認しました。

時間制限を設定しよう

次に時間制限の実装を行いました。作成するにあたり中級編Day17「時間制限」の回を参考にしました。

実際のコード

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

//OreMiningCommandクラス
 public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
…
      gameTime = 20;
             InitStatus(player);
            Bukkit.getScheduler().runTaskTimer(main, Runnable ->{
                if(gameTime <= 0){
                    Runnable.cancel();
                    player.sendMessage("ゲーム終了!");
                    return ;
                }
                gameTime -= 1;
            },0,5 * 20);

            return true;
        }
        return false;
    }
モナ
モナ

こちらも作成したコードは中級編で作成したコードとほぼ同じですが、中級編のコードは「ゲームタイムが0になるまで敵のランダム生成を行う」という条件が入っています。

実行結果

一定時間が経過すると「ゲーム終了!」と表示されるように実装できました。

モナ
モナ

しかし、今の段階ですとゲーム終了と表示されても、相変わらずブロック破壊により点数が入ります。

今後、ゲーム実行時のみ点数が入るようにコードを訂正しないといけません。

ねこ奈
ねこ奈

時間制限を設けるって簡単なようで難しいのにゃ。

まとめ  まだまだ訂正箇所だらけ

今回は「マルチプレイ対応の実装」と「制限時間の実装」を行いました。

ハック
ハック

今後は「ゲーム実行時にのみ点数が加算される」「鉱石の種類に応じて点数が加算される」など機能を随時訂正していきます。

中級編とは使用が異なるため、参考にできる部分は最大限活用し、オリジナルの部分は色々と調べて実装していきます。

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

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

コメント

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