Java テキストRPG(戦闘シーンのみ)を再作成する2~設計からやり直す~

前回作成したものは、ちゃんと設計していませんでした。とうかアイディアだけが先走り、収拾がつかなくなった次第です。

今回作成するのもの

TesxtRPGをだんだんレベルアップしていく方向で作成しようと考えています。イメージとしては市価のような感じでレベルアップしていこうと考えています。

Lv1: 戦闘シーンのみ
Lv2: レベルアップ・ステータスの表示を追加
Lv3: タイトル表示~ストーリー(シーン)の表示を追加

  1. タイトル表示
  2. ストーリーを開始(シーン切り替えを実装)
  3. 登場する敵はラスボスのみ
    Lv4: ミニストーリーをRPGにする。
  4. イベント発生から、シーンの切り替えの実装
  5. 装備の変更を実装する
    Lv5: ミニストーリーをRPGにする2
  6. 一つの冒険を実装する、ゴールは隣町の近所に住む魔王を倒す
  7. エンディングを実装する

そして、今回実装するのはLv1です。
ここでは、戦闘シーンに必要な登場人物(モンスターを含む)を実装することに重きを置きます。

成果物

<Eclipseでの実行>

<コマンドプロンプトでの実行>

Lv1:TextRpgゲーム

まずは、戦闘シーンをイメージして、フローチャートを作成します。

<作成したフローチャート>

実際には、テストケースを作成しながらこのフローチャートを作成しました。

大まかに、下のように行う処理のイメージを図にする感じです。

フローチャート

ゲームの開始から、終了までの流れを図にしたものです。

作成するときに考えるのは「どのように、ゲームを進めるか?」です。具体的には以下のように考えました。

フローチャートを作る

<ステップ1>
テキストRPG(コンソール表示)で戦闘シーンをどのように進めるか?
まず、頭に浮かんだのは某有名ゲームソフトです。
戦闘シーンの開始時には「XXXが現れた!」と表示されます。ならばこちらもそのように。。。
そのほか、戦闘シーンのイメージはこのゲームソフトです。
そして、初期表示を行い、入力受付。。。と処理が続きます。

<ステップ2>
入力後どのような動きを行うか?今回は戦闘シーンのみなので例外的に「bye」と入力したらアプリケーションを終了するように実装します。
他は、入力⇒画面の更新(HPが減ったり、モンスターがダメージを受けたり)を行います。

クラス図を作る

実際に作成したクラス図は下のものです。赤くなっているものは今回使用しないもの(クラス)です。

フローチャートと同様にクラス図も作成します。
フローチャートを参考に、登場する人物(クラス)を用意します。
今回のプログラム起動方法としては、LWJGLを参考にしてやりました。つまり、①メインメソッドのクラス(GameMain)から②今回作成するゲームを実行するクラス(TextRpgGameEngin)を呼び出し実行します。
ここでのポイントとしては、②のクラスはThreadクラスを継承しマルチすれっと処理に対応できるようにすることです。

そうすることで、ゲーム(アプリケーション)を起動するスレッドと、例えばDBサーバーを起動するスレッドをマルチスレッドで起動したり、ほかにもアイディアがあればそのような実装ができます。

テストケースから作成する

フローチャートとクラス図からそれぞれのクラスに対するテストケースを作成していきます。

テストケースを実行することを考えると、最終的に呼び出されるクラス、「XXXUtilsクラス」がテストケースを実装するのに楽だろうと思われるので、ここら辺から攻めていきました。

フローチャートでも初めにある『「XXXが現れた!」を表示する』という処理から実装しました。あとはフローチャートの処理順にテストケースを作っていきました。初めからフローチャートの順序か。。。

作成したもの

Githubにアップロード(PUSH)しています。

Lv2の実装前に

現状で、実装するのに調査が必要だったものや、てこずったものに関して記載したいと思います。

JUnitでのコンソール出力

今回作成したゲーム(アプリ)は画面表示と言いながらコンソール出力になります。なので、テスト時には出力内容を確認する必要があり、出力先を変更し確認するために取得する必要がありました。

<解決策>
具体的には下のコードになるのですが、手順としては以下のようになります。

  1. 標準出力の出力先を変更する。
  2. 出力した文字列を取得する。

列挙するとシンプルな感じですが、実装もシンプルでした。
使用したの部品(Java API)配下の者です。

  • org.junit.platform.commons.logging.Logger
  • java.io.ByteArrayOutputStream
  • java.io.PrintStream

上記の部品を使用して、標準出力をPrintStreameに変更、PrintStreamにはByteArrayOutputStreamを渡して作成=出力先がByteArrayOutputStreamになる。

テスト実行時の出力する文言に関しては、org.junit.platform.commons.logging.Loggerへ出力しました。

/** ログ出力 */
private static final Logger LOG = LoggerFactory.getLogger(FirstJankenMainTest.class);
/** 標準出力確認 */
private static final ByteArrayOutputStream console = new ByteArrayOutputStream();

テストクラスの起動ですが、これは@BeforeClassを使用しました。

  1. テストクラスの起動時にテスト対象クラスをインスタンス化
    @BeforeClass
    public static void initClass() {
    target = new ConsoleUtils();
    // 標準出力の出力先を変更する
    System.setOut(new PrintStream(console));
    }
  2. 各テストケースの実行前に出力した文字列をリセット
    /**
    * テストの準備
    */
    @Before
    public void init() {
    // フィールド変数
    console.reset();
    }
    
  3. テストを実行した結果をassertEqualsで比較

    /**
    * ステータス表示のテスト:2桁
    */
    @Test
    public void testPrintBattleStatus1() {
    // プレーヤーは一人
    Player player = new Player("test");
    // 名前の文字数は、全角は4文字、半角8文字まで
    player.setLevel(10);
    player.setHP(20);
    player.setMP(10);
    target.printBattleStatus(player);
    LOG.info(() -> SEP + console.toString());
    
    String expect = "**** test ****\r\n" +
            "  Lv: 10     *\r\n" +
            "  HP: 20     *\r\n" +
            "  MP: 10     *\r\n" +
            "**************" + SEP + SEP;
    assertEquals(expect, console.toString());
    }
    

こんな風に実装しました。

コマンドの取得

Playerクラスで実装したメソッドの中に「たたかう」などのコマンド実行時に起動するメソッドがあります。そして、コンストラクタなど、コマンド実行以外で使用するメソッドも定義していあります。
「はて?どうやってコマンド用のメソッドのみを取得しようか?」と考えたところ「アノテーションがあ~るじゃないですか!」とひらめきました。

早速実装しました。参考サイトはこちらです。

  1. 自作のアノテーションを作成。
    /**
    * 行動を表すアノテーション
    * 。
    * @author 実装者の名前
    */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Command {
    /** 表示順 */
    public int index();
    /** 実行選択肢 */
    public String commandName();
    }
  2. コマンド用のメソッドにアノテーションをつける
    /**
    * 攻撃コマンド。
    *
    * @return 武器の攻撃力
    */
    @Command(index=1, commandName="たたかう")
    public int attack() {
    return mainWepon.getOffence();
    }
    
  3. アノテーションをつけたメソッドを取得。
    ※コンソール出力するめそっどですが、取得した内容を出力しています。

    /**
    * プレーヤーの行動選択肢を一覧表示する。
    *
    * @param player
    * @return コマンドマップ(indexでソート済み)
    */
    public Map<Integer, String> printCommandList(Player player) {
    Method[] mess = player.getClass().getDeclaredMethods();
    // 並び替え機能付きのMAP
    Map<Integer, String> commandMap = new TreeMap<>();
    for(Method mes : mess) {
        Command ano = mes.getAnnotation(Command.class);
        if (ano != null) {
            // マップにインデックス(順番)とコマンド名を登録
            commandMap.put(ano.index(), ano.commandName());
        }
    }
    // 並び替え後に表示
    commandMap.forEach((Integer index, String value) -> {
        System.out.println(index + ": " + value);
    });
    return commandMap;
    }

こんな感じで実装しました。

コンソールのクリア

[こちらの記事にも記載]()しましたが、以下のコードでコマンドの実行がでるようです。

Rumtime.getRuntime().exec(コマンド);

しかし、IOExceptionが出力され。。。調べてみるとWindowsでは下のようなコードで実行するとよいみたいです。

new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();

Eclipseで実行してみたところ、文字化けた文字が出力されるだけで、意味なかったのですが、JARファイルを作成し、コマンドプロンプトで実行してみたところ問題なく動きました。

今後は、Lv2の実装を進めていきたいと思います。

でわでわ。。。

関連ページ一覧

EclipseセットアップWindows版

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜

Java テキストRPG(戦闘シーンのみ)を再作成する~LWJGLを参考に作り直す~

事の発端について

前回作成した、テキストRPG(戦闘シーンのみ)をJavaFXへと移植しようかと考えてたのですが、如何せん、絵とか必要になるだろうと思い保留していました。

しかし、ゲームブックの要領で、ストーリーを進めるのであれば、ずいぶんと楽しくプレーできそうだと思いました。

そんなわけで、その方向でプログラムを組みなおします。

ここで肝になるのが「ゲームループ」という言葉と実装内容です。ループ処理をするのはよいのですが、参考にするソースを見てみるとマルチスレッド使ったりしているので、ちょっと不安になった次第です。。。

LWJGLのゲームループを解析

以前作成した、LWJGLのプログラムサンプルコードを参考に作成したのですが「GameEngine」と「GameLogic」という二つのクラスを使用してうまく作られていました。

登場人物(クラス)

  • Mainクラス
  • DummyGameクラス
  • GameEnginクラス
  • Windowクラス(今回は無視する)
  • Renderクラス(今回は無視する)

今回作成するゲームは、コンソールゲームなのでWindowとか3Dモデルのレンダリングは行わないので今回は無視します。

上記のクラスの関係性を解析

Mainクラス、下のソースを見てみると以下のクラスを呼び出しています。

  1. IGameLogic
  2. GameEngeine

IGameLogicインターフェースはGameLogicに当たる処理を実装したクラス=DummyGameクラスです。
GameEngineはそのままですね。。。

ポイントは、GameEngineクラスに、DummyGameを渡して、インスタンスを生成しているところです。
つまり、DummyGameがGameEngineクラスで使用することができるということです。

DummyGameをGameEngineに渡してしまえば、あとはGameEngineクラスで自由に処理ができます。

なるほど、GameEngineクラスはいちいち改修してなくてもよさそうです。

ということは。。。

今回の実装するテキストRPG(戦闘シーンのみ)は、

  • メインメソッドを持つMainクラス
  • IGameLogicに相当するインターフェースを実装したTextRpgGameクラス
  • GameEngineクラス

上のようなクラスを使用して実装するのがよいと思いましたが、GameEngineクラスは割愛してMainクラスに入れ込んでしまおうと思います。
理由は、いろんなバリエーションでGameEngineクラスを使用するつもりはないので、このようにします。

もし、必要があればその時に追加実装しようと考えています。

テキストRPGの記事

  1. Java ミニゲーム ソース付き 〜RPGの戦闘シーンを作るin Console〜
  2. Java ミニゲーム ソース付き 〜RPGの戦闘シーンを作る2 in Console〜
  3. Java ミニゲーム ソース付き 〜ここまでのまとめ〜
  4. Java ミニゲーム ソース付き 〜コンソールアプリからGUIアプリへ〜
    ここでアイディアに詰まる。。。

TextRpg前回作成したもの1

TextRpg前回作成したもの2
文字をゆっくり表示する実装を行ったものです。

参考にしたソース

Mainクラスのソース
public class Main {

    public static void main(String[] args) {
        try {
            boolean vSync = true;
            IGameLogic gameLogic = new DummyGame();
            GameEngine gameEng = new GameEngine("GAME", 600, 480, vSync, gameLogic);
            gameEng.run();
        } catch (Exception excp) {
            excp.printStackTrace();
            System.exit(-1);
        }
    }
}
DummyGameクラスのソース
public class DummyGame implements IGameLogic {

    private static final float MOUSE_SENSITIVITY = 0.2f;

    private final Vector3f cameraInc;

    private final Renderer renderer;

    private final Camera camera;

    private GameItem[] gameItems;

    private Vector3f ambientLight;

    private PointLight pointLight;

    private static final float CAMERA_POS_STEP = 0.05f;

    public DummyGame() {
        renderer = new Renderer();
        camera = new Camera();
        cameraInc = new Vector3f(0.0f, 0.0f, 0.0f);
    }

    @Override
    public void init(Window window) throws Exception {
        renderer.init(window);

        float reflectance = 1f;
        //Mesh mesh = OBJLoader.loadMesh("/models/bunny.obj");
        //Material material = new Material(new Vector3f(0.2f, 0.5f, 0.5f), reflectance);

        Mesh mesh = OBJLoader.loadMesh("/models/cube.obj");
        Texture texture = new Texture("textures/grassblock.png");
        Material material = new Material(texture, reflectance);

        mesh.setMaterial(material);
        GameItem gameItem = new GameItem(mesh);
        gameItem.setScale(0.5f);
        gameItem.setPosition(0, 0, -2);
        gameItems = new GameItem[]{gameItem};

        ambientLight = new Vector3f(0.3f, 0.3f, 0.3f);
        Vector3f lightColour = new Vector3f(1, 1, 1);
        Vector3f lightPosition = new Vector3f(0, 0, 1);
        float lightIntensity = 1.0f;
        pointLight = new PointLight(lightColour, lightPosition, lightIntensity);
        PointLight.Attenuation att = new PointLight.Attenuation(0.0f, 0.0f, 1.0f);
        pointLight.setAttenuation(att);
    }

    @Override
    public void input(Window window, MouseInput mouseInput) {
        cameraInc.set(0, 0, 0);
        if (window.isKeyPressed(GLFW_KEY_W)) {
            cameraInc.z = -1;
        } else if (window.isKeyPressed(GLFW_KEY_S)) {
            cameraInc.z = 1;
        }
        if (window.isKeyPressed(GLFW_KEY_A)) {
            cameraInc.x = -1;
        } else if (window.isKeyPressed(GLFW_KEY_D)) {
            cameraInc.x = 1;
        }
        if (window.isKeyPressed(GLFW_KEY_Z)) {
            cameraInc.y = -1;
        } else if (window.isKeyPressed(GLFW_KEY_X)) {
            cameraInc.y = 1;
        }
        float lightPos = pointLight.getPosition().z;
        if (window.isKeyPressed(GLFW_KEY_N)) {
            this.pointLight.getPosition().z = lightPos + 0.1f;
        } else if (window.isKeyPressed(GLFW_KEY_M)) {
            this.pointLight.getPosition().z = lightPos - 0.1f;
        }
    }

    @Override
    public void update(float interval, MouseInput mouseInput) {
        // Update camera position
        camera.movePosition(cameraInc.x * CAMERA_POS_STEP, cameraInc.y * CAMERA_POS_STEP, cameraInc.z * CAMERA_POS_STEP);

        // Update camera based on mouse            
        if (mouseInput.isRightButtonPressed()) {
            Vector2f rotVec = mouseInput.getDisplVec();
            camera.moveRotation(rotVec.x * MOUSE_SENSITIVITY, rotVec.y * MOUSE_SENSITIVITY, 0);
        }
    }

    @Override
    public void render(Window window) {
        renderer.render(window, camera, gameItems, ambientLight, pointLight);
    }

    @Override
    public void cleanup() {
        renderer.cleanup();
        for (GameItem gameItem : gameItems) {
            gameItem.getMesh().cleanUp();
        }
    }

}

GameEngineクラスのソース

public class GameEngine implements Runnable {

    public static final int TARGET_FPS = 75;

    public static final int TARGET_UPS = 30;

    private final Window window;

    private final Timer timer;

    private final IGameLogic gameLogic;

    private final MouseInput mouseInput;

    public GameEngine(String windowTitle, int width, int height, boolean vSync, IGameLogic gameLogic) throws Exception {
        window = new Window(windowTitle, width, height, vSync);
        mouseInput = new MouseInput();
        this.gameLogic = gameLogic;
        timer = new Timer();
    }

    @Override
    public void run() {
        try {
            init();
            gameLoop();
        } catch (Exception excp) {
            excp.printStackTrace();
        } finally {
            cleanup();
        }
    }

    protected void init() throws Exception {
        window.init();
        timer.init();
        mouseInput.init(window);
        gameLogic.init(window);
    }

    protected void gameLoop() {
        float elapsedTime;
        float accumulator = 0f;
        float interval = 1f / TARGET_UPS;

        boolean running = true;
        while (running && !window.windowShouldClose()) {
            elapsedTime = timer.getElapsedTime();
            accumulator += elapsedTime;

            input();

            while (accumulator >= interval) {
                update(interval);
                accumulator -= interval;
            }

            render();

            if ( !window.isvSync() ) {
                sync();
            }
        }
    }

    protected void cleanup() {
        gameLogic.cleanup();
    }

    private void sync() {
        float loopSlot = 1f / TARGET_FPS;
        double endTime = timer.getLastLoopTime() + loopSlot;
        while (timer.getTime() > endTime) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException ie) {
            }
        }
    }

    protected void input() {
        mouseInput.input(window);
        gameLogic.input(window, mouseInput);
    }

    protected void update(float interval) {
        gameLogic.update(interval, mouseInput);
    }

    protected void render() {
        gameLogic.render(window);
        window.update();
    }
}

関連ページ一覧

EclipseセットアップWindows版

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

SDカードの容量が少ない~SanDiskの場合~

事の始まり

SanDiskの64GBを購入しリムーバブルディスクとして使用しようとしたが、使用可能領域が256MBに。。。

おかしいと思い調べてみると、ほかにも似たようなことになっている人がいる模様。
こちらのサイトで調べてみたところそれ用のフォーマッター(アプリを使用する必要があるようだった)

解決策

  1. こちらのサイトからアプリをダウンロード
  2. インストーラを起動
    Formatter Install
  3. SDカードのフォーマット
    Format_SD
  4. 無事にフォーマットでき、カードのデータ量も適切なものが表示されました
    After

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

ゲーム作成アイディア〜タロット占いを学ぶ〜

ステータス作成に

ゲーム作成のために汎用性の高いタロット占いを学びます。本当は、ゲーム作成のために調べてたのですが、調べていたらタロット占いを学んだ方がゲームへの反映もしやすいのでわ?という疑惑と、やってみるかな?という気になったという次第です(笑)

具体的には、数秘術、12星座占いなどと関連付けてパラメータとして反映しやすいだろうと考えています。

数秘術の使い道

数秘術は、大まかに人名からその人の以下に並べる各番号を取得してその人の運勢を占います。

  • 人格数
  • 運命数
  • ハート数
  • 意思数
    *特性数
  • 欠落数
  • 成熟数

上の「~数」の詳細に関してはこちらに記載しています。
そして、算出した各「数」に対応する番号をセフィトロトの木にある丸と丸をつなぐ「パス」に対応する番号にタロットの大アルカナをあてはめます。
後日イメージを貼り付けます。

タロット占い

タロット占いは、「ある1つの質問にカードが答える」という形で占います。
具体的には、質問者(占われる人)と占い師(タロット占いをする人)がいて質問者の質問をタロットカードをシャッフル、カット、カードを展開する。という手順で占います。

ゲームとの関連性

やはり、大アルカナ(22枚)、小アルカナ(56枚)のカードに対して、数値を与えて使用する方法が一番無難だと思います。
しかし、数値を与えるためには、各カードの内容を理解、もしくは、カテゴリー分けしてやる必要があるので。。。
[以前調査した内容]()は

結局は、占いを学ぶというところに至った次第です。

まずは全体を眺める

大アルカナの一覧

ワンドのスートとコートカード

カップのスートとコートカード

ソードのスートとコートカード

ペンタクルスのスートとコートカード

## 関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

## JavaFX関連ページ
1. [Eclipse SceneBuilderを追加する](https://zenryokuservice.com/wp/2018/11/17/eclipse-scenebuilder%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b/)
1. [JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~](https://zenryokuservice.com/wp/2018/11/17/javafx-scenebuilder-%e3%80%9ceclipse%e3%81%a8scenebuilder%e9%80%a3%e6%90%ba/)
1. [JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜](https://zenryokuservice.com/wp/2019/02/05/javafx-scenebuilder%e3%80%9c%e3%83%9c%e3%82%bf%e3%83%b3%e3%81%ab%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e5%89%b2%e3%82%8a%e5%bd%93%e3%81%a6%e3%82%8b%e3%83%af%e3%83%b3%e3%83%9d%e3%82%a4%e3%83%b3/)
1. [Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜](https://zenryokuservice.com/wp/2020/03/30/java-%e3%83%97%e3%83%ad%e3%82%b3%e3%83%b3%e3%82%b2%e3%83%bc%e3%83%a0-%e3%80%9c%e8%a6%8b%e3%81%9f%e7%9b%ae%e3%81%ae%e4%bd%9c%e6%88%90scenebuilder%e3%81%ae%e4%bd%bf%e7%94%a8%e3%80%9c/)

## ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

## JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

## オブジェクト指向関連ページ
1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
1. [オブジェクト指向の概念2〜クラスとは〜](https://zenryokuservice.com/wp/2019/10/30/%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5%e3%80%9c%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e3%81%af%e3%80%9c/)

WordPress プラグイン作成 〜アンケートプラグインの作成〜

WordPressに追加するプラグインの作成を行なっています。しかし、使用する処理(非同期通信)が原因で、データの登録処理が動きませんでした。

しかし、ちょっとした妥協と共に問題は解決しました(笑)

アンケートを作成したら。。。

なんだかんだと以下のようなところまで、実装することができました。

アンケートの質問と、回答をセットにしてDBに登録します。
そして、登録したデータは下のように投稿した記事に挿入するようになっています。

挿入する場所は、記事の中にあるタグid="XXX"XXX部分に対応した部分の下にアンケートが追加されます。
上のキャプチャーで行けば、id="main"のタグの最後部分に追加されます。
画面一番下に来るわけですね。。。

次の実装

アンケートを記事の中に表示することができました。
なので、アンケートに回答してもらったものをDBに登録、アンケートの集計結果を表示できるような実装が必要です。

どーやるか?

まずは集計するためのデータを登録するDBの設計が必要です。「DB」と記述しましたが、正確には「テーブル」です。

①集計するための項目を考える

アンケートに答えてもらった、時に集計したいことは(現状)以下の通りです。

  1. アンケートの質問の回答数
  2. アンケートに答えてもらった日時

少ないけどとりあえずそんなもんで(笑)

②テーブル設計

テーブルを作成する時のポイントとしては以下のようなことです。

  1. データ(アンケートの質問)と回答を一意に結びつけられるようにする
  2. 回答してもらった回数と日時を集計できるようにする

これらを加味すると下のようになります。

③テーブルの構成を作る

テーブルは、エクセルの列と行がある状態に似ています。というかほぼ一緒です。下のようなイメージです。

サンプル1(SAMPLE1)
ID 質問 回答 回答時間 回答回数
1 AAAA BBB 2020/4/23 2
2 1111 BBB 2020/5/23 20
3 XXXX BBB 2020/6/23 30

これを実際に使用するために。。。と考えると

「回答時間は、別テーブルに持った方が良い」となりました。
理由としては下のようなものがあります。

テーブルを分ける理由

  1. 1レコード(行)に対して、1つの質問と回答回数を登録する
  2. 時間を一緒に登録するとなると、レコード(行)が増えるだけで、不適当なデータが沢山できてしまう

そして、テーブルを分けるのは具体的に以下のようにする。

  1. アンケートを管理するためのテーブル(サンプル1)
  2. 回答時間を管理するためのテーブル(サンプル2)
サンプル2(SAMPLE2)
ID 質問ID 回答時間
1 AAAA BBB
2 1111 BBB
3 XXXX BBB

そのあとは?

この2つのテーブルを結合します。
具体的には、サンプル1のテーブルとサンプル2のテーブルを結合します。

どーやるか?正確には、データを取得する時にはSQLを使用して取得します。
具体的なSQLは以下のようなSQLになります。
SELECT * FROM サンプル1 省略名(エイリアス), サンプル2 省略名(エイリアス) WHERE 条件1 AND 条件2 ...

これは、一般化したものでそのまま使用しません。しかし、下のものは実際に使用できるSQLです。
SELECT * FROM SAMPLE1 A, SAMPLE2 B WHERE A.ID = B.質問ID

しかし、今回は時間ごとの集計を行いたいので、日時をそのまま登録するようにはしません。

時間帯の区分けを作る

  1. 0:00〜7:00
  2. 7:00〜12:00
  3. 12:00〜18:00
  4. 18:00〜24:00
    このように分けようと思います。
    そして、それぞれのクリック数を計算できるようにカラムを追加してやります。

とまぁこんなところで。。。

でわでわ。。。



関連ページ

  1. WordPress プラグイン作成〜DBを使用する〜
  2. PHP PDO 〜MySQLにアクセスする〜
  3. PHP Ajax 〜DBに登録したデータを受信する〜
  4. Google Maps API PHP連携 〜マップ情報をDBに登録する〜
  5. PHP Image File 〜iPhoneやAndroidでの画像送受信の問題〜
  6. AngularJS Routing 〜PHPをWeb APIにする〜
  7. WordPress PHPカスタム〜根本的に見た目を変える〜
  8. WordPress PHPカスタム〜根本的に見た目を変える2〜
  9. Eclipse PHPプラグイン 〜ElipseでWordPress環境を構築〜
  10. WordPress テスト実装 〜heade-test.phpを表示〜
  11. AngularJS + PHP 〜WordPressと連携する〜
  12. AngularJS + PHP 〜AngularJSの実装〜
  13. AngularJS + PHP 〜AngularJSの実装2〜
  14. WordPress 処理解析 ~index.phpを眺める~
  15. WordPress Plugin NewStatPress ~アクセス解析プラグインAPIを使う~
  16. WordPress 処理解析 ~ログイン処理を調べる~
  17. WordPressカスタム〜アンケートボタンを追加する(設計)〜
  18. WordPressカスタム〜プラグインの作成〜
  19. WordPressカスタム〜ダッシュボードのプラグイン画面作成〜
  20. WordPressカスタム〜ダッシュボードのプラグイン画面作成2〜
  21. WordPressカスタム〜ダッシュボードのプラグイン画面作成3〜
  22. WordPress プラグイン作成〜アンケート作成プラグインを作る〜

Java ミニゲーム ソース付き 〜コンソールアプリからGUIアプリへ〜

今まで作成してきて、限界を感じました。
何に限界を感じたか?というところですが、キーボード入力に対するイベントの取得をするには、根本的に作りを変える必要があるためです。

JavaFXを使用する

コンソールアプリからGUIアプリへ変更するためには、JavaFXを使用するのが一番早いと思うので、この方法を使います。

今まで作成したものを使用する

今まで作成したものを使用する方向で、JavaFXアプリに変更します。

具体的に?

今までメインメソッドを実装しているMainクラスを改造します。

public class GameMain  {

このように書いていた部分を

public class GameMain extends Application {

のように修正します。

これにより、ビルドエラーが出ます。これは実装するべきメソッドを実装していないためです。
細かい話は、下の記事に記載しています。

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

## 画面イメージ
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/05/スクリーンショット-2020-05-14-19.59.16.png)
とりあえずは、人を抜かした感じのマップを作成しようと思います。戦闘シーンからは少し離れますが。。。

表示結果はこんな感じです。
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/06/スクリーンショット-2020-06-17-21.09.46-300x264.png)

今後のことを考え、GridPaneを使用して作成すると下のようなコードになります。[Githubに全部あります](https://github.com/ZenryokuService/StepUpGame/commit/9397e9704cafe25decfb91e10badb5631f653101#diff-5be3ca72285c30fcf6ff21598f8dc67c)。

@Override
public void start(Stage primaryStage) throws Exception {
    primaryStage.setWidth(WIN_WIDTH);
    primaryStage.setHeight(WIN_HEIGHT);
    // ルートコンテナ
    BorderPane root = new BorderPane();

    GridPane grid = new GridPane();
    grid.getColumnConstraints().add(new ColumnConstraints(40));
    for(int y = 0; y < 20; y++) {
        for (int x = 0; x  < 20; x++) {
            grid.add(getGrassTile(), x, y);
        }
    }
    root.setCenter(grid);
    Label textLabel = new Label();
    textLabel.setBackground(new Background(new BackgroundFill( Color.RED , new CornerRadii(5) , Insets.EMPTY )));
    root.setBottom(textLabel);

    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.show();
}

private Label getGrassTile() {
    // マップの草原用、イメージ(40x40)
    URL url = getClass().getResource("/map/Grass.png");
    ImageView image = new ImageView(new Image(url.toExternalForm()));
    Label tile = new Label();
    tile.setGraphic(image);
    return tile;
}

## まとめ
一度、コンソールアプリのクラスTextRpgGameを一度コメントアウトし、JavaFXアプリとして作成し直します。
シンプルに、草のマップを作成しました。

とりあえずは、GridPaneを使用して、20x20マスのマップを表示しました。
これで、一部を修正することも、書き換えることも簡単にできます。

でわでわ。。。



## 関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

## JavaFX関連ページ
1. [Eclipse SceneBuilderを追加する](https://zenryokuservice.com/wp/2018/11/17/eclipse-scenebuilder%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b/)
1. [JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~](https://zenryokuservice.com/wp/2018/11/17/javafx-scenebuilder-%e3%80%9ceclipse%e3%81%a8scenebuilder%e9%80%a3%e6%90%ba/)
1. [JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜](https://zenryokuservice.com/wp/2019/02/05/javafx-scenebuilder%e3%80%9c%e3%83%9c%e3%82%bf%e3%83%b3%e3%81%ab%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92%e5%89%b2%e3%82%8a%e5%bd%93%e3%81%a6%e3%82%8b%e3%83%af%e3%83%b3%e3%83%9d%e3%82%a4%e3%83%b3/)
1. [Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜](https://zenryokuservice.com/wp/2020/03/30/java-%e3%83%97%e3%83%ad%e3%82%b3%e3%83%b3%e3%82%b2%e3%83%bc%e3%83%a0-%e3%80%9c%e8%a6%8b%e3%81%9f%e7%9b%ae%e3%81%ae%e4%bd%9c%e6%88%90scenebuilder%e3%81%ae%e4%bd%bf%e7%94%a8%e3%80%9c/)

## ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

## JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

## オブジェクト指向関連ページ
1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
1. [オブジェクト指向の概念2〜クラスとは〜](https://zenryokuservice.com/wp/2019/10/30/%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5%e3%80%9c%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e3%81%af%e3%80%9c/)

Java Discord

  1. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜
  2. Java Discord セットアップ〜Hello Discord〜
  3.  Java Discord ピンポン〜Discordプログラム〜
  4. Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

JavaFX Image エラー 〜java.lang.reflect.InvocationTargetException〜

JavaFXでのコーディング中、PNGファイルを読み込もうとした時に、下のようなエラーが出ました。

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=0.0, vgap=0.0, alignment=TOP_LEFT
    at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
    at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
    at javafx.scene.layout.GridPane.add(GridPane.java:965)
    at zenryokuservice.main.game.GameMain.start(GameMain.java:256)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception running application zenryokuservice.main.game.GameMain

エラーが出た実装

ImageView image = new ImageView(new Image("/map/Grass.png", true));

修正後

ImageView image = new ImageView(new Image(url.toExternalForm()));

パスの内容が悪かったのかね?



関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java Discord

  1. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜
  2. Java Discord セットアップ〜Hello Discord〜
  3.  Java Discord ピンポン〜Discordプログラム〜
  4. Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

Java ミニゲーム ソース付き 〜テスト駆動開発:文言出力部品を作る〜

今回は、RPGゲームでよくある文字を1文字ずつ読めるスピードで出力する部品を作ります。

今まで作成したテキストRPGゲームに追加します。
現状は、こんな感じで動きます。

文字の出力は、一括で出力するのでゲームっぽくありません。どちらかというとログ出力っぽいです(笑)

文字出力部品を作る

現状は、System.out.println()を使用しています。これは引数にある文字列を標準出力に出力します。
標準出力 = System.outになります。

問題

どーやって1文字ずつ出力するか?
とりあえずは、テスト駆動開発にしますので、テストケースを作成します。

毎度おなじみJUnit

JUnitを使用してテストクラスを動かします。

作成手順

  1. Eclipseのプロジェクトに「test」フォルダを作成する
  2. テストするクラスと同じパッケージを作成する
  3. テストするクラスの後にTestをつけたクラスを作成する
  4. 〜Testクラスにテストケースを作成する
具体的に。。。

実装した時の動画を作成しました。

詳細は以下のようになります。
上の手順4以降の記載になります。

JUnitをビルドパスに追加


動画にもあるのですが、上のような画面でJUnitを追加します。細かい部分は動画にありますので参照ください。

テストケースを作る

今回のテストケースはコンソールにゆっくりと表示できれば良いので、動かすだけになります。
故に、コードは下のようになります。

public class PrintUtilsTest {
    @Test
    public void testPrint01() {
        String mes = "アイウエオカキクケコ。。。。";
        try {
            PrintUtils.print(mes);
        } catch (InterruptedException e) {
            fail(e.getMessage());
        }
    }
}

今回の作成するクラスは、PrintUtilsクラスです。テストクラスは上のコードにある通りです。

作成するクラスをガワだけ作ったら、あとは、テストケースで呼び出してやる処理を実装してやるだけです。

あとは、実装→起動→修正→確認を繰り返して終了です。

シンプルなもんです(笑)



関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java ミニゲーム ソース付き 〜ここまでのまとめ〜

今回は、ミニゲーム作成で作ったものをまとめます。
まとめたのちに、次の実装はどうしようか決めようと考えた次第です。

Gitリポジトリはこちらです。下の方に、接続方法などの記事へのリンクがあります。

大まかな処理フロー

GameMainクラス
クラスの記述内容がコードより、ライセンスのJavaDoc部分が大半を占める状態です(笑)

public class GameMain {
    public static void main(String[] args) {
        // ゲームクラス
        TextRpgGame main = new TextRpgGame();
        // 初期処理
        main.init();
        while (true) {
            // 入力受付
            String in = main.input();
            if ("bye".equals(in)) {
                break;
            }
            // データの更新
            if (main.update(in)) {
                // 画面の描画
                main.render();
            }
        }
    }
}

メインメソッドを持っていて、ループ処理を行っています。
while(true) { ... }の部分が俗にいう「ゲームループ」の部分になります。

処理の説明としては、以下の通りです。

  1. TextRpgGameのインスタンスを取得
  2. 初期処理を行う
  3. ゲームループ開始
  4. 標準入力を受け取る
  5. "bye"と入力されたらアプリの終了
  6. 入力データにより、ゲームで使用するデータ(プレーヤーとモンスター)の情報を更新する
  7. 表示するステータスを再描画

こんな感じの処理を行っています。

TextRpgGameについて

メインメソッドから呼ばれるそれぞれのメソッドを実装しています。
具体的には下のものです。

  1. init(): 初期処理を行う。ステータスの表示など
  2. input(): 標準入力を受け取る。
  3. update (): データの更新を行う。使用しているプレーヤークラス、モンスタークラスのデータを更新します。主にHPの値を更新します。
  4. render(): ステータスの更新、モンスターを倒したなどの戦闘終了の文言を表示する。
public class TextRpgGame {
    /** コマンド:たたかう */
    private static final String ATTACK = "1";
    /** コマンド:ぼうぎょ */
    private static final String DEFFENCE = "2";
    /** コマンド:にげる */
    private static final String ESCAPE = "3";

    /** 入力部品 */
    private Scanner scan;
    /** プレーヤー */
    private Player player;
    /** モンスター */
    private Monster monster;

    /** 初期表示を行う */
    public void init() {
        player = new Player(20, 10, 1, "プレーヤー");
        monster = new Monster(10, 5, 1, "たくのじ");

        System.out.println(monster.getName() + "が現れた!");
        monster.say();
        scan = new Scanner(System.in);
    }

    /** 入力処理 */
    public String input() {
        return scan.next();
    }

    /** 入力後に行う処理 */
    public boolean update(String input) {
        if (CheckerUtils.isNumber(input, CheckerUtils.REG_1_TO_3) == false) {
            System.out.println("1-3を入力してください。: " + input);
            return false;
        }
        // コマンド実行後の計算
        if (ATTACK.equals(input)) {
            // モンスターへダメージ
            int monsterDamage = this.calcAttack(player.attack(), monster.deffence(), player.getName());
            int monsterResult = monster.getHp() + monsterDamage;
            monster.setHp(monsterResult);
        }
        // モンスターの攻撃
        int monsterAttack = this.calcAttack(player.deffence(), monster.attack(), monster.getName());
        int playerResult = player.getHp() + monsterAttack;
        player.setHp(playerResult);

        return true;
    }

    /** 
     * 画面を更新する。
     * @return ture: 終了 false: 続く
     */
    public boolean render() {
        if (monster.getHp() > 0) {
            monster.say();
        } else if (player.getHp() <= 0 ) {
            System.out.print(player.getName() + "はたおれてしまった。");
            return true;
        } else {
            monster.lastMessage();
            System.out.print(monster.getName() + "をやっつけた。");
            return true;
        }
        return false;
    }

    public void viewStatus() {
        viewStatus(player.getHp(), player.getMp(), monster.getHp(), monster.getMp());
    }

    private void viewStatus(int playerHp, int playerMp, int monsterHp, int monsterMp) {
        String line1 = "たたかう: 1   プレーヤー   たくのじ";
        String line2 = "ぼうぎょ: 2   HP: A1     HP: B1";
        String line3 = "にげる : 3   MP: A2     MP: B2";
        // 値を入れ替える
        line2 = line2.replace("A1", String.format("%02d", playerHp)).replace("B1", String.format("%02d", monsterHp));
        line3 = line3.replace("A2", String.format("%02d", playerHp)).replace("B2", String.format("%02d", monsterHp));

        System.out.println(line1);
        System.out.println(line2);
        System.out.println(line3);
    }

    private int calcAttack(int attack, int deffence, String attackerName) {
        int result = 0;
        System.out.println(attackerName + "のこうげき");
        if (attack > deffence) {
            result = deffence - attack;
            System.out.println(Math.abs(result) + "のダメージ!");
        } else {
            System.out.println("こうげきを、はじいた!");
        }
        return attack > deffence ? deffence - attack : 0;
    }
}

じゃんけんゲームから比べてみると、コード量が増えたように見えます。がビビることはありません。

ポイントはメソッド単位で処理を見ることです。
そうすれば、12〜16行くらいなもんです。物により長大なものもありますが。。。

そして、気をつけなければいけないのが、フィールド変数と以下のクラスです。

スーパークラス(親クラス)

今回の実装では、PlayerとMonsterクラスが似たような処理だったので、同じ処理はスーパークラスで管理することにしました。
TextRpgGame#init()でインスタンスを取得している。2つのクラスが実装しています。
具体的には、スーパークラス(親クラス)のCharactorクラスを継承して実装している。ということです。

そして、ネーミングが悪いのもあるのですが、CharactorクラスはJavaのライブラリの中にもありますのでちょっとだけ注意です。

PlayerクラスとMonsterクラスはデータを保持するクラスです。戦闘して互いのHPを削り合う形でゲームは進むので、ほぼデータクラスです。
「たたかう、ぼうぎょ」などのコマンドはそれぞれのクラスに実装します。PlayerとMonsterでは攻撃方法が違うからです。

PlayerクラスとMonsterクラス

フィールド変数とGetter, Stterを主軸に実装したクラスです。
しかし、HPなどのフィールドはスーパークラスのCharactorクラスへ移動しました。

public abstract class Charactor {
    /** 名前 */
    protected String name;
    /** HP */
    protected int hp;
    /** MP */
    protected int mp;
    /** Level */
    protected int level;
    /** 攻撃力 */
    protected int atack;
    /** 防御力 */
    protected int defence;
    /** 武器 */
    protected Wepons wepons;
    /** 防具 */
    protected Armors armor;

    /** 抽象メソッド: 攻撃 */
    public abstract int attack();

    /** 抽象メソッド: 防御 */
    public abstract int deffence();
 ・
 ・
 ・
}

このように、スーパークラスでHPなどは管理しています。
これを継承するPlayerは下のようにコンストラクタとスーパークラスの抽象メソッドをオーバーライドします。

public class Player extends Charactor {

    /** コンストラクタ */
    public Player(int hp, int mp) {
        this.hp = hp;
        this.mp = mp;
    }

    /** コンストラクタ */
    public Player(int hp, int mp, int level, String name) {
        this.hp = hp;
        this.mp = mp;
        this.level = level;
        this.name = name;
        // 装備を行う
        setArms();
    }

    /**
     * 装備を行う。
     */
    private void setArms() {
        this.wepons = new Wepons("ひのきのぼう", 5);
        this.armor = new Armors("ぬののふく", 5);
    }
    /**
     * 攻撃コマンドのメソッド。
     * 武器の攻撃力を返却する。
     * @return 武器の攻撃力
     */
    @Override
    public int attack() {
        this.atack = wepons.getAttackPoint();
        return this.atack;
    }

    @Override
    public int deffence() {
        this.defence = armor.getDeffencePoint();
        return this.defence;
    }
}

そして、setArms()というメソッドでは、武器と防具クラスを生成して、Playerクラスのフィールドに設定しています。
名前の通りに、Weponsは武器、Armorsは防具を示しそれぞれ攻撃力と防御力を算出します。
現段階では、攻撃力と防御力がそのまま設定されていますが。。。

とりあえずは、こんな感じで作っています。
GitからPULLして遊んでみてください。
やり方は、こちらの動画にもあります。

記事もあります。
Eclipse GitからPULL

下の方に、関連ページの一覧がありますのでそちらもどうぞ



Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

<ins class="adsbygoogle"
style="display:block"
data-ad-format="fluid"
data-ad-layout-key="-6t+ed+2i-1n-4w"
data-ad-client="ca-pub-7367785927150581"
data-ad-slot="3284986237">

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Java ミニゲーム ソース付き 〜RPGの戦闘シーンを作る2 in Console〜

今回は、入力〜戦闘を行い、次のターンへ進む処理を実装します。

前回は、以下の画面を表示するところまで実装しました。

作成したクラス一覧
GameMain
TextRpgGame
Monster
Player
CheckeerUtils

1ターンの戦闘

1ターン分の戦闘を行うのに、「攻撃力、防御力」のパラメータが必要になります。
具体的には下のようなイメージです。

プレーヤー
HP: XX
MP: XX
攻撃力:XX
防御力:XX

こんな感じです。これは当然モンスターにも必要になります。

ここで、ちょっと注意というか、気がつく(実装したから気がついた)のが、PlayerクラスとMonsterクラスの実装が「ほぼ同じ」だということです。
PlayerクラスとMonsterクラスの違いはクラス名くらいなのです。
なので、このPayerクラスとMonsterクラスの同じような処理はまとめてしまいましょう!

クラスの処理をまとめる

まとめる方法は色々とありますが、今回は「スーパークラス(親クラス)」を使用します。
イメージは下のような感じです。

上のような図はUMLのクラス図と言います。
UMLに関しては他の記事に記載しているので。。。

  1. UMLツール 〜Star UMLを使う〜
  2. UMLツール Star UML〜ユースケース図を書いて見た〜

今回は、実装の方を進めます。
上の図にあるように、Charactorクラスを作成します。
そして、PlayerとMonsterで同じ実装をしている部分をCharactorクラスに引っ越ししてしまいます。

具体的には下のような実装です(GetterとSetterは省略)

public class Charactor {
    /** HP */
    protected int hp;
    /** MP */
    protected int mp;
    /** Level */
    protected int level;
    /** 攻撃力 */
    protected int atack;
    /** 防御力 */
    protected int defence;
    /** 武器 */
    protected Wepons wepons;
    /** 防具 */
    protected Armors armor;

ちなみに、武器と防具はまた別にクラスを作成しました。
中身はまだ決まっていません。とりあえずは、武器なら攻撃力、防具なら防御力をフィールド(要素)として持っています。

そして、PlayerクラスとMonsterクラスには攻撃、防御のコマンドが必要になります。
しかし、これも共通するのでスーパークラスに作成します。
ここで「実装」という言葉を使わなかったのはわけがあります。

抽象メソッド

書き方はインターフェースの時と同じです。
public void XXXXX();というように、メソッドの宣言のみを記述します。

具体的に下のように実装しました。

public abstract class Charactor {
    /** HP */
    protected int hp;
    /** MP */
    protected int mp;
    /** Level */
    protected int level;
    /** 攻撃力 */
    protected int atack;
    /** 防御力 */
    protected int defence;
    /** 武器 */
    protected Wepons wepons;
    /** 防具 */
    protected Armors armor;

    /** 抽象メソッド: 攻撃 */
    public abstract int attack();

    /** 抽象メソッド: 防御 */
    public abstract int diffence();
}

クラスを通常のクラスから抽象クラスへ変更:public classからpublic abstract classへ修正
そして、これを継承するクラスは、下のようにエラーが出ます。

抽象メソッドはオーバーライド

これを行わないと上のようにビルドエラーが出ます。
Javaのプログラミングルールみたいなものです。
逆にいうと、抽象メソッドは「必ずオーバーライドする」ことが約束されるので、「XXXクラス(インターフェース )を実装するクラスには△△△というメソッドが必ずある」ということになりますので、下のような実装が可能になります。

List listA = new ArrayList();
List listB = new LinkedList();

listA.add(オブジェクト1);
listB.add(オブジェクト2);

今回のPlayerクラスとMonsterクラスにも同じことが言えて、下のような実装が可能です。※多分使わないけど。。。

Charactor ch1 = new Player(10, 10);
Charactor ch2 = new Monster(5, 5);

ch1.attack();
ch2.attack();

こんな感じで動きました。
最終的なソースはこちらにあります。元のソースと比較している画面が見れます。

でわでわ。。。

<!— BODY広告 —>



関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜