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

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

全ての要素、集う刻【第漆歩】

新・世界樹の迷宮3はまだか、HeptagonDだ。

3の曲は好きな物が多いから、ぜひリメイクしてほしい…。

 

さて、今回学ぶのは「配列」だ。

基本的には「いくつかの変数をまとめたもの」と認識してもらって構わない。

これがあるとコードが大幅に短くできるので、ぜひ覚えておこう。

 

ところで、今回の内容からは完全に自分の知識外となる。

予習・復習・実行と記事の記入を同時にこなしていかなければならないため、少々更新ペースが落ちてしまうかもしれない。

そのため今回からは先に自分が作ったソースコードを紹介し、その解説という形で綴っていくことにするぞ。

 

 

さて、それでは早速コードを見てみよう。

今回は、複数の敵に対して主人公が全体攻撃を放ったことを想定してプログラムした。

 

public class Array
{
public static void main(String args)
{
String heroName = "アルフ";
String heroLethalTec = { "ラインスラッシュ","インパクトエッジ","メテオブレード","ホーリーレイ"};

int heroAttack = 50;
int heroMagic = 40;
int heroPMagnification = { 200 , 450 , 400 , 0 };
int heroMMagnification = { 0 ,
 0 , 200 , 300 };

int eCode = { 0, 1, 2, 3, 4, 5 };
String enemyName = { "ゴブリン","コボルト","オーク","スライム","ドラゴン","ゴースト" };

int enemyPDefence = { 10, 13, 33, 210, 88, 1000 };
int enemyMDefence = { 9, 11, 13, 8, 62, 100 };

int enemyHP = { 50, 50, 100, 20, 150, 1 };

int heroAction = new java.util.Random().nextInt(4);
System.out.println(heroName + "は" + heroLethalTec[heroAction] + "を放った!" );
System.out.println();

for(int i = 0; i < eCode.length; i++ ){
int PDamage = heroAttack * heroPMagnification[heroAction] / 100 - enemyPDefence[i];
if(PDamage < 0){
PDamage = 0;
}
int MDamage = heroMagic * heroMMagnification[heroAction] / 100 - enemyMDefence[i];
if(MDamage < 0){
MDamage = 0;
}
int damage = PDamage + MDamage;

int damageDeflection = new java.util.Random().nextInt(40);
damageDeflection += 80;
damage = damage * damageDeflection / 100;

if(damage > 0){
System.out.println( enemyName[i] + "に" + damage + "のダメージを与えた!" );
}
else {
System.out.println( "ミス!" + enemyName[i] + "にダメージを与えられない!" );
}
enemyHP[i] -= damage;
if(enemyHP[i] <= 0){
System.out.println( enemyName[i] + "を倒した!");
}
System.out.println();
}
}
}

 

コピー&ペーストの影響で{と}の位置がよくわからないことになってしまっているが、コンパイル自体には問題ない。

ただし実際にコードを書く際には、読みやすくわかりやすいものとなるように心がけよう。

また、例によって下線部は変更可能だ。自由に変えて遊んでみてほしい。 

 

さて、それでは順を追って解説していくぞ。

 

public class Array

今までスルーしてきたが、一行目のここでは「クラス」という物を定義している。

クラスについては後々勉強するが、public classの後ろの「Array」というのがクラスの名前だ。

プログラムをコンパイルする際には「クラス名.java」と名付けておこう。

今回で言えば「Array.java」となるな。

 

public static void main(String args)

ここでは「メソッド」という物を定義している。

クラスと違って必ず「main メソッド」が必要なので、今はここは弄らないように。

 

String heroName = "アルフ";

主人公の名前を「アルフ」としている。

現在アイコン等にもなっている朱色の髪の青年「アルフレッド」君の愛称だ。

 

【配列、要素を従えて】

String heroLethalTec = {…};

ここで初登場したのが配列

具体的には、String型の配列heroLethalTec(主人公の技)の4つを初期化している。

配列の初期化の文は以下の通りだ。

 

要素の型[] 配列の名前 = {要素0,要素1,要素2,要素3,…};

はてブロの仕様上(?)全角の角括弧[]を使っているが、本来は半角

 

配列では複数の値を格納することができる変数のようなものだ。

(正確には変数ではないが、ここでは便宜上変数と同様と記した。)

そして、配列に格納される値の入る箱一つ一つを要素という。

箱である変数には型があったな?同様に要素にも型があるため、最初にそれを宣言している。

また、配列毎に型の宣言が必要ということはつまり、同じ配列の要素は全て同じ型である必要があるのだ。

例えば、今回の例のコードでは主人公の技の名前4つは全てString型だ。

 

 

int heroAttack = 50;

int heroMagic = 40;

主人公の攻撃力と魔力を初期化している。

 

int heroPMagnification = {…};

int heroMMagnification = {…};

ここでも配列が登場。それぞれの技の倍率を示している。

ここではPはphysical、MはMagicalの略。

物理、魔法属性それぞれの倍率を計算させているわけだ。

 

int eCode = {…};

String enemyName = {…};

int enemyPDefence = {…};

int enemyMDefence = {…};

int  enemyHP = {…};

さらに配列が続けざまに現れる。

上から順に、敵の順番、名前、物理防御、魔法防御、体力だ。

 

int heroAction = new java.util.Random().nextInt(4);

乱数heroActionを発生させている。

今回は、4つの技からランダムで使用することとした。

 

【配列、要素を抜き出して】

System.out.println(… + heroLethalTec[heroAction] + …);

ここで、配列の中の要素を抜き出して表示している。

具体的には、配列heroLethalTecの中の0~3のどれかの技を放ったことを表示していることになる。

特定の要素を表すコードは以下の通り。

 

配列の名前[要素の番号]

 

例えば今回のコードではheroAction(先程発生させた乱数)が2なら、配列内の2番目…ではなく、3番目の要素が抜き取られる。

これは乱数の上限を決める際にも0からだったのと同様に、要素0から数え始められるためだ。

 

 

System.out.println();

何もせずに改行させている。

 

【要素、その総は】

for(int i = 0; i < eCode.length; i++)

for文で、処理を繰り返している。

条件式の中に「eCode.length」とあるが、これは配列eCodeの中に入っている要素の数を表している。

配列の要素の数を取得する文は以下の通り。

 

配列の名前.length

 

eCodeの中には6つ要素が入っているので、ここではi < 6;と同義だ。

よって、iが0~6である間…つまり6回、処理を繰り返すことになるな。

 

 

int PDamage = heroAttack * heroPMagnification[heroAction] /100 -enemyPDefence[i];

ここで基本物理ダメージの計算がなされている。

主人公の攻撃力に使用する技の倍率補正の1/100がかけられ、i…つまり、現在処理中の敵の防御力分マイナスされている。

 

if(PDamage < 0){PDamage = 0;}

物理ダメージがマイナスになってしまう場合、0にしている。

この命令が無ければ、マイナス分相手の体力を増やしてしまうことになる。

 

int MDamage…

if(MDamage < 0)…

先程の処理の魔法ダメージ版だ。

 

int damage = PDamage + MDamage;

ここで物理ダメージと魔法ダメージを合計し、基本ダメージを算出する。

 

int damageDeflection = new java.util.Random().nextInt(40);

damageDeflection + 80;

80~120の乱数の発生。これがダメージを上下させる乱数となる。

 

damage = damage * damageDeflection / 100;

乱数によりダメージが0.8倍~1.2倍の振れ幅を持った。

 

if(damage > 0){…}

ダメージがあれば与ダメージの表記を

else{…}

与えられなければミスの表記を出力。

 

enemyHP[i] -= damage;

処理中の敵の体力をダメージ分減らす。

 

if(enemyHP[i] <= 0){…}

体力が0以下になったとき、倒したことを表記。

 

System.out.println();

 

 

以上になる。

どうだろうか。配列については理解できただろうか?

さらに言えば配列配列などという物もあるようだが、また機会があれば勉強してみよう。

 

さて、次回は「メソッド」について学ぶ。

これについて理解すれば、自分で書いたコードが理解できなくなった、などといったことが格段に減るはずだ。

 

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

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

 

…やっと形態が安定しそうだ…

 

【次回はこちら】

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

【前回はこちら】

机上に踊れ、小人形【第陸歩】 - 超初心者が0からRPGを作る