今からはじめるプログラミング12
もんすたーさぷらいずどゆー
ウィザードリィ〜のモンスターとの遭遇でモンスターがプレイヤーキャラクターを驚かせた、つまり、モンスターが先手の戦闘への突入メッセージで、古く?はスクウェア(チュンソフトだっけ?)のファミコンソフトのポートピア連続殺人事件(でよかった?)で、みれたのだけれども、僕は攻略情報をみながらでないと全然クリアできなかった。
小学生の時に意味不明のメッセージだったけれども、中学校で友達の家でウィザードリーをPC8801で遊んで、ようやく理解できた。
さらに別の友達がウィザードリーのコピー(すいません。最初はコピーから入りました。)手に入れてくれたもので、みんなで英語に四苦八苦しながらなんでこんな文字だらけのゲームが面白いのか、という感じでRPGに引き込まれて行きました。
というわけで、フィールドを歩くとモンスターと出会う、そんな処理をいよいよ追加です。
正直面倒臭い。
のでサイコロというクラス(Sai.java)というのはコーディングするのが微妙なくらいな単純にサイコロをつくってみたクラスです。
引数に確率を渡すと、その確率以下か外れてしまったかを返します。製作日付がかいてあり、2003年ということで、たぶん最初のプロジェクトに参加している頃だと思います。
これは細かいことはgoogleドライブをみてもらって。
さてフィールド上の情報をまとめたクラスを作成しました。ひとつのjavaファイルに以下の2つのクラスを記述しています。
FieldProperties
FieldProperty
----------------------------
package sample7;
import java.util.HashMap;
public class FieldProperties {
public static final String KEY_SEA = "2";
public static final String KEY_GLASS = "1";
private HashMap<String,FieldProperty> data = new HashMap<String,FieldProperty>();
public FieldProperty getFieldProperty(String key) {
return data.get(key);
}
public void setFieldProperty(String key,FieldProperty fieldProperty) {
this.data.put(key, fieldProperty);
}
//TODO プロパティファイルからのロード
public FieldProperties() {
FieldProperty prop1= new FieldProperty();
prop1.setName("海");
prop1.setEnabled(1);
prop1.setEncount(20);
prop1.setEvent(0);
prop1.setImg_path("./sea.png");
this.data.put(KEY_SEA, prop1);
FieldProperty prop2 = new FieldProperty();
prop2.setName("海");
prop2.setEnabled(1);
prop2.setEncount(20);
prop2.setEvent(0);
prop2.setImg_path("./glass.png");
this.data.put(KEY_GLASS, prop2);
}
public class FieldProperty{
private int enabled = 0;
private int encount = 0;
private int event = 0;
private String img_path = "";
private String name= "";
public int getEnabled() {
return enabled;
}
public void setEnabled(int enabled) {
this.enabled = enabled;
}
public int getEncount() {
return encount;
}
public void setEncount(int encount) {
this.encount = encount;
}
public int getEvent() {
return event;
}
public void setEvent(int event) {
this.event = event;
}
public String getImg_path() {
return img_path;
}
public void setImg_path(String img_path) {
this.img_path = img_path;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
----------------------------
フィールドの表示には画像へのパスがあればよかったのですが、そもそもそのフィールドがなんなのか、移動可能な場所なのか、
フィールドでのモンスターとの遭遇率とか、そういった属性(プロパティ)を管理します。本当は外部ファイルにして読み込むようにしたいですね。
そして、これを描画クラスに置き換え、フィールドに移動したところで、モンスターとの遭遇の判定を行います。
そんな風に
FieldRenderer
を書き換えました。
-----------------------------------------
package sample7;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;
import sample7.FieldProperties.FieldProperty;
public class FieldRenderer implements TableCellRenderer {
private FieldProperties fieldProperties = null; public FieldRenderer() {
fieldProperties = new FieldProperties();
}
@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; FieldProperty fieldProp = null;
//TODO 移動が可能かの判定(移動できないフィールドの処理、ここではないかも)
switch(mapCode) {
case 1: // 式を評価した値が定数1と一致したときに実行される処理
// icon= new ImageIcon("/Users/matsuiyoshikazu/eclipse-workspace/sample/src/resource/11/glass.png");
// icon= new ImageIcon("./glass.png");
fieldProp = fieldProperties.getFieldProperty(FieldProperties.KEY_GLASS);
icon= new ImageIcon(
fieldProp.getImg_path()
);
label.setIcon(icon);
break;
case 2: // 式を評価した値が定数2と一致したときに実行される処理
fieldProp = fieldProperties.getFieldProperty(FieldProperties.KEY_SEA);
icon= new ImageIcon(
fieldProp.getImg_path()
);
label.setIcon(icon);
break;
case 0: // 0をキャラクターとする
icon = new ImageIcon("/Users/matsuiyoshikazu/eclipse-workspace/sample/src/resource/11/ぺんぎん.png");
label.setIcon(icon);
break;
}
if(fieldProp!=null) {
//TODO フィールドイベント
Sai saicoro = Sai.getInstance();
//サイコロクラス
// int encount_per = fieldProp.getEnabled();
//遭遇率
boolean encount = saicoro.isHitProbability(encount_per);
//遭遇率いか
if(encount) {
System.out.println("モンスターと遭遇した");
//TODO 先頭画面へ
}
//TODO 「調べる」コマンド入力された場合
}
return label;
}
}
-----------------------------------------
画像ファイルをクラスパス直下(いろいろ面倒臭いので)においたりもしています。
というわけで、動作させたところこんな感じです。
見え辛くてすいません。フィールドを移動したタイミングでそこでの遭遇率と判定して、遭遇したら、遭遇したことをシステムアウトでコンソールに表示しています。
夜勤前ちょっと早起きくらいで、まずまずなプログラムですね。
いろいろ突っ込みどころが多そうですが、ここまで動くとRPGっぽさがだいぶ感じていただけるのではないでしょうか。