表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
Javaで学ぶ魔法入門  作者: つむらてんほ
幕間
44/64

どらごんのかんがえたさいきょうのまほう

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ループのまま残している。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ