Java Basic ミニゲーム作成 〜Step3_1〜

イントロダクション

はじめにコンソール画面を使用してミニゲームを作成しようと思っています。
標準入力(コンソール画面に入力する)を使用して行いますので、参考までに標準入力のサンプルを載せておきます。

標準入力の動き

最終的に作成したもの

ミニゲームを作る

  • ミニゲームの作成を行います。
    処理の概要としては、以下の通りです。( version0.1)
=====補足==========
<基本設計レベル>
[詳細設計レベル]
==================

<初期処理>
画面状態管理Obj
リソースの読み込み
[テキストで表示する絵を読み込み変数に保存]→テキストファイル

[新規で追加するファイルも読み込める様に工夫する]

<選択→決定処理>
ゲームタイトル画面の「スタート」「コンテニュー」の選択をする

以下の様に表示する

START:S
CONTINUE: C
<イントロダクションの表示処理> イントロダクションのテキストファイルを読み込み ストーリーの序章を表示して、ゲームを開始できる様な文章を表示する

この仕様で実装します。

  1. 画面状態管理クラスの作成

    • シンプルにMap型のフィールド変数を作成します。
  2. リソースの読み込み、単純にテキストファイルの読み込みです。

※今後はプロパティファイルなど読み込む予定です。(XMLもやるかも?)リメイクの方(Github)で使用しています。

※未実装です

  1. これもテキストファイルを読み込みゲームの序章を表示します。

今回は、ここまでを実装します。

土台にするのは以前の実装です。
クラス名はブログの都合上変えてあります。
そして「画面状態」は今回初登場の「Map」インターフェースを使用して管理します。

<<元にするソースについて>>

ゲームの基本的な処理フロー

初期化→ゲームループ→終了

上記のメソッドを実装してあります。

まとめると

  1. ゲームの起動準備「init();」
  2. 入力→画面の更新をループする「gameLoop()」
  3. ゲームの終了「terminated()」

上記の3つの処理の中で、ゲームを進行させていくと言うことです。が実装してみないとイメージがわかないと思います。※イメージが湧く人は頭のいい人です。筆者は試行錯誤済みです。

そして、「3つの処理」というのは「」の中に書いてある各メソッドのことを指します。

  • init()
  • gameLoop()
  • terminated()

それぞれの処理は以下のようになります。
<init: 初期処理>

/**
* このゲームでは初期化は必ず1回なのでstaticをつける</br>
* static -> 静的メソッド=> クラス内にあるがJVMから直で参照される
* ※JVM => Java Virtual Machine
*/
private static void init() {
    // mainメソッドと同様にクラスをnewする必要あり
    game = new RpgMain();
}

ここで実行しているのはコンストラクタになります。

/**
* ぶっちゃけてここで初期化(init)処理をやっても良い</br>
* 最終的にプログラムの設計者の判断に委ねられる</br>
*/
public RpgMain() {
    // メンバメソッドなのでコンストラクタで呼び出す
    initialize();
}

そして、inittialize()メソッドを実行しています。フィールド変数にTitleViewクラスを代入(セット)しています、

/**
* 入力、出力のためのオブジェクトを生成</br>
* RpgMainクラスが存在しないならば使用できない様にするので</br>
* このメソッドはメンバメソッドにしてある</br>
*/
public void initialize() {
    // 入力受付クラス
    read = new BufferedReader(new InputStreamReader(System.in));
    // *** titleの表示 *** //
    // ViewStats生成
    status = new TitleView();
}

<gameLoop: 初期処理>

/**
 * この処理もinit()と同様に必ず1回なのでstaticをつける</br>
 */
private static void gameLoop() throws IOException{

    /*
    *  <ゲームループ> 
    *  1.入力
    *  2.データ更新、
    *  3.レンダリング(今回はコマンドなので文字出力)
    *  4.「bye」コマンドでゲームを終了する
    */
    while(true) {
    // 1. 入力を受け取る
    String command = game.listenInput();
    // command変数がnullになる可能性があるため定数.equals()の形にする
        if(TERMINATE_GAME.equals(command)) {
            break;
        }
        // 2-1.処理を実行する(タイトル、その他初期表示する
        status = game.execute(command);
    }
}

ここでは、「String command = game.listenInput();」で標準入力を受け取っています。
そして受けた文字列から実行するコマンドを実行して処理後にTitleViewクラスを受け取っています。

<terminated: 終了処理>

/**
* ゲームのリソースを解放する
*/
public static void terminated() {
    // クラスの解放を行う
    game = null;
    System.out.println("This game terminated!, See you next time!!");
}

サンプルコードは一番上の「ミニゲーム」の部分にリンクしています。

コンソールゲームで初めのタイトルが表示される様なものです。初めはこれからストーリーをつけて。。。と考えていたのですが、ストーリーができず。。。保留状態です。。。※作成しました。作成したものは上部にYOutube動画があります。

実装したコード

この記事の上部にあるリンク先にはGithubで見ることができます。関連クラスも同様にアップロードしてあります。

/**
 * コマンドラインRPGのメインクラス</br>
 * <ul>
 * 機能リスト
 * <li>1.必要なリソースを読み込む #init</li>
 * <li>2.ゲーム起動(コマンド入力) #gameLoop</li>
 * <li>3.リソースの解放</li>
 * <li>ゲーム終了(このメインメソッドの終了)</li>
 * </ul>
 * @author takunoji
 */
public class RpgMain {
    /** フィールド変数で自信を管理 */
    private static RpgMain game;
    /** 定数: AP終了コマンド */
    public static final String TERMINATE_GAME = "bye";
    /** 入力を受付るオブジェクト */
    private BufferedReader read;
    /** 画面状態管理オブジェクト */
    private static ViewStatus status;

    //////////////////////////////////////
    // staticメソッドの定義
    //////////////////////////////////////
    /** 
     * ゲームを起動する </br>
     * 標準入力の受付、「bye」コマンドでAPを終了する</br>
     * 
     * @param args プログラム引数
     */
    public static void main(String[] args) {
        // 初期化処理
        init();
        try {
            // ゲーム起動(GameLoop開始)
            gameLoop();
        } catch(IOException ie) {
            ie.printStackTrace();
            System.exit(-1);
        }
        // リソースの解放
        terminated();
    }

    /**
     * このゲームでは初期化は必ず1回なのでstaticをつける</br>
     * static -> 静的メソッド=> クラス内にあるがJVMから直で参照される
     * ※JVM => Java Virtual Machine
     */
    private static void init() {
        // mainメソッドと同様にクラスをnewする必要あり
        game = new RpgMain();
    }

    /**
     * この処理もinit()と同様に必ず1回なのでstaticをつける</br>
     */
    private static void gameLoop() throws IOException{

        /*
         *  <ゲームループ> 
         *  1.入力
         *  2.データ更新、
         *  3.レンダリング(今回はコマンドなので文字出力)
         *  4.「bye」コマンドでゲームを終了する
         */
        while(true) {
            // 1. 入力を受け取る
            String command = game.listenInput();
            // command変数がnullになる可能性があるため定数.equals()の形にする
            if(TERMINATE_GAME.equals(command)) {
                break;
            }
            // 2-1.処理を実行する(タイトル、その他初期表示する
            status = game.execute(command);
        }
    }

    /**
     * ゲームのリソースを解放する
     */
    public static void terminated() {
        // クラスの解放を行う
        game = null;
        System.out.println("This game terminated!, See you next time!!");
    }

    //////////////////////////////////////
    // コンストラクタ、メンバメソッドの定義
    //////////////////////////////////////
    /**
     * ぶっちゃけてここで初期化(init)処理をやっても良い</br>
     * 最終的にプログラムの設計者の判断に委ねられる</br>
     */
    public RpgMain() {
        // メンバメソッドなのでコンストラクタで呼び出す
        initialize();
    }

    /**
     * 入力、出力のためのオブジェクトを生成</br>
     * RpgMainクラスが存在しないならば使用できない様にするので</br>
     * このメソッドはメンバメソッドにしてある</br>
     */
    public void initialize() {
        // 入力受付クラス
        read = new BufferedReader(new InputStreamReader(System.in));
        // *** titleの表示 *** //
        // ViewStats生成
        status = new TitleView();
    }

    /**
     * 入力受付を開始、入力結果を取得する</br>
     * @return 入力文字列(コマンド)
     * @throws IOException
     */
    private String listenInput() throws IOException {
        return read.readLine();
    }

    /**
     * コマンドの実行を行う<BR>
     * 1.
     * @param input
     * @return
     */
    private ViewStatus execute(String input) {
        status = status.execute(input);
        return status;
    }

    private void view() {
        if(status != null) {
            status.views();
        }
    }
}

[rakuten ids="book:19065927"]

関連ページ一覧

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 4Boolean
  5. Java Basic Level 5If 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 9Training 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 〜テストスイートの作り方〜

 

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す