テキストアドベンチャーゲームを作る 8
< Enter キーを押すごとに新しいテキストを表示させる>
改行コードを使い、テキストの見栄えもよくなってきたのですが、今度は「テキストを1行ずつ表示してみたい!」と、思いました。
たとえば次になにが起こるかわからない緊迫した場面や、じっくりと聞かせたいナレーションなどでは、「Enter」キーを押すごとに1行ずつテキストが表示されるようにしたほうが雰囲気が出るだろうと感じたからです。
いろいろ調べた結果、Scanner を使うことでできる、ということがわかりました。
コードは簡単で、一行ずつ表示させたいテキストの合間に
input.nextLine();
という一文を挿入するだけです。
「input」というのは以前に作成した Scanner に任意でつけた名前です。なので Scanner に別の名前をつけている場合はその名前を「input」の代わりに書きます。
たとえば
System.out.println("あなたは小屋の扉のノブに手をかけた。");
System.out.println("…鍵はかかっていないようだ。");
System.out.println("音もなく扉は開き、中の様子が目に入ってくる。");
System.out.println("中には誰もいないようだ。");
というテキストがあったら、
System.out.println("あなたは小屋の扉のノブに手をかけた。");
input.nextLine();
System.out.println("…鍵はかかっていないようだ。");
input.nextLine();
System.out.println("音もなく扉は開き、中の様子が目に入ってくる。");
input.nextLine();
System.out.println("中には誰もいないようだ。");
という感じで、「input.nextLine();」を合間に挿入します。
これを実行すると、
と、まず最初の一行だけが表示されます。
ここで「Enter」キーを押すと、
と、2行目が表示されます。
さらに3行目、
4行目と、「Enter」を押すごとに表示されていきます。
ただし画像を見るとわかるように、この場合行間に1行分のスペースができています。
これは「System.out.println」というコード自体に「テキスト表示後に自動的に改行する」という仕様が入っているためです。この仕様がないとたとえば
1: あたりを見回す2: 衛兵に話しかける3: 衛兵を攻撃する
といった形で、別個で書いたテキストが改行されずに横にくっついて表示されることになります。
もしこの改行を無効化して、行間スペースなしの形にする場合は、
「System.out.println」を ⇒ 「System.out.print」
と書き換えます。最後の「ln(lineの略)」を取っただけです。
その形で実行すると、
このように一行ごとに詰まって表示されました。
この「Enter」改行方式の場合、以前と同じように一行ごとに「System.out.print」を書く必要があるのですが、実際に動かしてみると臨場感があってゲームっぽくてなかなかいい感じだと思いました。
この部分だけプログラムを書くとこんな感じになりました。
---------------------------------------------------------------------------------------------------------------------
import java.util.Scanner;
public class Raindia
{
Scanner input = new Scanner(System.in);
public static void main(String[ ]args)
{
Raindia game = new Raindia();
game.hut();
}
public void hut()
{
System.out.print("あなたは小屋の扉のノブに手をかけた。");
input.nextLine();
System.out.print("…鍵はかかっていないようだ。");
input.nextLine();
System.out.print("音もなく扉は開き、中の様子が目に入ってくる。");
input.nextLine();
System.out.print("中には誰もいないようだ。");
}
}
---------------------------------------------------------------------------------------------------------------------
ほとんど以前の書式の応用ですが、今回は街の門の前ではなく小屋が舞台なので、メソッドの名前を「townGate」から「hut」に変えてみました。それに伴い「game.townGate();」も「game.hut();」になっています。
あと一点変わったのは
「Scanner input = new Scanner(System.in); 」の書く場所です。
以前はメソッド(townGate)の中に書いていたのですが、「メソッドの中で作成した Scanner はそのメソッド内でしか使えない」ということがわかったので、書く場所を「public class Raindia」の中に変えました。
「public class Raindia」はすべてのメソッドの親玉みたいなものなので、ここに書いておけばどこのメソッドでもその Scanner を使用できるようです。
またこれは Scanner に限らず String などでも同様なので、頻繁に使用するものは「public class~」の中に書いておくものなのかな、といった印象を受けました。