イントロダクション
はじめにコンソール画面を使用してミニゲームを作成しようと思っています。
標準入力(コンソール画面に入力する)を使用して行いますので、参考までに標準入力のサンプルを載せておきます。
標準入力の動き
最終的に作成したもの
ミニゲームを作る
- ミニゲームの作成を行います。
処理の概要としては、以下の通りです。( version0.1)
=====補足========== <基本設計レベル> [詳細設計レベル] ================== <初期処理> 画面状態管理Obj リソースの読み込み [テキストで表示する絵を読み込み変数に保存]→テキストファイル [新規で追加するファイルも読み込める様に工夫する] <選択→決定処理> ゲームタイトル画面の「スタート」「コンテニュー」の選択をする 以下の様に表示するSTART:S <イントロダクションの表示処理> イントロダクションのテキストファイルを読み込み ストーリーの序章を表示して、ゲームを開始できる様な文章を表示する
CONTINUE: C
この仕様で実装します。
-
画面状態管理クラスの作成
- シンプルにMap型のフィールド変数を作成します。
-
リソースの読み込み、単純にテキストファイルの読み込みです。
※今後はプロパティファイルなど読み込む予定です。(XMLもやるかも?)リメイクの方(Github)で使用しています。
※未実装です
- これもテキストファイルを読み込みゲームの序章を表示します。
今回は、ここまでを実装します。
土台にするのは以前の実装です。
クラス名はブログの都合上変えてあります。
そして「画面状態」は今回初登場の「Map」インターフェースを使用して管理します。
<<元にするソースについて>>
ゲームの基本的な処理フロー
初期化→ゲームループ→終了
上記のメソッドを実装してあります。
まとめると
- ゲームの起動準備「init();」
- 入力→画面の更新をループする「gameLoop()」
- ゲームの終了「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
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜