今からはじめるプログラミング11
前回のプログラムはどうでしたでしょうか。
時間があるようでしたら、
MainClassのmainメソッドから順番にコードを1行ずつ眺めて、画面を表示するまでのコード。
画面でボタンを押されてから次の画面を表示するまでのコード。
チェックボックスにチェックを入れた時のコード。
チェックボックスにチェックを入れた後、ボタンをおして画面を表示するまでのコード。
そんな感じで処理の順番を追っていくと・・・そしてこれをまずテキストに書き出して、クラスごとに並べて、シーケンス図のできあがり、みたいな。(というかgoogleドライブからコードをひとつひとつ取得するのが面倒かもしれないですね。すいません。)
とうとつですが、高級言語プログラムということがどういうことか?まずコンピュータが処理するためのマシン語へ変換(こんぱいる)する前の言語ということですが、要するに我々が理解できるようにしたものですね。
そして、プログラムというのは、その我々が理解できる言語で、コンピュータに指示をする、ということなので、プログラムの処理を追うことによって、何をしているのかが、わかるはずなのです。
ただ、効率的なプログラムや処理速度を追求したものなどは、正直読み辛くなっていきます。
そして今回のプログラムはどうでしょう?
コーディング量としてはかなり少なく。少し英語の知識があれば、我々の言語に近い感覚で読み取れませんでしょうか?
オブジェクト思考言語は、かなり高級言語というか我々の言語に近い感覚でコーディングができる言語だなぁと思うのですが、まぁ僕が最初に勉強したCOBOLという言語に比べて、ということかもしれません。
でも、実際僕がJavaのプログラムを勉強した時は、結構英語の辞書を横に置いて調べながら勉強したので、そして英文読解よりは簡単に理解できたので、皆さんもがんばってみて欲しいです。google翻訳というのもありますし。
・
・
・
・
そんなこんなで。
今回は、ドラクエっぽいもの!を作ってみたいと思っています。
昔システム開発に携わってから3年目くらいの時に1度作ってみたことがあるので、もう一度。思い出しながらという感じです。
とはいえ現在の3Dアクションとかかっこいいものではなく、初代のドラクエをイメージしています。ウィザードリィなども好きでしたが、最初にプレイしたRPGなので作ってみたいと思いました。
昔もそんあ感じで作ったのですが、中身は業務アプリケーション。データの管理にRDBなんかを使ってしまいました・・・w
まぁ今回も同じような感じになるかもしれませんが、せめてRDBを使わないでいこうと思っています。
あまり難しいコードはなるたけ避けていきますので、とはいえブラックボックスはあるので、説明があやふやだったりもありますが、めげずにいきましょう。
そしてなんで?きっかけは?とか質問されそうなので。
まず何を持ってできそう!と考えたのか・・・
最初のプロジェクトでエクセルみたいなテーブルを表示する画面です。
テーブル以外の要素もあったのですが、同じプロジェクトでテーブルに画像を表示(アイコンですね)していたりする画面もあったので、「こんなこともできるんだー」程度に思ったのですが、ふとその構造をみてみると、TableCellEditorとTableCellRendererというものを使って、表示する際は画像を実際の値はコード値を保持しているのです。
WEBアプリケーションではラベルバリュービーンみたいなイメージです。
ふとドラクエのマップの画面がつくれないかな?と思ったわけです。
ちなみにこの描画を別に行っていく手法というのは現行のゲームを処理速度の遅いパソコンで実行したりすると、目で処理がわかるというか、マイクラなどで、フィールドが、わくから形成されて画像が覆っていくような感じで表示されていくのが見えますよね。そんな感じで、あながちゲームの構造も違っていないような気がします。もっと高度にメモリなどを使っていると思いますが。
そんなこんなで、とりあえず、まずはコードだけのテーブルを表示してみます。
FieldMap
--------------------------------------------------
package sample7;package sample7;
import javax.swing.JFrame;import javax.swing.JTable;
public class FieldMap {
private String map = new String { { "2", "2", "2", "2", "2" }, { "2", "1", "1", "1", "2" }, { "2", "1", "1", "1", "2" }, { "2", "1", "1", "1", "2" }, { "2", "2", "2", "2", "2" }, };
public String getMap() {
return this.map;
}
public static void main(String args) {
FieldMap filedMap = new FieldMap();
String map = filedMap.getMap();
JTable tbl = new JTable(5, 5);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
tbl.setValueAt(map[i][j], i, j);
}
}
JFrame frame = new JFrame("field");
frame.getContentPane().add(tbl); frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
-------------------------------------------------
2次元配列というものを使って文字列の基本となるデータを保持しています。とりあえず1と2で1を囲むように2を配置しています。
これを実行すると下記のような画面が表示されます。
大きさなどを考えていないため、まばらな感じで表示されていますが、2で1を囲った感じでテーブルが表示されています。
つぎに表示を画像に置き換えるコーディングです。
FieldRendererというクラスをつくりました。Rendererというのは描画をするもの、という意味ですね。
FieldRenderer
-----------------------------------------------------
package sample7;
import java.awt.Component;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class FieldRenderer implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
String tableValue = (String)table.getValueAt(row, column);
int mapCode = Integer.parseInt(tableValue);
JLabel label = new JLabel();
Icon icon = null;
switch(mapCode) {
case 1:
// 式を評価した値が定数1と一致したときに実行される処理
icon= new ImageIcon("/Users/matsuiyoshikazu/eclipse-workspace/sample/src/resource/11/glass.png");
label.setIcon(icon);
break;
case 2:
// 式を評価した値が定数2と一致したときに実行される処理
icon = new ImageIcon("/Users/matsuiyoshikazu/eclipse-workspace/sample/src/resource/11/sea.png");
label.setIcon(icon);
break;
}
return label;
}
}
-----------------------------------------------------
リソースとなる画像を用意するのが面倒ですが、WindowsであればPaintとか、とりあえずMacでアルパカさんで作ってみました。
32*32ピクセルの画像を2種類。
まずは緑色と水色の2種類、という感じでもいいです。
そして最初に作ったFieldMapクラスのコードに追加したRendererを書き加えます。
FieldMap(レンダラー追加)
--------------------------------------------------
package sample7;
import javax.swing.JFrame;
import javax.swing.JTable;
public class FieldMap {
private String map = new String {
{ "2", "2", "2", "2", "2" },
{ "2", "1", "1", "1", "2" },
{ "2", "1", "1", "1", "2" },
{ "2", "1", "1", "1", "2" },
{ "2", "2", "2", "2", "2" }, };
public String getMap() {
return this.map;
}
public static void main(String args) {
FieldMap filedMap = new FieldMap();
String map = filedMap.getMap();
JTable tbl = new JTable(5, 5);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
tbl.setValueAt(map[i][j], i, j);
}
}
for (int j = 0; j < 5; j++) {
tbl.getColumnModel().getColumn(j).setCellRenderer(new FieldRenderer());
}
JFrame frame = new JFrame("field");
frame.getContentPane().add(tbl);
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
--------------------------------------------------
テーブルを回しながら、追加していくところが少し馬鹿っぽいですが、逆にこれは、テーブルのカラム(列)ごとに別のレンダリングが可能ということです。
というかfor文の書き方を忘れていてぐぐりながら書きました・・・w
そして下記の画面が実行結果です。
テーブルのセルの間隔などを調整すれば、マップ画面ができてしまった気がしませんか?
とりあえず今回はこんなところです。
・・・16パネルゲームをimportして実行してみたら動きました。(下記です。)
こちらもテーブルを使っているのですが、今の僕にはなかなか難しいコーディングをしていますね。(こんな難しいコードが書けたのか・・・10年前くらいの僕は・・・)
https://ma2-ys.booth.pm/items/2784565
実行画面
話がとびとびですいませんが、
こんな感じで、プログラミングという行為が、発想→コーディング→失敗→調査→みたいな感じで、自然にできたら、Javaでのシステム開発はかなり楽になっていくのではないですかね?
そうはいってられないプロジェクトがいっぱいなのかもしれませんが。
僕の経験としては、やはり上下関係でシステム開発をしているところは、うまく行かなかったことが多い気がします。
通信・金融・官公庁関連など様々なシステム開発にいくつか参加しましたが、まさにデスマーチという言葉がぴったりだった。
同じく業務委託で会社的には階層構造にはなってしまっても、チーム内では平等というかメンバー同士が差別なく、スキルの弱い人でもフォローできるフランクなプロジェクトはとてもスムーズにプロジェクトが進んでいた気がします。