どらごんのかんがえたさいきょうのまほう
2017/08/10 コードの記述ミスを修正
本編中でレッドドラゴンが千年…………は流石にかけていないが、かなりの時を費やして作り上げたDragonfireMissileをお見せしよう。
『
public class DragonFireMissile {
//FireMissileをぶちこむ
static class ThreadFire extends Thread{
private Creature creature;
public ThreadFire(Creature creature){
this.creature=creature;
}
public void run(){
while(!isDead()&&canAttack()){
//ベースの火力は1で構わない。
Effect effect=new Missile(1);
//300度の炎
effect.addElement(new FireElement(300));
effect.setTarget(creature);
effect.start();
}
}
//対象が死んでいるか判定
private boolean isDead(){
return Integer.valueOf(creature.getProperty("HP"))<=0;
}
}
private static final int MAXMP=Integer.valueOf(Magic.me.getProperty("MAXMP"));
//攻撃続行判定
private static synchronized boolean canAttack(){
//MAXMPが10分の1になるまで攻撃続行
return Integer.valueOf(Magic.me.getProperty("MP"))>MAXMP/10;
}
public static void main(String[] args) {
for(Object obj:Magic.getTargetObjectList()){
//敵かどうか判定
if(obj instanceof Creature &&((Creature) obj).isEnemy()){
//並列攻撃
new ThreadFire((Creature)obj).run();
}
}
}
}
』
敵を見つけたらスレッドを起こして、相手が死ぬ(HPが0以下になる)か自分のMPが10分の1以下になるまでミサイルを打ち続ける。
Threadで並行処理、synchronizedで排他制御を行い、OutOfMagicPointException対策も施されている。
以下はJava8で同じコードを書いた場合。
『
public class MultiFireMissile {
private static final int MAXMP=Integer.valueOf(Magic.me.getProperty("MAXMP"));
public static void main(String[] args) {
Magic.getTargetObjectList().parallelStream()
.filter(o->o instanceof Creature && ((Creature)o).isEnemy())
.anyMatch(MultiFireMissile::endlessFire);
}
private static boolean endlessFire(Object creature){
while(canAttack()&&Integer.valueOf(((Creature)creature).getProperty("HP"))>0){
Effect effect=new Missile(1);
effect.addElement(new FireElement(300));
effect.setTarget(creature);
effect.start();
}
return canAttack();
}
private static synchronized boolean canAttack(){
return Integer.valueOf(Magic.me.getProperty("MP"))>MAXMP/10;
}
}
』
なお、endlessFireのループはstream化できないことはないが、Java8では動的終了条件が組みにくい(anyMatchなどを駆使する必要がある)ため、whileループのまま残している。




