質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

26230閲覧

Java Enterキーで処理

atsushi.abo

総合スコア8

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/04/05 12:19

Javaの質問です。
よくあるRPGゲームの”Enterキーを押すと次の話に進む”みたいなものをつくりたいんですけど、どんなコードになるのでしょうか?
要するに、なんかの処理→Enter入力→なんかの処理→Enter入力……
みたいな感じにしたいです。
一応ググってみたのですがよくわからなかったです。初心者が手を出すには早いものなのですか?
お手数ですがサンプルコードを頂けたら嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GUI に何のライブラリを使っているか書かないとみんな回答しづらいと思います。
AWT, Swing, SWT などがその一例です。どれを使っていますか?

AWT, Swing, SWT のいずれを使っていたとしても、キーボード操作はイベントとして処理されるという基本は同じです。
それは理解できているでしょうか?
キーボード操作の検知とハンドリングはライブラリが行ってくれるのが一般的です。
イベントリスナーというのをあらかじめライブラリに登録しておくことで、キーボード操作検知時にその処理が呼び出されるというものです。

やりたいことを実現する方法にも簡単な方法とその発展形があります。

簡単な方法は、現在の状態を表す変数を定義し、キーボード操作によりその状態を変えて行くという方法です。
各処理はその状態変数によって動作が変わるように実装します。

例えば以下のような感じです(雰囲気実装ですのであしからず)。

lang

1public class MainApplication ... implements KeyListener { 2 3 // 現在の場面を 1 からの番号で表すことにする。 4 private int sceneNumber = 1; 5 6 public void init() { 7 // キーボード操作が発生した場合、keyPressed が呼び出されるよう登録する。 8 addKeyListener(this); 9 } 10 11 public void keyPressed(KeyEvent e) { 12 swtich (sceneNumber) { 13 case 1: 14 case 2: 15 case 3: 16 case 4: 17 // 場面 1, 2, 3, 4 の場合は、エンターキーが押されたら場面を進める。 18 switch (e.getKeyCode()) { 19 case KeyEvent.VK_ENTER: 20 sceneNumber = sceneNumber + 1; 21 break; 22 } 23 break; 24 case 5: 25 // 場面 5 は別の操作を行う。 26 switch (e.getKeyCode()) { 27 case KeyEvent.VK_UP: 28 // 上キーを押したとき。 29 // ... 30 break; 31 case KeyEvent.VK_DOWN: 32 // 下キーを押したとき。 33 // ... 34 break; 35 } 36 break; 37 } 38 39 // 他の場所でも sceneNumber を使って処理をする。例えば場面によって画面の表示が変わるなど。 40 41}

場面が変われば操作も変わるということは往々にしてあると思うので、switch 文で場面ごとに操作が変わるようにします。

この方法だと場面の数だけ分岐の処理を1つのソースコードに全部書く必要があります。
場面によって変わる処理はキーボード操作だけではないでしょうから、それらも全部同じような書き方になります。

場面の数が少なければこの方法でも十分実装できます。入門編です。

発展形では場面毎に処理が切り替えられるような方法を考えます。
例えば各場面を別々のパネルに実装して、場面の切り替えのタイミングでパネルを切り替えるなどです。

そうした場合、場面をまたがって保持する情報がでてくるでしょうから、
情報を保存するクラスを切り分けて実装したり、場面をまたがって必要となる処理を共通クラスとしてくくり出したり、
などを行うことになるでしょう。
GUI プログラミングの知識もそうですが、必要に応じて複数クラスを実装することになるので Java プログラミングの応用力で必要になります。
場面が多くなればこの方法をとらざるを得なくなるでしょう。

投稿2015/04/06 04:02

toydev

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atsushi.abo

2015/04/06 04:42

なるほど……。本当にありがとうございます! イベントリスナーでEnter処理を行うには外部からライブラリに登録するのですね。swich分を使うのが以外でした。とてもためになりました!! あと、GUIではなくCUIをつかっています。
toydev

2015/04/06 05:29

CUI!?想定が全然違いました。 メッセージを表示する→回答を入力する→次のメッセージを表示する→回答を入力する という感じのコマンドラインで動くゲームブック型RPGですか? となると内容がぜんぜん違うものになります。 その場合はイベントリスナー方式とは違い、標準入力(System.in)を一行ずつ読んでいく処理になります。 例えば以下のような感じです。 ```lang-java package example; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class RPGMain { public static void main(String[] args) { // 1行ずつ読めるように BufferedReader クラスを使う。 BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); try { System.out.println("冒険が今まさに始まった!"); // エンターキーを待つだけ。 reader.readLine(); System.out.println("スライムが現れた。"); while (true) { System.out.println("どうする? 1:戦う。2:逃げる。3:冒険を止める。"); String command = reader.readLine(); if ("1".equals(command)) { System.out.println("楽勝!"); break; } else if ("2".equals(command)) { System.out.println("背中を見せたあなたをスライムは飲み込んだ。"); break; } else if ("3".equals(command)) { System.out.println("冒険を忘れて悠々自適に過ごした。【完】"); System.exit(0); } } // エンターキーを待つだけ。 reader.readLine(); System.out.println("町に着いた。"); // エンターキーを待つだけ。 reader.readLine(); // ... 冒険は続く ... System.out.println("冒険は続く ..."); } catch (IOException e) { System.out.println("問題が発生したよ!"); } } } ``` こういうことがあるので前提を書いて置かないとみんな応えられないんですね;;
toydev

2015/04/06 05:31

コメントにはコードのフォーマット使えないのか...再編集もできなーいw
atsushi.abo

2015/04/07 13:58

おぉぉ……!!最後の最後まで本当にありがとうございます!! Enter処理といっても状況に応じて結構種類があるのですね。 前提が大切なのを知らずにすいませんでした。以後ちゃんと書いていくように心掛けようと思います… 頑張って作ってみようと思います!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問