1976年生まれのプログラミング初心者のゲーム制作日記

ひょんなことからJavaでゲームを作ることになり、その過程を記しています。

テキストアドベンチャーゲームを作る 8

< Enter キーを押すごとに新しいテキストを表示させる>

f:id:ryisnow:20150611175710j:plain



改行コードを使い、テキストの見栄えもよくなってきたのですが、今度は「テキストを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();」を合間に挿入します。
これを実行すると、

f:id:ryisnow:20150611174017j:plain

と、まず最初の一行だけが表示されます。

ここで「Enter」キーを押すと、

f:id:ryisnow:20150611174055j:plain

と、2行目が表示されます。

f:id:ryisnow:20150611174312j:plain
さらに3行目、

f:id:ryisnow:20150611174334j:plain

4行目と、「Enter」を押すごとに表示されていきます。

ただし画像を見るとわかるように、この場合行間に1行分のスペースができています。

これは「System.out.println」というコード自体に「テキスト表示後に自動的に改行する」という仕様が入っているためです。この仕様がないとたとえば

1: あたりを見回す2: 衛兵に話しかける3: 衛兵を攻撃する

といった形で、別個で書いたテキストが改行されずに横にくっついて表示されることになります。

もしこの改行を無効化して、行間スペースなしの形にする場合は、

「System.out.println」を ⇒ 「System.out.print」

と書き換えます。最後の「ln(lineの略)」を取っただけです。

その形で実行すると、

f:id:ryisnow:20150611175603j:plain

f:id:ryisnow:20150611175616j:plain

このように一行ごとに詰まって表示されました。

この「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~」の中に書いておくものなのかな、といった印象を受けました。







テキストアドベンチャーゲームを作る 7

<改行コードを使う>

f:id:ryisnow:20150611165850j:plain



String を覚えていろいろできるようになり、今度はもう少しテキストの見栄えをよくしたいという欲求が出てきました。


そこで「\n」という改行コードを使いました。

これまでテキスト一行ごとに「System.out.println」と打ち込み、何もない空白行を挿入したいときは「System.out.println("")」という風に打ち込んでいたのですが、この「\n」を使うことでこれらの書き方を大分簡略化できました。

たとえば


        System.out.println("");
        System.out.println("");
        System.out.println("あなたは酒場の前にいる。");
        System.out.println("中に入りますか?");


       
というプログラム文は、「\n」という改行コードを使えば


        System.out.println("\n\nあなたは酒場の前にいる。\n中に入りますか?");



という風に簡略化することができます。「\n」が書かれている場所で改行が行われる、という意味で、結果的に画面に表示されるテキストはまったく同じです。

これを使えば一連のテキストにおいては「System.out.println」を一回だけ書けば済むことになります。

テキストが長くなって一行にずらーっと書いていくのは見づらい、という場合は、


         System.out.println("\n\nあなたは酒場の前に立っている。\n"
                + "中からは人々の話し声と、フィドルを奏でる音が聞こえてくる。\n"
                + "あるいはここで魔術師に関する情報が得られるかもしれない。\n"
                + "中に入りますか?");

 


といった風に「+」を使うことで行をわけて書くこともできるようです。
これだと実際に表示されるレイアウトも想像しやすくなります。

(実際の画面)

f:id:ryisnow:20150611165841j:plain









テキストアドベンチャーゲームを作る 6

<String で武器や防具を管理>

f:id:ryisnow:20150602210809j:plain


選択肢や自分の名前を格納するために使ったString(ストリング)ですが、仕組みを理解するにつれ、ゲームを作るにおいてとても便利なものであることがわかってきました。

これまでに作ったStringは、

String number
String playername

という2種類ですが、

たとえば自分が今どんな装備品を持っているか、というデータを格納するために、

String weapon とか、
String armor

なんていうStringを作ることもできます。

たとえばこんな感じで…

-------------------------------------------------------------------------------------------------------------------------


public class Raindia
{
    public static void main(String[ ]args)
    {
        Raindia game = new Raindia();
        game.start();        
    }
    
    public void townGate()
    {
        System.out.println("");
        System.out.println("");
        System.out.println("長い旅の果てに、あなたは小さな町の門にたどり着いた。");
        System.out.println("門の前には衛兵が1人立っている。");

        String weapon = "ナイフ";                
        String armor = "革のチュニック";
        
        System.out.println("");
        System.out.println("あなたの現在の武器=" + weapon);
        System.out.println("あなたの現在の防具=" + armor);

    }
}

---------------------------------------------------------------------------------------------------------------------


これを実行するとこんな感じに表示されます。

f:id:ryisnow:20150602204257j:plain

 

String weapon = "ナイフ";

という文の意味は「weaponという名の器(String)に"ナイフ"というテキストを格納する」といった感じです。

選択肢や名前のときはキーボードで任意のデータを入力して、それを格納しましたが、今回はその格納するテキストをあらかじめ指定している形です。

「String armor」に関しても同じ仕組みです。

そして「weapon」と「armor」と名づけた2つの器にテキストデータを格納したところで、その後に書かれている

System.out.println("あなたの現在の武器=" + weapon);

を使ってその内容を実際に表示させています。「""」でくくって直接打ち込んだテキストと、Stringの名前を組み合わせるのは前回と同じです。

こんなまどろっこっしいことをしないで直接

System.out.println("あなたの現在の武器=ナイフ");

と書けばいいのに、と最初は思うんですが、
たとえば装備している武器や防具というのはゲーム中に変わったりもします。また、どのようにプレイするかによってプレイヤーごとに持っている装備も変わったりもします。

しかしこうした器という形で用意しておけば、装備が変わった際にこの「weapon」や「armor」の器の中身だけを変えてやればよく、そのほうがいろいろ手間が省けていろいろ便利である、ということがわかってきました。

たとえば「ナイフを持っていたが、その後にロングソードを手に入れて武器がロングソードになった」場合、こんな風に書くことができます。

---------------------------------------------------------------------------------------------------------------------

public class Raindia
{
    public static void main(String[ ]args)
    {
        Raindia game = new Raindia();
        game.start();        
    }
    
    public void townGate()
    {
        System.out.println("");
        System.out.println("");
        System.out.println("長い旅の果てに、あなたは小さな町の門にたどり着いた。");
        System.out.println("門の前には衛兵が1人立っている。");
        
        String weapon = "ナイフ";
        String armor = "革のチュニック";
        
        System.out.println("");
        System.out.println("あなたの現在の武器=" + weapon);
        System.out.println("あなたの現在の防具=" + armor);        
        System.out.println("");
        System.out.println("…地面に誰かが捨てたロングソードが落ちている。");
        System.out.println("あなたはナイフをしまい、ロングソードを手に取った。");
        
        weapon = "ロングソード";
        
        System.out.println("");
        System.out.println("あなたの現在の武器=" + weapon);
        System.out.println("あなたの現在の防具=" + armor);
    }
}

----------------------------------------------------------------------------------------------------------------------

実行結果はこんな感じです。

f:id:ryisnow:20150602210809j:plain

 

現在の武器と防具を表示させるプログラム文は1回目も2回目もまったく同じに書かれていますが、String「weapon」の内容が途中で書き換えられたため、表示されるテキストもナイフからロングソードに変わりました。

その武器の内容を書き換えた文章が

weapon = "ロングソード";

です。
ここでのポイントは最初の

String weapon = "ナイフ";

とは違い、頭に「String」がついていないということでしょうか。

この頭の「String」というのは最初に器を作る時だけ書く必要があり、すでに存在している器を再び呼び出す場合は器の名前だけ書けばよい、というルールになっているようです。Scannerでも最初に「Scanner input」と書いて、その後は「input」だけ書けばよかったのと同じような原理だと思います。

プレイヤーの名前、装備品、その他いろいろなものにこのStringは応用できるので、これなくしてテキストアドベンチャーRPGは作れないといってもよいくらい重要なもののように感じます。

しかし、こういう仕組みを最初に考えた人ってのはすごいなと思います。







テキストアドベンチャーゲームを作る 5

<自分の名前を入力してゲーム内で使うには>

f:id:ryisnow:20150602185841j:plain



ゲームと言えば自分の名前を入力してプレイすることが多いものだと思います。
というわけで、分岐の次は自分の名前を入力してそれをプログラムに認識させるというコードを書くことにしました。

これもオンラインでやり方を学んだのですが、前回の選択肢を選ぶ際に使った「String(ストリング)」を応用することで、自分の名前を入力して管理できることがわかりました。

それに加えて既存のテキストを少し修正した結果、全体としてはこのように変わりました。

-----------------------------------------------------------------------------------------------------------------------

 

import java.util.Scanner;

public class Raindia
{
    public static void main(String[ ]args)
    {
        Raindia game = new Raindia();
        game.start();        
    }
    
    public void townGate()
    {
        System.out.println("");
        System.out.println("");
        System.out.println("長い旅の果てに、あなたは小さな町の門にたどり着いた。");
        System.out.println("門の前には衛兵が1人立っている。");
        System.out.println("どうしますか?");
        System.out.println("");
        System.out.println("1: あたりを見回す");
        System.out.println("2: 衛兵に話しかける");
        System.out.println("3: 衛兵を攻撃する");
        System.out.println("");
        
        Scanner input = new Scanner(System.in);
        
        String number = input.next();
        
        if(number.equals("1"))
        {
            System.out.println("衛兵があなたを見ている。");
            townGate();
        }
        if(number.equals("2"))
        {
            System.out.println("<衛兵>");
            System.out.println("旅人か? 見慣れない顔だな。");
            System.out.println("名前はなんと言う?");
            
            String playername = input.next();
            
            System.out.println("");
            System.out.println("<衛兵>");
            System.out.println(playername + "?");
            System.out.println("このあたりでは聞きなれない名前だな。");
            
            townGate();
        }
        if(number.equals("3"))
        {
            System.out.println("<衛兵>");
            System.out.println("なんだお前は!");
            System.out.println("");
            System.out.println("あなたは懸命に戦った。");
            System.out.println("しかし空腹のあなたに勝ち目はなかった。");
            System.out.println("あなたは衛兵に殺されてしまった。");
            System.out.println("GAME OVER");            
        }
    }
}

 

---------------------------------------------------------------------------------------------------------------------

 

今回新しく追加したのは:

・冒頭テキスト(長い旅の果てに~)の前に「System.out.println("");」を2行。
・選択肢1~3の前後に「System.out.println("");」を1行ずつ。
・「衛兵があなたを見ている」の後に「townGate();」という一文。

そして、
・「見慣れない顔だな」の後から続く、

 System.out.println("名前はなんと言う?");
 String playername = input.next();
            
 System.out.println(playername + "?");
 System.out.println("このあたりでは聞きなれない名前だな");
            
 townGate();

という文です。


まず最初のほうに追加した4つの「System.out.println("");」はテキストの見栄えをよくするためのいわば空白行です。

そして「townGate();」というのは、ここに到達するとこのメソッド「public void townGate()」の先頭に戻る、といった意味になります。

前回のプログラムでは、たとえば選択肢の「1」を選択した際に
「衛兵があなたを見ている」
というテキストが表示され、そこでプログラムが終わってしまいました。

しかし今回この「townGate();」が書かれたことで、テキストが表示された後にメソッドの先頭に戻るようになりました。

実際にプログラムを実行してみるとこんな感じです。

f:id:ryisnow:20150602181425j:plain

まず冒頭。空白行が入ったことで見た目が少しよくなりました。

f:id:ryisnow:20150602184026j:plain

そして選択肢の「1」を選ぶと、

f:id:ryisnow:20150602184019j:plain

「衛兵があなたを見ている」というテキストが表示され、さらに「townGate();」によってメソッドの冒頭に戻るため、再び冒頭のテキスト+選択肢が表示されます。ループした感じです。

これによって、もう一度選択肢を選ぶことができます。
これが前半の修正部分の結果です。


そして、メインテーマである「自分の名前を入力する」というパートですが、
僕は衛兵から名前を聞かれて答える、という形でプレイヤー名を入力することにしました。

そこでまず「名前はなんと言う?」という衛兵の台詞を一行追加し、
続いて

String playername = input.next();

という一文を追加しました。

これは前回選択肢を入力するために書いた

String number = input.next();

とほぼ同じような形式で、任意でつける名前の部分を「number」から「playername」に変えただけです。これで「playernameという名の別の器を新しく作り、そこにキーボードから入力された文字を格納する」といった感じの意味になりました。

実際に実行してみるとこんな感じです。

f:id:ryisnow:20150602185356j:plain

まず選択肢から「2」を選択して、

f:id:ryisnow:20150602185439j:plain

衛兵が名前を尋ねてくるので、キーボードで任意の名前を入力します。

f:id:ryisnow:20150602185520j:plain
(このプログラムは「コマンドプロンプト」というウィンドウズに最初から入っている機能を使って実行しているのですが)どうもここでは全角入力ができない(?)ようなので、とりあえず半角英数で名前を入力。

f:id:ryisnow:20150602185841j:plain

するとこんな風に表示されます。
衛兵が「Pazu?」と入力した名前を聞き返し、
次のテキストが表示され、
さらにその後に書かれている「townGate();」によってまた冒頭に戻っています。

この衛兵が入力した名前を聞き返すところですが、プログラムでは、

System.out.println(playername + "?");

となっています。

これまでと同じような「System.out.println」ですが、カッコの中身が少し違っています。

最初の「playername」は名前が格納されている器(String)の名前なので、ここでは画面に「playername」とそのまま表示されるのではなく、キーボードで入力して器に格納されたテキスト内容(=この場合は「Pazu」)が表示されます。

これまでテキストを表示させる際はすべて「""」でくくってきましたが、Stringのような器の名前を書く場合は「""」でくくらない、というのがルールのようです。

そのためまず「playername」という、器の名前をそのまま書き、その後に半角の「+」でつなげる形で「"?"」と書いています。このように「+」使ってつなげることで、「""」の中に直に書くテキストと、テキストが格納されている器の名前を一緒に使ってひとつの文章を表示させることができるようです。

なのでたとえば

System.out.println("そうか、お前の名前は" + playername + "というのか。");

といった書き方もできます。こうすると実際の画面には

「そうか、お前の名前はPazuというのか。」

といった形で表示されます。
もちろん別の名前を入力していれば、「playername」の部分が別の名前に置き換えられます。

なんだかまどろっこしい書き方、ですが、こういう形にすることでいろいろな応用ができて便利だということがやっているうちにわかってきました。

 







テキストアドベンチャーゲームを作る 4

<キーボードから数字を入力>

 

f:id:ryisnow:20150520181823j:plain


Scannerを使う準備が整ったので、次は「キーボードで1~3の数字が入力された後の処理」を書く必要がありました。

全部を書くとこのようになりました。
-------------------------------------------------------------------------------------------------------------------

import java.util.Scanner;

public class Raindia
{
    public static void main(String[]args)
    {
        Raindia game = new Raindia();
        game.townGate();        
    }
    
    public void townGate()
    {
        System.out.println("長い旅の果てに、あなたは小さな町の門にたどり着いた。");
        System.out.println("門の前には衛兵が1人立っている。");
        System.out.println("どうしますか?");
        System.out.println("1:あたりを見回す");
        System.out.println("2:衛兵に話しかける");
        System.out.println("3:衛兵を攻撃する");
        
        Scanner input = new Scanner(System.in);
        
        String number = input.next();
        
        if(number.equals("1"))
        {
            System.out.println("衛兵があなたを見ている。");
        }
        if(number.equals("2"))
        {
            System.out.println("衛兵: 旅人か? 見慣れない顔だな。");
        }
        if(number.equals("3"))
        {
            System.out.println("衛兵: なんだお前は!");
            System.out.println(" ");
            System.out.println("…あなたは懸命に戦った。");
            System.out.println("しかし空腹のあなたに勝ち目はなかった。");
            System.out.println("あなたは衛兵に殺されてしまった。");
            System.out.println("GAME OVER");          
        }
    }
}

-------------------------------------------------------------------------------------------------------------------

一気にいろいろ増えましたが…今回新しく追加されたのは「String number = input.next();」以下の文です。

まず追加された1行目「String number = input.next();」ですが、これは

「Scannerが読み取るキーボードからの入力情報を、numberと名づけた器に格納する」
といった意味のようです。

「String(ストリング)」というのは「テキスト情報を格納する器」のようなもので、「number」というのはその器に僕が今回任意につけた名前です。
ここではキーボードで押された「1~3」の数字を格納するためにこうした名前にしましたが、好きな名前をつけられるので、

String sentakushi = input.next(); でも、
String choice = input.next(); でも、なんでも大丈夫です。


いずれにせよこうした器をまず用意し、そこにScannerで読み取った入力情報を格納します。その読み取り指令が「=」の右側の「input.next();」になります。

「input」というのは前回作成したScannerの名前です。基本的に一旦名前をつけて宣言した以降は「Scanner」とは書かず、自分がつけた名前を使うようです。

そして「input.next()」は「Scannerが読み取るキーボードからの入力情報」といった意味となります。

たとえばキーボードで「1」と入力した場合、「number」という器の中に「1」という情報が格納されます。



こうして格納された数字をもとに、どの分岐に進むのかを選択することになります。そしてそれがその後に書かれている
if(number.equals("1"))
if(number.equals("2"))
if(number.equals("3"))という3種類の文につながっています。

if(number.equals("1"))というのは、

「もしnumberに格納された情報が1だった場合」という意味です。

なのでもしキーボードで「1」と入力した場合は、その下にある
「衛兵があなたを見ている。」
というテキストが画面に出力されます。

「2」を入力したした場合は、
「衛兵: 旅人か? 見慣れない顔だな。」
というテキストが画面に出力されます。

「3」を入力した場合は、ゲームオーバーです。

プログラムを実際に実行してみると、まずこのような画面が表示されます。

f:id:ryisnow:20150520181823j:plain


キーボードで「1」を入力すると、

f:id:ryisnow:20150520181850j:plain


「2」を入力すると、

f:id:ryisnow:20150520181907j:plain


「3」を入力すると、

f:id:ryisnow:20150520181924j:plain


このようになります。
このような形でとりあえず僕はストーリーを分岐させることができました。












テキストアドベンチャーゲームを作る 3

<キーボードの入力を読み取る>

 

「townGate」という新たなメソッドを作った後は、次のようにプログラム文を書き足しました。

-------------------------------------------------------------------------------------------------------------------

import java.util.Scanner;

public class Raindia
{
    public static void main(String[]args)
    {
        Raindia game = new Raindia();
        game.townGate();        
    }
    
    public void townGate()
    {
        System.out.println("長い旅の果てに、あなたは小さな町の門にたどり着いた。");
        System.out.println("門の前には衛兵が1人立っている。");
        System.out.println("どうしますか?");
        System.out.println("1:あたりを見回す");
        System.out.println("2:衛兵に話しかける");
        System.out.println("3:衛兵を攻撃する");
        
        Scanner input = new Scanner(System.in);
    }
}

--------------------------------------------------------------------------------------------------------------------
新たに追加されたのは

・冒頭の「import java.util.Scanner;」という1行
・「townGate」メソッドの中の4行
・「Scanner input = new Scanner(System.in);」という1行

です。

まず「townGate」メソッドの中に1から3の番号を振った選択肢を書きました。まずこう書いて選択肢をプレイヤーに提示し、後でキーボードから番号を入力することで選択肢を選べるようにしようと思ったのです。

ただそのためには「キーボードからの入力を読み取るためのプログラム」を書く必要があります。

そこで登場するのが「Scanner(スキャナー)」というJavaの機能である…ということを僕は以前に述べたレクチャーで学んでいました。

Scannerにはキーボードから入力した情報を読み取る機能があります。

その場合まず、このプログラム上でScannerを使用しますよ、ということを宣言する必要があるのですが、それはこんな風に書きます。

Scanner input = new Scanner(System.in);

これでキーボードによる入力をScannerが読み取りますよ、という意味になるようです。

正確に言うと「input」のところは自分の好きな名前をつけられます。たとえば

Scanner yomikomi = new Scanner(System.in); でも、
Scanner myscanner = new Scanner(System.in); と書いても大丈夫です。

そして(System.in)というのが“情報を読み取る”ことを意味しているようです。文字を出力するときは「System.out.println」と書いたので、その逆みたいな感じでしょうか。

この一行全体で何を意味しているか、理解できている範囲で整理すると、

“読み取りの機能(System.in)を持ったScannerに「input」という名前をつけて使うことを宣言した”

みたいな感じでしょうか。Scannerに限らず、プログラム内でこうした新しい機能の使用を宣言するときは基本的に任意の名前をつけて「= new」という書き方をすることが多いようです。このへんのフォーマットは僕も最初はよくわからず丸写しのように書いていましたが、何度も書いているうちに少しずつ法則がわかっていった感じです。

そしてScannerを使うための最後の仕上げとして、プログラムの一番最初に

import java.util.Scanner;

という「インポート文」なるものを書きます。

冒頭のインポート文「import java.util.Scanner;」は、
「“java” の “util(ユーティリティ)” カテゴリーの中にある “Scanner” をこのプログラムで使用するためにインポートします」といった意味のようです。ScannerのようにJavaに最初から組み込まれている機能を使う場合は基本的にこうしてインポート文というのを冒頭に書かないと使用できない決まりのようです。

ともあれ、これでようやくScannerを使う準備がすべて整いました。








テキストアドベンチャーゲームを作る 2

<ストーリーの分岐を作るには>

 

「System.out.println」でテキストを表示させることはできる。
では次に必要なのは何か? それは「分岐だ!」と僕は考えました。

プレイヤーが選んだ選択肢によってストーリーが変わるというやつです。

ゲームブックにおける基本でもあり、
「あなたの目の前で道が二手に分かれている。左に行くか、右に行くか?」
みたいなやつです。

ただそうした分岐の作成に取りかかる前に、僕はまずこのようにプログラムを書き直す必要がありました。

------------------------------------------------------------------------------------------------------------------- 

public class Raindia
{
    public static void main(String[ ]args)
    {
         Raindia game = new Raindia();
         game.townGate();       
    }
    
    public void townGate()      
    {
        System.out.println("長い旅の果てに、あなたは小さな町の門にたどり着いた。");
        System.out.println("門の前には衛兵が1人立っている。");
     }
}

------------------------------------------------------------------------------------------------------------------- 

 
5行目と6行目に新しい文
Raindia game = new Raindia();)
game.townGate();  
が追加され、以前に書いた台詞は新しく書かれた「public void townGate()」というものの下に移動しています。ちなみにこの「public void」というのはとりあえず決まり文句的なもので、「townGate」というのは僕が任意につけた名前です。

上に書かれている内容を自分なりにざっくり整理すると、

・「public static void main~」や「public void townGate」などはプログラムのセクション的なもの(正式には“メソッド”と言う)の名前。

・メソッドは { で始まり、 } で終わる。つまり{ }でくくられた範囲がそのメソッドの範囲。

・「長い旅の果てに~」から始まるテキストは「townGate」というメソッドの中に属している。

・プログラムは実行すると基本的にメイン・メソッドと呼ばれる「public static void main(String[ ]args)」の中から処理される。

・上のプログラム文では、「public class Raindia」という親セクション(クラス)がまずあり、その中に「public static void main(String[ ]args)」と「public void townGate() 」というふたつのセクション(メソッド)が入っている。



ではなぜ「townGate」という新しいメソッドを作ってその中にテキストを移動したのか?

その理由は…メイン・メソッド(public static void main~)の中では行えることがある種限定されていて、僕がやろうとした分岐のプログラムはこの中に書いてもうまくいかないということがわかったからです。そしていろいろ調べた結果、こういう風に書くとうまくいく、ということがわかりました。
(これ以上の説明は残念ながら現在の自分の知識ではできません)

この5行目と6行目に書かれているプログラム文によって「public static void main~」から「public void townGate」へと移動している、といった感じでしょうか。

「Raindia game = new Raindia();」や「game.townGate(); 」が何を意味するのか、当時の僕にはわかっておらず(いや、正直今でもちゃんと説明できるほどにはわかってません)、他の方が書いていたプログラムをなぞるように書いただけです。