第3回.連載でJavaゲーム作っちゃいます弐
ほるえ: さて、今回からプログラミングに入るんですよね。
Masa: うん。とはいうものの、結構大変なのであせらずいこう。
で、いきなり話は脱線するわけだけど簡単にゲームを作りたいってのは、やっぱりみんな思ってんだね。
ほるえ: あ、ロイマスタングさんの書き込みですね。
Masa: うん。こんなページをやってるからプログラム得意と思われてるかも知れんけど、僕も素人だから、わかりやすい解説が書けるかというとちょっと。
ほるえ: (解説ページをみて)なるほど。
Masa: (うっ)だからなるべくどうやって作っていくかを実感できるように今回はやっていこうと思います。
ほるえ: ふーん。一応考えてるんだ。えらいえらい

「キャラクタの移動可能位置をどう判定するか」

このプログラムを「いきなり組め!」といわれて組める人は少ないでしょう。でも実際「このプログラムのここをこう代えて」と具体的に言われれば何とかできると思います。(この具体化が作業としては厄介ですが・・・)
ここでは、「すらすれ」で公開しているソースを変更して作っていく事にします。

変更点を考えます。
・「すらスレ」:同じキャラクタが続いている限り、探索する
 下に、すら落ちの探索ルーチンの1部を示します。やっていることは、
 基準位置(V,H)と、その上の(V−1,H)(画面は上から下に向かって座標が増えます。)
 を比較。同じだったらスタックへ保存。という処理です。

・「シミュレーション(移動)」:移動ポイントが尽きるまで探索。

@スタックに移動可能ポイントを増やします。
A上のコマに動くのに必要な移動ポイント以上残っていたら移動できるのでスタックに保存します。
  このとき、移動量をコマ移動での減少分を減らしておきます。
Bこれを四方繰り返すと、移動可能領域がすべて出てきます。


すら落ち シミュレーションゲーム
while(mitanpc>0){
//未探索領域の読み込み
  V=mitansaku[mitanpc][0];
  H=mitansaku[mitanpc][1];
  mitanpc--;

//マスの上側をチェックする。

  if( V-1 >= 0){
   if(Stage[V][H]==Stage[V-1][H]){
   flag=true;
//探索済みを探していないか?
   for(int i=0 ;i<=tanpc;i++){
    if((tansaku[i][0]==V-1)
           &(tansaku[i][1]==H)){
     flag = false;break;
   }}
//未探索を2度探していないか?
   for(int i=0 ;i<=mitanpc;i++){
    if((mitansaku[i][0]==V-1)
           &(mitansaku[i][1]==H)){
    flag = false;break;
   }}
//良ければ、未探索スタックに格納
   if(flag){
    mitanpc++;
    mitansaku[mitanpc][0]=V-1;
    mitansaku[mitanpc][1]=H;
   }}}
while (mitanpc > 0) {
//未探索領域の読み込み
  V = mitansaku[mitanpc][0];
  H = mitansaku[mitanpc][1];
  
IDOU = mitansaku[mitanpc][2];

  mitanpc--;
//マスの上側をチェックする。
//自分の残り移動量で移動できるか?
  if (IDOU >= map[V - 1][H].GetCost()) {
    flag = true;
//探索済みを探していないか?
    for (int i = 0; i <= tanpc; i++) {
      if ( (tansaku[i][0] == V - 1)
            & (tansaku[i][1] == H)) {
        flag = false;break;
      }}
//未探索を2度探していないか?
    for (int i = 0; i <= mitanpc; i++) {
      if ( (mitansaku[i][0] == V - 1)
            & (mitansaku[i][1] == H)) {
        flag = false;break;
      }}
//良ければ、未探索スタックに格納
    if (flag) {
      mitanpc++;
      mitansaku[mitanpc][0] = V - 1;
      mitansaku[mitanpc][1] = H;
      
int ido_zan
     = IDOU - map[V - 1][H].GetCost();

      mitansaku[mitanpc][2] = ido_zan;

    }}


Masa: こんな感じで、実際に動作しているプログラムを雛型にしてソフトを作っていくと簡単に出来ます。
っておいっねてるだろっ
ほるえ: えっ。ああ終わったの?うん。すごいすごい。
Masa: おまえなっ。ひとがせっかく・・・
ほるえ: ていうか、やっぱり動かして見ないとぜんぜんわかんないよ。
私と一緒に寝てた人も、856人はいるよっ
Masa: その具体的すぎる数字はなんだよっ。
ちゃんとサンプルもあるから、こんどはねるなよ。
ほるえ: はーい。

「キャラクタの移動可能位置をどう判定するか」

で、具体的にプログラムを動作させていくと、ちょっとしたキーミスなんかが元で、バグが出ます。
このとき、ソフト側に工夫をして、デバックをしやすくしておくと便利です。


キャラクタグラフィックは、こちらからお借りしています。


デバックソフトの動作
 中央の騎士が移動できます。この騎士は移動力を3コマ分持っているので周囲に3コマだけ移動できます。
 この移動できる位置が四角、残り移動量が左隅に出ます。この四角の一部をマウスでクリックすることでそこに移動できます。


サンプルが表示されない場合は、Java環境がインストールされていない可能性があります。
SUNホームページから、J2SE v 1.4.2_07 JRE以上のバージョンをダウンロードしてください。
Masa: まあ、全体からみれぱまだまだほんの1部だけど、機能ごとにデバックしたほうがわかりやすいから、これぐらいで動かしてもいいと思う。
ほるえ: なるほど。こんな風になってるとうまく動いてるかどうかがわかりますね。それになんとなく眠くないし。
Masa: 眠い眠くないはべつとして、デバックの方法は人それぞれだから、自分がわかりやすければいい。JBuilderとかにもデバック機能があるからこれと併用するといい。ってこんな感じで今回やってみました。
ほるえ: あ、いきなりまとめに入りましたね。ネタが切れましたか?
Masa: (どきっ)そ、そんなことないぞ。少しずつやっていったほうがわかりいいしな。
ほるえ: まあ、そういう事にしておきますか。

Copyright (C) 錬金術師Masa
新規:2005年08月6日