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

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

主に仕える誠は固く【第捌歩】

紅茶の飲みすぎで机がカップだらけ、HeptagonDだ。

コーヒーも嫌いなわけではないが、紅茶の方が好きだな。

 

さて、今回学ぶのは「メソッド」。

今までで、一つのプログラムに同じようなコードを何度も書く必要があって面倒な思いをしたことはないだろうか。

あるいは、自分で書いたコードが長くなりすぎて理解が追いつかないということはなかっただろうか?

メソッドについて知れば、これらの問題を解決することができる。

コードの紹介…の前に、まずはメソッドの造りを知っておこう。

 

 

【主君と臣、そこに謀はなし】

このブログでは、今までのプログラムは全て「mainメソッド」という物にコードを書きこんできた。

mainメソッドは例えるなら主君だ。とある絶対王政の国の王を想像してみてくれ。

王は政治を取りはからうが、そのすべてを王自身が行うわけではない。

外交は外交の、財務は財務の、軍事は軍事の大臣なり将軍なりが取りまとめているな。

プログラムではmainメソッド以外のメソッドたちが家臣にあたることになる。

そして、メソッド毎に決められた仕事をこなしているのだ。

 

さて、それでは王の仕事は何だろうか。

それは臣たちに指示を出すことだ。

また、臣たちの提案や仕事を評価することも大切だ。

同様にmainメソッドでは、他のメソッドに指示を出し、他のメソッドから送られてきた情報を得るという流れが一般的なようだ。

細かい仕事は他のメソッドに任せて大局を動かすのがmainメソッドなのだな。

 

 

【偵察、魔王城】

さて、それでは今回のコードを見ていこう。

今回は王が魔王城付近の偵察を指示することを想定した内容となる。

軍隊に詳しい者には叱られるような内容もあるかもしれないが、あくまでサンプルであるため長い目で見てほしい。

 

public class Method
{
public static void main(String args)
{
System.out.println("王:魔王軍の動きが激しくなってきておるのう…");
System.out.println("王:A少将よ、魔王城北部の偵察をさせてまいれ。");
System.out.println();

majorGeneral("魔王城北部");

System.out.println("王:そうであったか…ご苦労。");
}

public static void majorGeneral(String place)
{
System.out.println("A少将:はっ、承知致しました。");
int nameInt = new java.util.Random().nextInt(2);
String detailPlace = "";
String situation = "";
switch(nameInt)
{
case 0:
System.out.println("A少将:B少尉!偵察小隊を動かせ!");
detailPlace = "森林";
System.out.println(place + "の" + detailPlace +"付近の偵察を任せた。");
situation = secondLieutenant("森林地帯");
break;
case 1:
System.out.println("A少将:C曹長!偵察分隊を動かせ!");
detailPlace = "渓谷";
System.out.println("A少将:" + place + "の" + detailPlace +"付近の偵察を任せた。");
situation = sergeantMajor("渓谷地帯");
break;
}
System.out.println();
System.out.println("A少将:偵察完了しました。");
System.out.println("A少将:" + situation + "とのことです。");
System.out.println();
}

public static String secondLieutenant(String place)
{
System.out.println();
System.out.println("B少尉:了解!ただちに向かいます!");
System.out.println();
System.out.println("B少尉:ただいま戻りました!");
System.out.println("B少尉:報告します。" + place + "にて巨大な魔法陣を確認。魔界と繋がっているものと見られます。");
return("森林にて魔界との門を確認");
}

public static String sergeantMajor(String place)
{
System.out.println();
System.out.println("C曹長:了解!ただちに向かいます!");
System.out.println();
System.out.println("C曹長:ただいま戻りました!");
System.out.println("C曹長:" + place + "、特に異常ありませんでした。");
return("渓谷地帯、特に異常なし");
}
}

 

それでは、早速詳細を見ていこう。

 

public class Method

今回のクラス名はそのまま「Method」とした。

Method.java」としてコンパイルしよう。

 

public static void main(String args)

これがmainメソッドの定義だ。

メソッドの定義の文は以下の通り。

 

public static 戻り値の型 メソッドの名前 (引数) {メソッドの仕事内容}

 

ここでの「戻り値」と「引数」に関してはこの後説明する。

その他は、今の段階では暗記してしまった方がよさそうだ。

mainメソッドに関してはあまり弄ることもないようなので、丸暗記でも問題ないだろう。

 

System.out.println(…);

もう言うまでもないな。

 

majorGeneral("魔王城北部");

ここで、後々定義している「majorGeneralメソッド」を呼び出している。

以前プログラムの文は上から下へ読まれると話したが、メソッドの定義においては順番は関係ない。

まず初めにmainメソッドが実行されていき、呼び出されたメソッド上だろうと下だろうと順番を無視してジャンプする、という解釈でいいだろう。

さて、メソッドを呼び出すには次のように記そう。

 

呼び出すメソッド名 (引数);

 

【君が賜うは引数】

引数(ひきすう)というのは、以前も話したが命令を実行する際に必要なデータだ。

ここではメソッドを呼び出す際に受け渡す情報のこと。

前に変数は、宣言したブロック内({と}の間)でしか使えないことを説明したな?

呼び出されたメソッドはもちろんブロック外だ。

そのため、呼び出し元のメソッドから呼び出し先のメソッドへ変数の値などを送るためにはこのような形をとる必要があるのだ。

引数は(A,B,C…)とすることで複数送ることも可能だ。

さて、それではmajorGeneralメソッドが呼び出されたのでそちらへ移ろう。

 

 

public static void majorGeneral(String place)

majorGeneralメソッドの定義だ。

()内で引数を受け取るString型変数placeを用意していることがわかるだろうか。

 

System.out.println(…);

 

int nameInt = new java.util.Random().nextInt(2);

0か1の乱数を発生。

 

String detailPlace = "";
String situation = "";

次のswitch文で使用する変数を前もって初期化している。

 

switch(nameInt)

先程の乱数によって0か1に分岐。

 

case 0:
System.out.println("A少将:B少尉!偵察小隊を動かせ!");
detailPlace = "森林";
System.out.println(place + "の" + detailPlace +"付近の偵察を任せた。");

乱数が0だった場合の処理だ。今回は1だった場合の処理の解説は省く。


situation = secondLieutenant("森林地帯");

少しわかりづらいが、赤文字の部分に注目してほしい。

そう、ここでsecondLieutenantメソッドを呼び出しているのだ。

mainメソッド(王)がmajorGeneralメソッド(少将)に命令を出すように、majorGeneralメソッドsecondLieutenantメソッドに命令を下すことができる。

つまり、mainメソッド以外のメソッドでも他のメソッドを呼び出すことが可能なのだ。

また、

 

変数 = メソッド名(引数);

 

とすることで、呼び出したメソッドから返ってきた情報(戻り値)を変数に格納することができるのだ。

それでは、呼び出されたsecondLieutenantメソッドへ移ろう。

 

 

public static String secondLieutenant(String place)

またしてもString placeを使用しているが、前メソッドで使用していたplaceはブロック外。

ということで、先程のplaceとここのplaceは別の変数ということになる。

また、今回は普段「void」となっているところが「String」となっているな?

ここで返す戻り値の型を宣言している。もちろん戻り値はこの型に合っていなければならないぞ。

また、戻り値が無い場合はvoidとなっているようだな。

 

System.out.println(…); ×5

 

return("森林にて魔界との門を確認");

ここで出てきたのが「戻り値」。

何度も言うが、呼び出し元のメソッドへ返すのことだ。

今回はString型のため、文字列をmajorGeneralメソッドへ返すことになる。

 

また、return();が登場することでメソッドの実行は完了となり、呼び出し元へ返ることになるぞ。

それでは、呼び出し元のmajorGeneralメソッドへ戻ろう。

 

break;

switch文から抜け出した。

二度目にはなるが、今回はcase 1:は省略する。

 

System.out.println(…); ×4

 

さて、ここでmajorGeneralメソッドが終了した。

returnを使わずとも、メソッドが終了すると呼び出し元へ返るぞ。

 

System.out.println("王:そうであったか…ご苦労。");

まさにここまでご苦労だった。今回のソースコードは以上となる。

 

 

さて、どうだっただろうか。メソッドについてわかってきただろうか。

 少しばかり難しい内容もあったが、実際に使っていけば覚えられるはず。

まずは新しく学んだことを活かして、一つプログラムを組んでみてはどうだろうか。

 

次回はさらにメソッドの上、クラスについて学んでいく。

ここまでできれば、複雑なプログラムも時間をかければ作ることができるはずだ。

クラスについて学んだ後はもう一度自由にプログラムを組み、プログラム編に一旦区切りをつけようと思うぞ。

 

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

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

 

…やっぱり紅茶美味しい…ズズズッ

 

【次回はこちら】

Comming soon!

【前回はこちら】

全ての要素、集う刻【第漆歩】 - 超初心者が0からRPGを作る