超初心者が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を作る

机上に踊れ、小人形【第陸歩】

春休みなのをいいことに17:00頃まで寝てしまったHeptagonDだ。

こんな生活はいけないとはわかっていても、やめられない自堕落よ。

 

さて、今回は簡易的なゲームを作ってみよう…と思っていたのだが、予定以上に凝ったものをデザインしてしまったため、先に裏で作っておいた。

それでは、今回辿った流れを綴るとしよう。

 

 

【人形を定める始祖は企画】

まずは、大まかにどんな物を作るかを決めなくてはならない。

実際の職場では、これこそがゲームプロデューサーないしゲームプランナーの仕事となる。

 

今回はあくまで試作、何でもいいといえば何でもいいのだが…

とりあえず、せっかく作るのであればRPGに絡めたい。

そう思い、簡単な戦闘を模したゲームを作ることにした。

 

実際ゲームを作る際にはGUIでの開発となるわけだが、GUIRPGにおいても文字情報というものは非常に重要であるのは言うまでもないだろう。

その証拠に、大抵のRPGでは戦闘中にはテキスト用の欄が表示されているはずだ。

今回はそのテキスト欄の中身にあたる物を作っていく。

 

それでは、ゲームのテーマである戦闘そのものはどのような物にするか。

コマンド入力式にしても良かったのだが、今回は戦闘自体はランダムかつ自動に進行するものとする。

というのも、コマンド入力を使用するのであれば、もう少し勉強して「メソッド」や「クラス」などを理解しておいた方が格段に楽になることが予想されるからである。

しかし前々回も少し述べたが、入力することがなくてはゲームとは言いづらい。

そこで、事前に「職業」を用意し、プレイヤーがそれを選ぶ…という工程を挟むことにした。

 

 

【企画を文字に、誇りは常に】

頭の中でどういったものを作るかある程度決まってきたら、一旦それを文字または図面化していこう。

ゲームの開発は複数人で行うため、どんなゲームを作るかを他人に伝えられなくてはならない

…が、ブログという物の性質上それは既にある程度かなってしまったな。

 

ともかく、今回作ってきたゲームの概要だ。

 

2人のプレイヤーが職業を選び、それらが自動でターン制の戦闘を始める。

行動は各職によって異なり、それぞれ6パターンずつある。

また、職毎に特殊能力が存在する。

各職業の能力などは以下の通り。

 

1.ソルジャー

耐久力:A

最大攻撃力:A

攻撃安定度:B

回復力:C

特殊能力:体力低下で攻撃力UP

 

2.メイジ

耐久力:C

最大攻撃力:A

攻撃安定度:S

回復力:C

特殊能力:稀に相手の攻撃を無効化

 

3.ボウガンナー

耐久力:B

最大攻撃力:S

攻撃安定度:D

回復力:A

特殊能力:稀に二回行動

 

4.ヴァンパイア

耐久力:C

最大攻撃力:B

攻撃安定度:B

回復力:S

特殊能力:最大HPを超えて回復可能、行動後僅かにHP回復

 

5.ゴーレム

耐久力:S

最大攻撃力:B

攻撃安定度:A

回復力:D

特殊能力:被ダメージ軽減

 

以上だ。一部職業ではないものも交じっていた気もするが、RPGの世界ではよくある話なのでスルーしてほしい。

一応、各職毎にコンセプトが存在しているので読み取って貰えると非常に嬉しいな。

 

 

【想いを形に、プログラミング】

さて、これを実際にプログラミングした訳だが…

とにかく長い。なんと749行に及ぶコードとなってしまった。

そのためここに記載することは控え、別に公開しておく。

もし気になったものは、下記のリンクから見てくれ。

机上に躍れ、小人形【第陸歩-おまけ】 - 超初心者が0からRPG作る(オマケ)

 

それでは、今回のコードで初使用したことを押さえておこう。

 

《コメント》

コメントとはいっても、某動画投稿サイトやこういったブログのコメント*1とは少し違う。

プログラムにおけるコメントとは、基本的には不要な物だ。

しかし、なぜこんな機能が存在しているのか。

 

その理由は単純。コードを人間側が理解しやすくするためだ。

市販されているゲームのソースコードなどは、ゆうに数千・万行はあるだろう。

そして一つのゲームにあたり数人のプログラマーが付くことは稀ではない。

さらに、近年のゲームは発売後も次々に新バージョンが開発されている物も多く、関係者の延べ人数はとんでもないことになっているだろう。

 

以上のことから、ソースコードは長くてもわかりやすく他人に伝わるものでなくてはならない。

そこで有用なのがコメント、というわけだ。

コメントの書き方は以下の通りだ。

 

//コメントの内容

一行分をコメントとして認識させる

 

/*コメントの内容*/

/*と*/の間をコメントとして認識させる(複数行でも可)

 

《代入演算子

代入という言葉でわかる通りだが、これは今までも一部使ってきている。

左の変数に右の値を代入する、というものだ。

しかし、代入としてではなく、計算を簡略化することもできるのだ。

例えば、

A = A + B

これは第参歩でも少し触れたが、AにA+Bを代入している。

しかし、これをもっと文字数を減らして書くことができる。

それが、以下の書き方だ。

 

A += B

 

初めは少し戸惑うかもしれないが慣れれば非常に使いやすいため、余裕があれば覚えておいてほしい。

もちろん、+=の他にも-=*=/=%=などが存在する。

 

 

今回初使用したのはこのくらいだな。

それでは、コンパイルして実行…と言いたいところではあるが、せっかくなので気になる者は自分の目で確かめてほしい。

ソースコードは先程記載したリンクから入手してくれ。

遊んでくれる方には手間をかけさせて申し訳ないが、ここまで読んでくれている方であればこのくらい朝飯前だと信じているぞ。

 

 

【小人形を踊らせた後の心は】

本当はもう少し勉強を進めておけば、今回のコードは半分…とは言わないが、もっと短くなっていた。

実際にソースコードを見てもらえればわかるのだが、同じような記述が多々あるのだ。

この辺りは「配列」「メソッド」「クラス」などをマスターすればかなり楽になるらしいので、今後学んでいくとしよう。

 

なぜそれを知っていながら、わざわざ面倒で冗長なコードになるのをわかっていながら試作品を作ったのか。

それは、しっかりと経験を積むため。

そして、モチベーションを上げるためなのだ。

 

なんでも先人によると、とにかく勉強して大作を作ろうとして、結局上手くいかずに折れる人が多々いるのだとか。

途中で折れるなどと、全く根性がなっていない輩たちだな…(一敗)

また、折れる原因としてモチベーションの低下も挙げられる。

 

実際、今回このゲームを作ってみて身に付いたことは少なくない。

また、作ってみてそれを自分で遊んでみると、思いのほか楽しいのだ。

後続の者たちも、身の丈に合う…というと少々厳しい言い方だが、できる範囲でちょくちょく作っていくことがどれ程大切なことかを知っていてほしい。

 

 

さて、次回は早速「配列」について学んでいくぞ。

これがあれば、コードを書く際非常に楽になるだろう。

 

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

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

 

…今回内容薄くね?

 

【次回はこちら】

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

【前回はこちら】

生死を分かつはその一文【第伍歩】 - 超初心者が0からRPGを作る

*1:気軽に好きなように書いてもらって構わないので、ぜひともこのブログにもコメントを。

生死を分かつはその一文【第伍歩】

好きな野菜はダントツでタマネギ、次点でネギのHeptagonDだ。

 

さて、今回は分岐反復について学んでいく。

 

なんでも、構造化定理とかいうものによると分岐反復、そして順次*1の3つの手段さえあれば、如何なるプログラムであろうと作り上げることが可能であるらしい。

つまり、今回の内容を頭にしっかり叩き込めば、何でもできる…というのは言い過ぎだが、理論上はどんなプログラムでも作ることができるということだ。

ということで、今回は普段以上に力を入れて学んでいくぞ。

 

 

【分岐、其れすなわち選択の因果】

まずは、条件によって処理を変える分岐だ。

人生は選択の連続 ー シェイクスピアハムレット王の台詞であるが、まさにこれがプログラムにおける分岐の形であろう。

RPGに例えると、プレイヤーは「体力が減ったから回復する」「勝てそうにないから逃げる」という選択をしている。

 

それと同じくして、ゲーム内部でも条件に応じて処理が選択されているのだ。

具体的には「体力が0になったから倒れる」「レベルが十分に達したので魔法を覚える」などが挙げられるな。

 

 この仕組みを支えるのが「if文」ないし「switch文」だ。

それぞれの構文を見ていく前に、if文に必要となる条件式の書き方を記しておく。

 

変数が条件に合うかどうかの判断には、関係演算子というものを使用する。

主な物は以下の通りだ。

 

 A == B     /  A != B

 AとBが等しい / AとBが等しくない

 

 A > B           /  A < B

AがBよりも大きい / AがBよりも小さい

 

 A >= B / A <= B

  AがB以上  /  AがB以下

 

 

基本的には上の通りで良いが…また引っ掛かった箇所があったのでノートをとっておく。

どうやらJavaでは文字列の条件のみ、 == ではなく特別な書き方をするようだ。

なぜこのようなややこしい仕組みになっているのか…とも思ったが、Javaの根幹の規則に則った結果こうなっているようなので従うほかあるまい。

その特別な書き方というのは以下の通りだ。

 

A.equals( B )

AとB、それぞれの文字列が等しい

 

 

さて、前置きが長くなってしまったな。それでは分岐の本文に入っていこう。

 

《if文》

if、和訳するならば「もし~であれば」といったところだろうか。

実際、if文でもまさにそのままの意味で使われている。

次のコードがif文の作りだ。

 

if ( 条件式 )

{

 条件が成立していたときの命令

}

else

{

 条件が成立していないときの命令

}

 

elseという語が出てきたが、こちらを和訳してみると「他」だ。

つまり、ここでは「ifではない、他の場合」と読み取れる。

 

要するにif文とは「条件が満たされていればifのブロック({と}の間)を、条件が満たされていなければelseのブロックを実行するのだ。

 

例えば、RPGにおいて攻撃が命中することを条件にしたとしよう。

すると、ifのブロックには命中した際の処理。

つまり、ダメージの計算やHPを減らす等の命令を書き込めば良い。

逆にelseのブロックはほとんど命令が必要ないな。

"ミス!"とでもテキストを出しておこうか…となるわけだ。

 

それでは、命中したとして防御されてしまったらどうだろう。

今度は、命中のif文の中に、さらに防御されたかどうかのif文を作成することになる。

このようにif文を上手く組み合わせることで、できることの幅が大きく広がるだろう。

 

 

それでは、仮に敵が8体いたとして、あなたは対象がランダムな単体攻撃を行ったとする。

すると、乱数によって8つのパターンが生まれる訳だが…まさかプログラムを8体分書くわけにはいくまい。

このような場合に役立つのがswitch文なのだ。

 

《switch文》

こちらの文はtrue/false*2の二択であるif文と異なり、三択以上の条件にも対応している。

早速そのコードを見てみよう。

 

switch ( 条件に使いたい変数の名前 )

{

 case A:

      変数の値がAの際の命令

      break;

 case B:

      変数の値がBの際の命令

      break;

 case C:

      変数の値がCの際の命令

      break;

        ︙

 default:

      変数の値がA、B、C、…のどれでもない際の命令

}

 

よくよく見てほしいのだが、case 〇の後ろについているのはセミコロン(;)ではなくコロン(:)だ。

間違えやすいと思われるので注意しよう。

また、break;の書き忘れもミスとして多いようだ。これを忘れると、次のcaseの命令も行ってしまうことになる。

逆にこのことを利用する猛者もいるそうだが…慣れないうちはしっかりbreak;することを習慣づけるのが良いだろう。

 

 

さて、分岐に関してはこのくらいで良いだろう。

尺も押しているので(!)、さっさと反復に移るとする。

 

 

【反復、その輪廻に終わりはあるか】

反復については繰り返し、ループの一言で説明がつくな。

もう少し踏み込むと、先程if文で扱ったような条件式を満たしている間命令を繰り返す、ということになる。

反復の構文は、大きく2つ。細かく分ければ3つだな。

まずは最も簡単な無印のwhile文から学んでいこう。

 

《while文》

早速コードを記載しよう。以下のコードがwhile文の基礎となる。

 

while ( 条件式 )

{

 反復する命令

}

 

これだけだ。簡単だろう?

しかし、反復には最大の敵がいることを覚えていてくれ。

それは、無限ループ

一度実行してしまったが最後、強制的にプログラムを終了させる他ないのだ。

 

無限ループとは少し違うが、RPGにおいて眠ってしまった場合について考えてみよう。

眠ってしまった場合、基本的には何も行動することができないだろう?

そのため、ターン終了時「一定確立で起きる」や「ダメージを受けると起きる」などの処理の記載が無い場合、そのキャラクターは延々と眠り続けてしまうのだ。

 

逆に言えば、いずれは必ず反復から抜け出すことができる命令がきちんとその反復の命令内に入っていれば、無限ループは恐れる相手ではないということだ。

 

 

《do-while文》

こちらはwhile文の亜種だ。コードは次の通り。

 

do

{

 反復する命令

}

while( 条件式 );

 

条件式が後に来ているな。

そう、do-while文条件式が満たされていようが満たされていまいが、一度は命令を実行してしまうのだ。

その後、条件式に合わせて反復するかどうかが判断される。

 

…果たして需要はあるのだろうか。

どうせ実行してしまうのであれば、順次でコードを書いてしまってからwhile文を使えば良いのではないか…

 

っと、書いている途中で気づいた。

while文でdo-while文を表現しようと思うと、コードを余分に書く必要があるのだな。

do-while文は必須ではないが、開発者が楽をするための構文だったのだ。

 

さて、残すところはあと1つ。もう少しだけお付き合い願いたい。

 

 

《for文》

こちらは条件の設定がやや厄介なため、慣れない内は暗記でも構わない。

が、もう暫し後に「配列」という物を勉強するのだが、それまでにはしっかりと理解しておいてほしい。

 

さて、コードは次のようになる。

 

for( int i = 0; i < 繰り返したい回数; i++ )

{

 反復する命令

}

 

見てわかったと思うが、for文はwhile文と違い、指定回数分反復させるための構文だ。

こちらもwhile文で再現可能だが、コードが長くなってしまうな。

 

さて、それではややこしくなっている()の中身について見ていこう。

 

 

int i = 0;

最初の一文はもう理解できるな?

そう、int型変数iを0として初期化している。

 

それでは、二文目。

i < 繰り返したい回数;

これは先程使用した条件式と同じだな。

 

三文目は…

i++

こちらは前回学んだインクリメント演算子だな。

iに+1していることになる。

 

 

つまり、流れはこうだ。

 

  1. int型変数iを宣言、0を代入
  2. i に1を足す
  3. iが指定数に届いていなければ反復

 のぉんど、おんごいこんとんじょのいこ

 

ゴホン、このことを応用すれば、さらに複雑怪奇な反復が実現できるが…

これはあまりにも複雑すぎるので、現状では使用機会はないだろう。

そのようなこともあったな、と後々思い出す程度で問題ないと思われる。

 

 

ところで、この変数i…上手く使ってやれば面白いと思ったのだが、そうはいかなかった。

 というのも、変数には寿命があることが原因なのだ。

変数の寿命は、宣言したブロックが終わるまで。

また、変数が宣言されてから寿命が尽きるまでの範囲をスコープというらしい。

 

ともかく、for文では少々特殊ではあるものの、int iの寿命はその反復条件の範囲でしか使えない、ということだ。

まぁ、for反復内に新たに変数を宣言し、+1していけば問題ないのだが。

 

 

さて、なんだかんだで分岐反復を押さえることができただろうか。

今回学んだことは非常に重要なため、今までの復習も兼ねて次回は適当なミニゲーム(のようなもの)を作ってみるぞ。

 

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

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

 

…長い。今回は長い。1回でやる内容じゃなかった。

 

【次回はこちら】

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

【前回はこちら】

傀儡の呪言を頭に刻め【第肆歩】 - 超初心者が0からRPGを作る

*1:分岐でも反復でもない、上から下へ進んでいく通常の進行

*2:プログラムにおけるYesNo

傀儡の呪言を頭に刻め【第肆歩】

隠れ身の術なのか隠れ蓑の術なのか、ハッキリさせたいHeptagonDだ。

まぁ、どちらでもいいといえばいいのだが…w

 

さて、今回は具体的な命令について勉強していく。

とはいっても、そもそも使っていれば自然と覚えてくるものであるようなので、軽くまとめるだけに留める。

後続の者も、必要があれば調べる、程度の心構えで構わないとは思われる。

 

ただし、まだまだ現状では触れてさえいない要素も多々あり、命令を使いこなすには基礎の勉強は欠かせない。

本などで勉強する場合、極力飛ばし読みは控えることをオススメする。

 

 

【かいらいの呪言…くぐつの呪言…どっちでもいいや】

命令実行のコードは、基本的に次の形になる。

 

命令の内容 ( 引数 );

 

引数(ひきすう)というのは、簡単に言ってしまえば命令を実行する際に必要なデータのことだ。

命令によって必要な引数は異なり、全く必要のないものから複数必要なものもある。

 

それでは、このことを踏まえたうえで具体的なコードを見ていこう。

 

《文字列を表示する

まずは今までも何度も使ったこれら。

 

System.out.print( 引数 );

()内の文字列を表示する。

 

System.out.println( 引数 );

()内の文字列を表示し、改行する。

 

引数は直接値を書き込む他、変数を使うこともできる(前回参照)。

文字列を直接書き込む場合、前後の二重引用符(")を忘れないように。

 

算術演算子

いきなり難しい言葉が出てきたが、なんということはない。

加減乗除の四則計算に使う記号たちのことである。

 

A + B

AとBを合計する。(1 + 6 → 7 )

また、文字列を連結させることもできる*1。(String name = "HeptagonD"とすると、name + "です。" → "HeptagonDです。"となる。)

 

A - B

AからBを引く。(9 - 2 → 7 )

 

A * B

AにBを掛ける。(4 * 7 → 28、3.0 * 2 → 6.0)

 

A / B

AをBで割る。(8.0 / 4 → 2.0、15 / 2 → 7)

有効数字外は切り捨てられてしまうため、注意が必要だ。

慣れないうちは極力整数で計算するべきかもしれない。

 

A % B

AをBで割った余り。(6 % 4 → 2)

 

《インクリメント・デクリメント演算子

コードを書いていると度々現れる+1や-1を省略した記述方法だ。

余談だが、プログラミング言語C++」もC言語に+1した言語として名付けられたそうだ。

 

A++ or ++A

A+1

 

A-- or --A

A-1

 

これらの演算子は、前に付けたときと後ろに付けたときで計算の優先順位が微妙に違うらしい。

他の演算と同時に行ってしまうと思っていたのと違う動きをする可能性があるため、使用時にはこれら単独で使う方が良いようだ。

 

 《入力を受け付ける》

テレビや映画とゲームの違いを挙げるならば、真っ先に出るのが「双方向性」だ。

メディアに対してこちらからアクションを起こせる、ということが大切なのだろう。

こちらからアクションができないゲームはゲームとは呼べないだろう?

そこで、入力を受け付ける必要があるが…現在できるのはこのくらいだろうか。

 

 String 変数の名前 = new java.util.Scanner(System.in).nextLine();

1行分の文字列入力を受け付け、String型変数に格納する。

 

int 変数の名前 = new java.util.Scanner(System.in).nextInt();

1つの整数入力を受け付け、int型変数に格納する。

 

《乱数を発生させる》

乱数というのは、ランダムに決まる数のことだ。

プログラムにランダムな要素を使用する場合には必ず使用するため、ゲームなどでは非常に大切になってくる。

 

int 変数の名前 = new java.util.Random().nextInt( 引数 );

引数未満の自然数と0の中から、ランダムに決定した整数をint型変数に格納する。

 

引数の数字自体は含まないため、注意が必要だ。

例えば、引数8とした場合は0~7の中からランダムで数字が選ばれる。

 

 

 

さて、少し駆け足で来てしまったがどうだっただろうか。

これらの命令もJavaのルールの下働いているが、やや難しい内容になってしまうので、今は覚えるだけでも問題ないだろう。

次回は分岐繰り返しについて学んでいく。

これができれば、簡単なゲームであれば作ることができるようになろう。

 

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

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

 

…なんか地味回…いつもか…

 

【次回はこちら】

生死を分かつはその一文【第伍歩】 - 超初心者が0からRPGを作る

【前回はこちら】

唱えよ変数、呼び出せ値【第参歩】 - 超初心者が0からRPGを作る

*1:この場合は、算術演算子ではなく「文字列結合演算子と呼ばれる」

唱えよ変数、呼び出せ値【第参歩】

ソシャゲは面白くないと感じるわけではないが、やはり何か物足りない気がするHeptagonDだ。

やはり課金や広告収入の魂胆がチラつくのが問題なのだろうか。

 

さて、今回はJavaにおける変数を勉強していく。

正直な話ここに記載しても需要はほぼ無いとは思うのだが、足跡を残すことでモチベーションに繋がり、復習にもなるため続けていくぞ。

 

 

【値は効果、変数は魔法】

」とは何か?

そう聞くと何やら難しげだが、プログラムにおいては大雑把に言うと「データ」と考えていいようだ。

例えば、魔法「ファイアボール」の基本攻撃力が50だとする。

この場合、50というのが値。数字(整数)のデータだ。

また、魔法の名前「ファイアボール」というのも文字列のデータと言える*1

 

しかし、魔法の効果を呼び出すためには呪文が必要だ。

プログラムにおけるそれが、変数なのだ。

 

少し理解しがたいが、変数とは値を入れる*2箱、という表現が一般的なようだ。

先程の例で言うと、「ファイアボールの基本攻撃力」という箱に50という値を入れていることになる。

さらに、「魔法の名前」に「ファイアボール」という値を入れているな。

 

 

なんとなくは値と変数について理解できただろうか。

それでは、実際にコードを書いていこう。

まずは、次のコードを見てほしい。

 

public class FireBall
{
     public static void main(String args)
     {
     String fireBall;
     fireBall = "ファイアボール";
     int fireBallDamage;
     fireBallDamage = 50;
     System.out.print("あなたは");
     System.out.print(fireBall);
     System.out.println("を唱えた!");
     System.out.print("敵に");
     System.out.print(fireBallDamage);
     System.out.println("のダメージ!");
     }
}

 

青文字部分赤文字部分が今回学習している変数に関するコードだ。

例によって下線部は自由に変更してもらって構わない。

順を追って見てみよう。

 

 

【魔法の契約、変数の宣言】

String fireBall;

ここでは、「String型(文字列を扱う変数の型)」の「fireBall」という変数を宣言している。

具体的には、「(火球を飛ばす)魔法の名前」の変数を宣言していることになる。

宣言というと難解だが、要は「文字列の値を入れるためのfireBallという箱を作りますよ」という合図なのだ。

つまり、宣言をしていない変数は扱うことができないため宣言は必須だ。

また、プログラムは上から下へ読まれるため、宣言より前にその変数について命令することができないことにも注意が必要だ。

 

同様に、int fireBallDamage;

ここでは「int型(整数を扱う変数の型)」の「fireBallDamageを宣言している。

具体的に言えば「(火球を飛ばす)魔法のダメージ」の宣言だな。

 

前述したが値にはさまざまな形があるため、変数にもさまざまな型が必要になる。

ここではString型int型を使用したが、他にも多くの型が存在するため、調べてみるといいだろう。

 

さて、まとめると宣言のコードはこのようになる。

 

変数の型 変数の名前;

 

 

【代入で魔法に新たな効果を】

fireBall = "ファイアボール";

ここでは、先程作った変数「fireBall」に「ファイアボール」という文字列を代入している(文字列の値の前後には、目印として半角の二重引用符(")が付くことを覚えておこう)。

同様に、fireBallDamage = 50;では「fireBallDamage」に50を代入している。

 

ここで注意すべきことが一点。

プログラムにおける「=」と、一般的な「=」は意味合いが異なるということだ。

例えば、ファイアボールがレベルアップで強化されたとしよう。

すると、コードは以下のようになる。

 

fireBallDamage = fireBallDamage + 30;

 

ここではファイアボールのダメージを30増やしているのだが、左辺と右辺の数が違うことに疑問を持つ人も多いのではないだろうか。

あくまでプログラムの「=」の意味するところは、左辺に右辺を代入することだということを覚えておこう。

 

さて、まとめると代入のコードはこのようになる。

 

変数の名前 = ;

 

 

さて、では実際にプログラムを動かそう。

今回はクラス名という物が「FireBall」となっているので、ソースコードは「FireBall.java」と名付けてコンパイル

実行すると、次の画像のようになっただろうか。

f:id:Heptagon:20190321223041p:plain

コードに対してたったの二行しか出力されていないため、少し拍子抜けしたかもしれない。

 

 

【火球は爆炎へと変わるか】

では、なぜわざわざこのような書き方をしたのだろう?

その理由は、次のコードでわかるだろうか。

 

public class FireBall2
{
     public static void main(String args)
     {
     String fireBall = "ファイアボール";
     int fireBallDamage = 50;
     System.out.print("あなたは");
     System.out.print(fireBall);
     System.out.println("を唱えた!");
     System.out.print("敵に");
     System.out.print(fireBallDamage);
     System.out.println("のダメージ!");
     System.out.println();
     System.out.println("あなたはレベルが上がった!");
     System.out.print(fireBall);
     System.out.print("が");
     fireBall = "ファイアブラスト";
     fireBallDamage = fireBallDamage + 30;
     System.out.print(fireBall);
     System.out.println("になった!")
     System.out.println()
     System.out.print("あなたは");
     System.out.print(fireBall);
     System.out.println("を唱えた!");
     System.out.print("敵に");
     System.out.print(fireBallDamage);
     System.out.println("のダメージ!");
     }
}

 

聡明な方は気づいただろうが、変数に入っている値は後から上書きすることができる。

新たに値を代入すると、古い値は消えて新しい値となるのだ。

 

そのため、これを「FireBall2.java」としてコンパイル、実行してみると以下のようになる。

f:id:Heptagon:20190322000922p:plain

 

つまり、後々値が変わってしまうことを想定すると、規模の大きいプログラムほど少々手間が増えても変数を使った方が、将来的には手間を減らすことになるのだ。

急がば回れ、とはよく言ったものだ。

 

 

ちなみに、今回は変数の宣言と代入を同時に行っている。

念のためにコードを記しておくと以下の通りだ。

 

変数の型 変数の名前 = ;

 

また、宣言と代入を同時に行うことをとりわけ「初期化」ということも覚えておこう。

 

 

さて、これで変数・値の基礎は身に付いた。

もちろん応用すればいくらでも新しいことはあるが、今はとにかく前へ進むことを優先しようと思う。

次回は今回のコードでも使用したような簡単な命令、計算について勉強していくぞ。

 

 

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

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

 

…値と価の誤字の手直しで手間取ったなんて言えない…

 

【次回はこちら】

傀儡の呪言を頭に刻め【第肆歩】 - 超初心者が0からRPGを作る

【前回はこちら】

実践、初陣【第弐歩】 - 超初心者が0からRPGを作る

*1:他にも、小数や文字、真偽値など様々な形の値が存在する

*2:このことを代入という

実践、初陣【第弐歩】

先程久々に旧友に会って、腹筋を持っていかれたHeptagonDだ。

ヤツらに同じ志があればどれだけ楽しかったろうか。

 

さて、今回から本格的にプログラムを勉強していこう。

学びながらの記事となるため、曖昧なところや間違ったところも尽きないとは思うが、長い目で見ていただけると嬉しい。

また、逐一間違いの報告・アドバイス等していただけると猶更助かるぞ。

 

ところで、今回からのプログラムの勉強は比較的企業等によく使われているOS、Windows環境での話となる。

Mac等他のOSでは違う点が多々出てくると思うので、その辺りはご了承いただけるだろうか。

 

 

【まずは実戦(実践)あるのみ】

まずは何事も触ってみることが大事、ということで早速簡単なプログラムを組んでいくことにする。

 

まずはメモ帳でも何でもいいので、テキストエディタを用意する。

そして、以下の文を入力してみる。

 

 

public class Main

{
     public static void main(String[] args)

          {

           System.out.println("Hello World!");

          }
}

 

誤字・脱字、半角全角の違い、コロン(:)とセミコロン(;)の間違い等は厳禁だ。

なお、文字の色や下線に関しては説明用の物であるため、気にしなくて結構だ。

また、広く開いた部分のスペースも適当でよい。

 

…それにしても何が何やらさっぱりだな。

 

実際、青文字の部分が我々からのコンピューターへの直接的な指示であり、その周囲の部分は決まり文句のような物で、今すぐ理解する必要は無いようだ。

 

入力が済んだら、このテキストファイルに「Main.java」と名前を付けよう。

この際、拡張子ごと変更する必要があるため注意が必要だ。

拡張子についての説明は省くが、調べれば簡単に見つかると思われる。

後続の者、特にPCを扱う者は知っておくべきであろう。

 

保存先は後々のことを考えて、Cディスク直下に「SampleFiles」というフォルダを作成し、その中にしておく。

 

 

さて、これでプログラムを書くこと自体は終了だ。

これだけかと思うと、少々拍子抜けするようだが…

 

余裕のある者は、上記ソースコード*1の下線部分を別の文字に変えてみるといいだろう。

 

 

【まだまだ戦いは続く】

 

さて、これで完成…とはいかない。

あくまでこのソースコードは人間が読みやすくした物であり、二進法で全てを表現する機械にも読めるように翻訳してやる必要がある。

 

この翻訳作業のことをコンパイルという。

 

ここで登場するのが、前回インストールしておいたJDKだ。

ここでは、この中の(環境変数の設定でも少し触れた)javacという物がコンパイルを行うコンパイラと呼ばれる物となる。

 

 

それでは、実際にコンパイルを始めよう。

 

コマンドプロンプトというアプリケーションが元々内蔵されていると思うので、これを立ち上げる。

見つからない場合は素直に調べた方が速いだろう。

また、今後度々使っていくことになるため、デスクトップ等にショートカットを作っておくことをオススメする。

 

コマンドプロンプトを立ち上げると、まずはおおよそ次のような画面が現れると思う。

f:id:Heptagon:20190317235356p:plain

コマンドプロンプト起動時の画面

これも詳しくは理解する必要はないが、一番下の行に注目してほしい。

 

これはカレントディレクトと呼ばれる物で、GUIで言うところの「開いているウィンドウ」だと思ってくれていいだろう。

画像では現在CディスクのWINDOWSフォルダ内のsystem32フォルダ内にいる、ということを示していることがわかるだろうか。

 

さて、先程作ったソースコードを弄るためにはそのソースコードのある場所まで移動する必要がある。

カレントディレクトリを移動させるためのコードは以下の通りだ。

 

cd 移動したい先のアドレス

 

実に単純だな。これならば簡単そうだ。

例えば、CディスクのSampleFilesの中であれば、このようになる。

 

cd C:\SampleFiles

 

ちなみに、バックスラッシュ(\)は¥キーで入力できる。

若干迷ったので念のため。

 

 

さて、移動も済んだのでコンパイルに移ろう。

コンパイルのコードは以下の通りだ。

 

javac Main.java

 

拡張子もしっかりと入力が必要。

ソースコード等に間違いがなければコンパイルが成功し、SampleFiles内にMain.crassというファイルができているはずだ。

 

 

【其の敵の名はエラー】

 

さて、これでプログラムを実行できる…はずだったのだが、とあるエラーにぶつかったので先に記しておく。

 

エラーコードの一部を抜粋すると、

UnsupportedClassVersionError

 

直訳すると「サポートされていないクラスバージョンエラー」。

つまるところ、使っているJDKJREのバージョンがおかしいという話である。

 

JDKで開発し、JREで動かす…ということから考えればわかることだが、JDKのバージョンがJREよりも新しいと、JREが対応できなくなってしまうようだ。

 

そこで、元々PCに入っていたJREをアンインストールし、新バージョンのJREを再度インストールすることで解決した。

 

 

【これでとどめだ!】

 

時は満ちた。それでは、実際にプログラムを実行していこう。

プログラムの実行のコードは以下の通り。

 

java Main

 

実行する場合は拡張子は不要だ。ややこしいが、覚えておこう。

さて、コマンドプロンプトを見てみると…

f:id:Heptagon:20190318003728p:plain

Hello World!の文字が浮かびあがったではないか!

 

やっていることは至極単純なことではあるのだが、この手でプログラムを作ったという実感が湧いてきただろう。

ここまで苦労しただけに、感動も一入というものだ。

 

前述したが、ソースコードの下線部を変更してコンパイル・実行することにより、表示される文字も変わってくるはずだ。

プログラムを作って動かすまでの一連の流れを記憶するためにも、何度か試してみると良いだろう。

 

次回からは、実行するプログラムの内容を掘り下げていくことにする。

 

 

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

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

 

…今回長いな…いや、普通なのか?

 

【次回はこちら】

唱えよ変数、呼び出せ値【第参歩】 - 超初心者が0からRPGを作る

【前回はこちら】

立ち向かうはJava【第壱歩】 - 超初心者が0からRPGを作る

*1:プログラムの文

立ち向かうはJava【第壱歩】

ほとんど年中花粉に悩まされている中二病な高校生、HeptagonDだ。

 

前回少々触れたが、今年度は経験の年。

自分がゲーム作りにおいてどの点が優れているかを探していこうと思う。

 

そこで今回から取り上げるのがプログラミングだ。

 

絵や映像、音声はなくとも、これさえできれば最低限のゲームは作ることができる。

裏を返せば、どんなゲームを作るためにもプログラミングは欠かせないということだ。

 

近年では小学校などでもプログラミングを教育に取り入れているらしいな。

全く、その世代に生まれていれば…

 

まぁ、逆に競争相手が少ない今がチャンスとも言える。

パッと見ではとっつきにくい内容だが、歩み始めるとする。

 

 

Javaという名のダンジョンに潜る前に】

 プログラムと一口に言っても、その方法は多彩だ。

我々も国が違えば言葉が異なるように、機械達にも様々な言語がある。

また、同じ言語でも開発用のツールで違いが出てくるようだ。

 

結論から言うと、どの言語が良い・悪いということは一概には言えないようだ。

また、プログラムの流れさえわかっていれば、他の言語の覚えは格段に速くなるとも聞く。

 

そのため、比較的学習が容易いらしい「Java」に触れていきたいと思う。

まぁ、「よく見るし聞く」という至極単純な直感で選んだ訳でもあるのだが…w

 

 

【まずは装備を整えよう】

 まずは開発の環境を整える。

どうやらGUI*1でのプログラミングには別途ツールがあった方が何かと便利なようだ。

 

が、まずは触れて初歩から地道に勉強すべきだと思われる*2ので、より簡単なCUI*3でのプログラミングを手がけていくことにする。

 

PCを持っていることを前提とすると、最低限必要な物は

だけ。しかも既にPCに入っていた

例え持っていない者であっても、ORACLE社の下記のウェブページより無料で簡単にダウンロードできる。

java.com

 

 

ただし、JREだけで開発を行う場合、「dokojava」というオンラインサービスを経由する必要がある。

dokojavaは無料で扱うことができるようだがその都度ログインするのも面倒なので、自分は

をダウンロード&インストールすることにした。

 

 

【ちゃんと装備しないと意味がありませんよ!】

インストール後にやや難しい操作が必要となる。

OS内の環境変数とやらを弄る必要があるようだ。

下記のサイトに大変お世話になったので、後続の者は参考にしてほしい。

https://eng-entrance.com/category/java/java-install

 

 

 これで、とりあえず例えオフラインでもJavaを利用してアプリケーション開発ができる環境が整ったようだ。

 

ここまで訳のわからない難しい話で一杯だったが、なんとか切り抜けることができた。

次回からプログラミング自体に触れていこうと思う。

 

 

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

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

 

…うん、もうここまで書いちゃったしこれでいいや

 

【次回はこちら】

実践、初陣【第弐歩】 - 超初心者が0からRPGを作る

【前回はこちら】

2019年春、始動【第零歩】 - 超初心者が0からRPGを作る

*1:アイコンやウィンドウなどを用い、直感的にわかりやすくされたインターフェイス

*2:以前他の言語を勉強しようとし、いきなりGUI飛び級で一敗

*3:文字だけのインターフェイス

*4:Javaで作られたアプリを動かす為のセット

*5:Javaでアプリを開発する為のセット