超初心者が0からRPGを作る

ゲームプロデューサー志望が日々の悪戦苦闘を綴る。

冥き異界より目覚めよクラス【第玖歩】

週一更新、滑り込みでセーフ。HeptagonDだ。

家のネット環境が悪化しており、投稿が滞ってしまった…。

 

さて、今回でみっちりとした勉強はラスト。

その大トリを務めるのは「クラス」だ。

クラスと聞くと、真っ先に頭に浮かぶのは学校だが…おおよそ学校のクラスと同様の認識で構わない。

まずは、クラスの基本について学んでおくとする。

 

 

【王を従える者】

前回メソッドを使い、プログラムを部品化したことは覚えているだろうか。

クラスメソッドと同じく、部品化を手助けしてくれる。

多くの命令を一つにまとめたものがメソッドであったのに対し、クラスメソッドを一つにまとめたものなのだ。

今すぐには必要性は感じないかもしれないが、実際世に出回っているゲームなどのプログラムは膨大なメソッドを要する。

そうなると、やはりメソッドだけでは制作側も手に負えなくなってしまうわけだ。

いずれRPGを作ろうというのであれば、当然必要となってくるだろうな。

 

 

【甦る金字塔】

今回用意したコードは2つだ。というのも、2つのクラスを用いたプログラムだからである。

クラスが2つあるため、コンパイルもそれぞれに必要となることに気を付けよう。

前回同様コードの中をあちらこちらへ飛ぶが、適宜解説を加えるので安心してほしい。

 

まずは1つ目。mainメソッドのみからなるClassクラスだ。

 

public class Class
{
public static void main(String args)
{
String name = "";
while(name == ""){name = ClassSub.nameSelect();}
int answer = ClassSub.novel1(name);
if(answer == 1){ClassSub.novel2(name);}
if(answer == 2){ClassSub.novel3(name);}
}
}

 

そして2つ目はClassSubクラス。こちらは複数のメソッドで成り立っている。

 

public class ClassSub
{
public static String nameSelect()
{
System.out.println("主人公の名前を入力してください。");
String name = new java.util.Scanner(System.in).nextLine();
System.out.println(name + "でよろしいですか?");
System.out.println("1:はい 2:いいえ");
int answer = 0;
while(answer == 0){answer = option();}
if(answer == 2){name = "";}
System.out.println();
return(name);
}

public static int novel1(String name)
{
display(name + "……");
display(name + "!");
display(name + "ったら!");
display("いつまで寝てるの?");
display("いいかげん起きなさい!");
System.out.println("1:起きる 2:起きない");
int answer = 0;
while(answer == 0){answer = option();}
System.out.println();
return(answer);
}

public static void novel2(String name)
{
display("やっと起きたのね。");
display("そうそう、あの、幼馴染の発明好きな子……");
display("アラ、ど忘れしちゃったわ。なんていったっけ、あの子?");
}

public static void novel3(String name)
{
display("ああ、ルーンの鐘があんなに気持ちよさそうに歌ってる。");
display("どうせ昨夜、興奮して寝付けなかったんでしょ?");
display("ま、建国100年のお祭りだから無理ないけど……");
display("あんまり調子に乗ってハシャぎすぎるんじゃないわよ!");
display("さ、いいかげん起きなさい!");
}

public static void display(String content)
{
System.out.println(content);
String response = new java.util.Scanner(System.in).nextLine();
System.out.println();
}

public static int option()
{
int answer = new java.util.Scanner(System.in).nextInt();
if(answer != 1 && answer != 2)
{
System.out.println("※1か2を入力してください※");
answer = 0;
}
return(answer);
}
}

 

どこかで見たようなセリフがチラホラ見えた気がするが…

ともかく、詳しくコードを見ていこう。まずはClassクラスの頭からだ。

 

public class Class

 

こちらのクラス名は「Class」とした。

 

public static void main(String args)

 

メインメソッドの宣言だ。

メインメソッド一つのプログラムに一つ限りの物なので、ClassSubクラスにはメインメソッドが存在しないことに注意だ。

 

String name = "";
while(name == ""){name = ClassSub.nameSelect();}

 

文字列nameを初期化し、その値が空になっている間はClassSubクラスnameSelectメソッドを呼び出している。

実は同じクラスのメソッドを呼び出す際にはクラス名.の部分を省略できていたのだが、別クラスのメソッドを呼び出す際にはそのメソッドがどのクラスに所在しているかを正確に表してやる必要がある。

別クラスを呼び出すときには、以下のようにコードを書く。

 

クラス名.メソッド名(引数);

 

さて、それでは呼び出されたClassSubクラスnameSelectメソッドへ移ろう。

名前の通り、主人公の名前を決まるためのメソッドだ。

 

public static String nameSelect()

 

メソッドの定義だ。Classクラスmainメソッドへの戻り値にString型を指定している。

 

System.out.println("主人公の名前を入力してください。");

今後println文やprint文では必要のない限り、解説は省くことにする。

 

String name = new java.util.Scanner(System.in).nextLine();

1行分の入力を受け取り、変数nameへ格納している。

 

System.out.println(name + "でよろしいですか?");
System.out.println("1:はい 2:いいえ");

 

int answer = 0;
while(answer == 0){answer = option();}

整数の変数answerを初期化。

そして、answerの値が0である間、optionメソッドからの戻り値をanswerに代入することを繰り返している。

 

それでは、こちらもoptionメソッドへ移動しよう。

 

public static int option()

optionメソッド。戻り値はもちろんint型だ。

 

int answer = new java.util.Scanner(System.in).nextInt();

入力された整数をanswerに代入。

メソッドを移動したため、この変数answerは先程までの変数answerとは別物である。

 

if(answer != 1 && answer != 2)]

選択肢は1か2なので、それ以外の答えが返ってきた際には…

 

System.out.println("※1か2を入力してください※");
answer = 0;

answerを無効(0)にして、プレイヤーに文句をつける必要がある。

 

return(answer);

そして、answerの値を戻り値としてnameSelectメソッドへと返している。

 

それでは、戻ってnameSelectメソッドは9行目。

 

if(answer == 2){name = "";}

答えが「いいえ」の場合、nameの値を空にしておく。

こうすることでmainメソッドでの反復条件にひっかかり、もう一度nameSelectメソッドが呼び出される形になる。

 

System.out.println();
return(name);

そしてnameの値をmainメソッドへ返す。

 

さて、さらに戻ってClassクラスmainメソッド

 

int answer = ClassSub.novel1(name);

3つ目のanswerを宣言。さらにClassSubクラスnovel1メソッドnameの値を送り、返ってきた値を代入している。

 

再びClassSubクラスnovel1メソッド

 

public static int novel1(String name)

送られてきたString型の値を、こちら側で作った変数nameに代入した。

さらに、戻り値はint型を宣言している。

 

display(name + "……");
display(name + "!");
display(name + "ったら!");
display("いつまで寝てるの?");
display("いいかげん起きなさい!");

全てdisplayメソッドを呼び出す命令だ。

我ながら、ここはメソッドの力をフルに活用できた。

 

それでは自慢のdisplayメソッドへ。

 

public static void display(String content)

戻り値はなく(void)、送られてきた文字列をcontentとして受け取っている。

 

System.out.println(content);

受け取った値を表示。

 

String response = new java.util.Scanner(System.in).nextLine();

この入力には意味はないが、これを挟むことによって自動で文字が流れて行ってしまうのを防いでいる。

今回は省いているが、「Enterを押してください」などの表記があっても良いかもしれないな。

 

System.out.println();

何も出力せずに改行。

 

これでメソッドは終了だ。短い命令だが、何度も必要になってくるためこのメソッドを作ることでかなりコードを短くできたはずだ。

さて、それでは呼び出し元のnovel1メソッドへ帰ろう。

 

System.out.println("1:起きる 2:起きない");
int answer = 0;
while(answer == 0){answer = option();}

選択肢を表示し、ここでoptionメソッドを再利用。

メソッド化させることで、このように楽ができるな。

 

System.out.println();
return(answer);

改行して、answerの値を呼び出し元のmainメソッドへ返す。

 

それではmainメソッドへ。

 

if(answer == 1){ClassSub.novel2(name);}
if(answer == 2){ClassSub.novel3(name);}

answerが1ならnovel2メソッドを、2ならnovel3メソッドを呼び出す。

novel2、novel3メソッドは先程のdisplayメソッドを使って文を表示させるだけなので省く。

 

さて、以上となる。ついて来れただろうか。

ここまでできれば、かなりの物が作れるようになっているはずだ。

もちろんCUIであるというのはかなり痛いのだが、それでも遊び手が楽しめる物はいくらでも作ることができるはず。

次回は今までの集大成として第陸歩で作ったゲームを改良し、プログラミング編に一旦幕を下ろすとする。

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…もうすぐプログラム編もおしまいか…ちょっと寂しいな…

 

【次回はこちら】

「逃げる」ということ【第拾歩】 - 超初心者が0からRPGを作る

【前回はこちら】

主に仕える誠は固く【第捌歩】 - 超初心者が0からRPGを作る