概要
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のバージョン[…]
作成資材
最終的に作成した資材は以下の構成となる。
ファイル詳細
各ファイルについて説明する。
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連携するようになっているため
eclipseとGitの連携
作成したeclipseのSpring BootプロジェクトをGit連携する。
以上でリモートリポジトリにプッシュまで完了となる。