【Spring Boot】じゃんけんアプリを作成してGit Hub連携する

概要

SpringBootフレームワークを使用して簡易じゃんけんアプリを作成してみた。
また、作成したアプリをGit Hubに連携したのでその方法についてまとめた。

 

アプリ概要

コンソール上で対話形式による選択でゲームを行う。

コンソール


★じゃんけん勝負★
以下の中から選択してください。
----------
1:グー
2:チョキ
3:パー
0:終了

選択した結果によってレスポンスが返却される。

コンソール


1
★じゃんけん結果★
----------
あなたの手:グー
CPUの手:パー
結果:あなたの負けです。

想定範囲外の数値が入力されたときや、数値以外が入力されたとき。

コンソール


5
0~3の範囲で入力してください。

a
0~3の数字を入力してください。

 

アプリの作成

Spring Bootプロジェクトの作成

Spring initializrを使用してプロジェクトを作成する。
Dependenciesは特に何も指定せず作成した。

 

eclipseにインポート

資材をeclipseにインポートしてアプリを作成する。
インポートする方法を以下を参照。

あわせて読みたい

概要 独自フレームワークの現場で長らくSpring Bootを触れておらず、ちゃんとしたJava開発も行っていないため、初心にかえって環境構築とSpring Bootで「Hello World」を表示させてみた。 ※Javaのバージョン[…]

【Spring Boot】環境を構築して「Hello World」する方法_アイキャッチ

 

作成資材

最終的に作成した資材は以下の構成となる。

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_ファイル構成
▲作成するファイル構成

 

ファイル詳細

各ファイルについて説明する。

Demo02Application.java


package com.example.demo02;

import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.demo02.app.GameProvider;

@SpringBootApplication
public class Demo02Application implements CommandLineRunner { // ①

    @Autowired // ②
    private GameProvider gameProvider;

    public static void main(String[] args) {
        SpringApplication.run(Demo02Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception { // ③
        while (true) {
            // ゲーム案内
            System.out.println("★じゃんけん勝負★\n"
                    + "以下の中から選択してください。\n"
                    + "----------\n"
                    + "1:グー\n"
                    + "2:チョキ\n"
                    + "3:パー\n"
                    + "0:終了\n");

            try {
                // プレイヤー選択
                var sc = new Scanner(System.in); // ④
                int playerChoice = sc.nextInt();
                
                // 入力チェック
                if (!Consts.JANKEN_INPUT_RANGE.contains(playerChoice)) {
                    System.out.println("0~3の範囲で入力してください。\n");
                    continue;
                }
                
                // 終了判定
                if (playerChoice == Consts.GAME_END) {
                    System.out.println("ゲーム終了");
                    break;
                }
                
                
                // COMの手(1~3をランダム生成)
                int comChoice = new Random().nextInt(1, 4); 

                // じゃんけん開始
                var result = gameProvider.play(playerChoice, comChoice); // ⑤

                // じゃんけん結果;
                System.out.println("★じゃんけん結果★"
                        + "\n----------"
                        + "\nあなたの手:" + Consts.JANKEN_INFO.get(playerChoice)
                        + "\nCPUの手:" + Consts.JANKEN_INFO.get(comChoice)
                        + "\n結果:" + result + "\n");

            } catch (InputMismatchException e) { // ⑥
                System.out.println("0~3の数字を入力してください。\n");
                
            }
        }

    }

}

 

public class Demo02Application implements CommandLineRunner {

CommandLineRunnerインターフェースを実装することで、当クラスでDIした機能を使用できる。

具体的には、「SpringApplication.run(Demo02Application.class, args)」が実行されるSpring Bootアプリケーションが起動してDIコンテナにBeanが登録される。
Bean登録されることでDI(DIコンテナがインスタンスを付与)することができる。

 

@Autowired
private GameProvider gameProvider;

上記のアノテーションにより、DIコンテナが管理しているBeanをGameProviderに付与できる。

 

@Override
public void run(String... args) throws Exception {

①のCommandLineRunnerを実装することでオーバーライドする必要があるメソッド。
Spring Bootアプリケーションが起動してDIコンテナにBeanが登録された後に呼ばれるメソッド。

 

var sc = new Scanner(System.in);

アプリケーションを起動した際に、コンソール上からキーボード入力を受け付ける記述。

 

// じゃんけん開始
var result = gameProvider.play(playerChoice, comChoice);

DIしたインスタンスからじゃんけん結果を取得する。
じゃんけんの手はプレイヤーが選択した数値と、ランダム生成した数値になる。

 

} catch (InputMismatchException e) {

「new Scanner(System.in)」でコンソール入力させたあと、「sc.nextInt()」で整数を取得する。

しかし、sc.nextInt()で読み取った入力値が整数以外の場合、InputMismatchExceptionがスローされる
そのため、ここでキャッチして数字を入力するようアナウンスしている。

GameProvider.java


package com.example.demo02.app;

/**
 * ゲーム機能の提供
 * 
 */
public interface GameProvider {
    String play(int playerChoice, int comChoice);
}

じゃんけんクラスの抽象化メソッドを記述している。
interfaceのため、public abstractが隠されている。

JankenGame.java


package com.example.demo02.app;

import org.springframework.stereotype.Component;

import com.example.demo02.Consts;

/**
 * じゃんけんゲーム
 */
@Component // ①
public class JankenGame implements GameProvider {

    /**
     * じゃんけんする
     */
    @Override
    public String play(int playerChoice, int comChoice) {
        return judgeJanken(playerChoice, comChoice);
    }

    /**
     * じゃんけん結果を判定する
     * 
     * @param player プレイヤーの手
     * @param com    COMの手
     * @return 結果
     */
    private String judgeJanken(int player, int com) {
        var result = "";
        if (player == com) {
            result = "あいこです。";
        } else if ((player == Consts.JANKEN_GU && com == Consts.JANKEN_CHOKI)
                || (player == Consts.JANKEN_CHOKI && com == Consts.JANKEN_PAR)
                || (player == Consts.JANKEN_PAR && com == Consts.JANKEN_GU)) {
            result = "あなたの勝ちです。";
        } else {
            result = "あなたの負けです。";
        }

        return result;
    }

}

 

@Component
public class JankenGame implements GameProvider {

上記のアノテーションをつけることで、DIコンテナにBean管理させることができる。
Beanとは、DIコンテナが管理しているオブジェクト(newしたインスタンス)というイメージ。
Bean管理しているオブジェクトから、DIすることができる。

例えば、以下のようなアノテーションを付与すると、SpringBoot側でDIコンテナに自動でBean管理してくれる。

アノテーション 説明
@Component 一般的なコンポートネント。特定の役割をもたないクラス。
@Service サービス層のクラス。業務処理を行うクラスに付与する。
@Repository データアクセス層のクラス。DB操作を行うクラスに付与する。
@Controller(またはRestController) プレゼンテーション層のクラス。Webリクエスト処理を行うクラスに付与する。

 

Consts.java


package com.example.demo02;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 定数クラス
 */
public class Consts {
    /** じゃんけんグー */
    public static final int JANKEN_GU = 1;
    /** じゃんけんチョキ */
    public static final int JANKEN_CHOKI = 2;
    /** じゃんけんパー */
    public static final int JANKEN_PAR = 3;
    /** じゃんけん情報 */
    public static final Map<Integer, String> JANKEN_INFO = Map.of(JANKEN_GU, "グー", JANKEN_CHOKI, "チョキ", JANKEN_PAR,
            "パー");
    /** ゲーム終了 */
    public static final int GAME_END = 0;
    /** じゃんけん選択範囲 */
    public static final List JANKEN_INPUT_RANGE = Arrays.asList(0, 1, 2, 3);
}

定数をまとめたファイル。

アプリ内容はここまでとなる。

 

Git Hub連携

ここからは作成したプロジェクトをGit Hubに連携する方法について紹介する。

前提

・Git Hub側にて連携先のリポジトリを作成していること

・パーソナルアクセストークンを発行していること
※ログインパスワードによる認証ではなくパーソナルアクセストークンを利用してGit連携するようになっているため

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_パーソナルトークンの作成
▲パーソナルアクセストークンはメモしておくこと

 

eclipseとGitの連携

作成したeclipseのSpring BootプロジェクトをGit連携する。

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_プロジェクトの共用
▲プロジェクト右クリック>チーム>プロジェクトの共用

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_Gitの選択
▲Gitを選択して次へ

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_リポジトリの作成
▲リポジトリーの作成ボタンを押下

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_プロジェクトの共用完了
▲完了ボタンを押下

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_コミットする
▲プロジェクト右クリック>チーム>コミット

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_コミットコメント追加
▲コミットプッシュする

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_プッシュ
▲パスワードにはパーソナルトークンを使用

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_ブランチ変更
▲Git Hubはデフォルトでmainブランチとなっている

 

【Spring_Boot】_Create_Rock_Paper_Scissors_App_and_Integrate_with_GitHub_プッシュ完了
▲プッシュ成功 ※コメントが違うが気にしないように

 

以上でリモートリポジトリにプッシュまで完了となる。

スポンサーリンク