こんばんは。


今回は、前回実装したルーレット選択を利用した敵エンカウントの実装例を見ていきたいと思います。


int[] enemy_rate = {80,15,5};


public void encount(){

  if(rand.nextInt(100) < enemy_emergence_rate){

  //敵の出現が確定

     for(int i = 0;i <encount_enemy.length; i++)

      encount_enemy[i] = 0;



    //出現数を確定

    enemylength = rouletteChoice(enemy_rate)+1;

    for(int i = 0;i < enemylength; i++)

      encount_enemy[i] = map_enemy_lib[rouletteChoice(map_enemy_rate)];



    nextScene = SC_BATTLE;

    startAnimation(0);

  }

}


そのまんま持ってきたので、いくつか未知の関数・変数があると思いますが…


大まかな流れとしては、encount_enemy[]の中にエンカウントした敵のIDを入れ、次のシーンを戦闘として指定し、アニメーションを開始することで戦闘を実装しています。encount_enemy[]が0のところは、敵がいないことを意味します。


int型のenemy_emergence_rateは、いわゆる「エンカウント率」です。enemy_rateは一匹、二匹、三匹の敵と出会う敵の確率を意味しています。


map_enemy_lib[]はそのマップで出会う敵のIDを保存したint配列で、map_enemy_rate[]はそれに対応した確率を表すint配列です。ルーレット選択で敵の種類を選択しています。





ざっとこんな感じです。ルーレット選択を関数にしておくと実にスマートに表現出来る事がご理解頂けたのではないでしょうか。


尚、enemy_emergence_rateをenemy_rateの先頭に加え、0匹、1匹…の確率にすることも可能です。そうしなかったのは、「敵の出現率」というものを直感的に操作できるようにしたかったのと、エンカウント方法として単純なランダム以外の方法を採用するということも考慮したため、というシンプルな理由です。


他のエンカウント方法としては、あらかじめ次の敵を出現させるまでの歩数を決めておく、という手法が有名です。この方法の方が、敵の出現頻度がばらつかず、ユーザーにストレスが少ない場合が多いという利点があります。