イントロダクション
前回は、IF文を理解したと思います。不思議な設定は少し置いておきます。
このブログを読み進めていれば、以下のスキル(武器)を保有していると思います。
- JavaFXのラベルコントロール
- IF文の書き方を理解している
- Stringクラス(文字列)の記載、コントロール
- メソッドを作る(文字列を返却する)
- System.out.printlnメソッド
MAPを作る
そろそろ、それっぽいものを作りたいと思います。そのために新たな武器を取得してもらいます。
ループ(FOR)文を覚える
まずは、MAPとFOR文の関係がわからないと「やる気」が出ないと思います。参考に作成したものをみてください。詳しくはこちら
下のソースは、次のような処理を行っています。
- パネルのサイズをint型の配列で保持します。
- 使用する画像ファイル名を変数に保持(ここではgrass_light.pngのみ使用)
- GridPaneクラスで升目上にラベルを配置する準備
- GridPane#add()でラベルを追加
※createImageLbl()メソッドはファイル名を引数にしてImageLabelを返却します。具体的には、緑色のタイル(画像ファイル)を返却します。
grid.add(createImageLbl(lightGrass), 0, 1);
と書いているのは、「0行目の1カラム目にイメージ画像をセット」という意味になります。
<ソース>
// パネルサイズ int[] size = {3, 5}; String lightGrass = "grass_light.png"; String deepGrass = "grass_deep.png"; String soilBasic = "soil_basic.png"; GridPane grid = new GridPane(); grid.add(createImageLbl(lightGrass), 0, 1); grid.add(createImageLbl(lightGrass), 0, 2); grid.add(createImageLbl(lightGrass), 0, 3); grid.add(createImageLbl(lightGrass), 0, 4); grid.add(createImageLbl(deepGrass), 1, 1); grid.add(createImageLbl(deepGrass), 1, 2); grid.add(createImageLbl(deepGrass), 1, 3); grid.add(createImageLbl(deepGrass), 1, 4); grid.add(createImageLbl(soilBasic), 2, 1); grid.add(createImageLbl(lightGrass), 2, 2); grid.add(createImageLbl(lightGrass), 2, 3); grid.add(createImageLbl(lightGrass), 2, 4); grid.add(createImageLbl(lightGrass), 3, 1); grid.add(createImageLbl(soilBasic), 3, 2); grid.add(createImageLbl(lightGrass), 3, 3); grid.add(createImageLbl(lightGrass), 3, 4); vBox.getChildren().add(grid);
なにやら同じようなコードが並んでいて使用するのがとても大変です。
これでは「武器」としてイマイチです。
そこでFOR文
下の行を繰り返して、「0,1」「0,2」「0,3」...とちまちまとコーディングしました。
grid.add(createImageLbl(lightGrass), 0, 1);
こんな感じで動きますが、如何せん汎用性に欠けていてまぁ使えないわけです。
FOR文を使うとこーなる
String lightGrass = "grass_light.png"; String deepGrass = "grass_deep.png"; String soilBasic = "soil_basic.png"; GridPane grid = new GridPane(); for (int i = 0; i < 4; i++) { grid.add(createImageLbl(lightGrass), 0, 1); } vBox.getChildren().add(grid);
これで緑の部分が1行分並びます。
FOR文の書き方
for (カウンター変数の初期化;論理式; 後処理)
【具体的なコード】
for (int i = 0; i < 5; i++) {
}
①「int i = 0」がカウンター変数の初期化になります。ループする度に後処理で「i」がカウントアップされます「i++」の処理です。
②1回ループすると論理式「i < 5」で、次のループを行うかどうか判定します。
③はじめのループでは「i = 0」なので「0 < 5」=TRUEですのでループが行われますが、「i = 5」になったら「5 < 5」=FALSEですのでループが行われません。
雑魚キャラが現れた!
おろ?なにが足りないのでしょうか?(不思議な設定をロード中です)
とりあえず言いたいことは20行くらいのコードが数行で片付きます。
(設定のロード完了)
たくのじ村では、ちょっと揉め事が起きていました。
「村人C」『中ボスを倒してもらうのに、こいつを渡そうと思ってたが〜のんに。。。だれら〜こんがーことやったのは?誰かなんとかしくんねぇかなぁ?』
「村人D」『俺じゃねーって!人のせいにすんなて〜』
「村人E」『いや、まずはこれをなんとしねぇば。。。あ、そこの人ちょっと頼みたい事がるんスけど。。。』
『組んであったFORが壊れているようで、こいつを直して頂きたいんす、いゃ自分はどーもよくわからないて。。。ギターなら弾けるんすけどね?』
今回のトラブル
上で紹介した、FOR文がうまく動いていません、本来ならば4x4のマスが並ぶはずですが、1行しか並んでいません。これをなんとか元に戻して頂きたいというわけです。
<ヒント>
現在は1行だけ並んでいますので、これを残り3行文を追加すればOKなのです。。。問題は「どーやるか?」です。
今回上に記載したコードはGitにコミットしてあるのでそれを直していただきたく。。。
でわでわ。。。