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

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

テキストアドベンチャーゲームを作る 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」の部分が別の名前に置き換えられます。

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