2010/06/27大枠が決まったところで、中間ゴールを設定しようと思う。後追いでも、いまのペースではいつまでたっても完成しないだろう。適切な目標がなければモノ作りは進まない。「OOPによるドラクエの完全再現」というゴールでは、誰が見てもあまりにも規模が大きい。実現可能なサイズに分割するべきだ。お城やダンジョンを作って、フィールドを自由に動き回れるシステムというのもいい。ドラクエといえばバトルである。戦闘システムの構築から始めてみようと思う。文字ベースのバトルなら画像を用意しなくてもいいのでロジックに集中できるだろう。パーティバトルもあるが、最初は1対1のバトル。勇者対モンスターの構図も取り払うつもりでいる。Heroクラスは考える要素が多いので、しばらく寝かせておく。モンスター対モンスターの戦いから作っていこう。最近ではモンスターズなんてシリーズもあるみたいだ。n対nの戦い、対勇者戦、グラフィックやエフェクトの表現などはアジャイル的展開で追加していくことにしよう。真にOOP的な実装ができたなら、想定内の変更は容易なはずである。「テキストベースのモンスター対モンスター(1対1)のバトル」これをファースト・イテレーションのゴールと定める。■リファクタリングさて、目標をモンスター同士のバトルと定めたので、既存クラスを修正していく。前回、考察した獲得経験値と獲得Gがずっと気になっていた。0;『勇者にとって、経験値とGは獲得するものであるが、モンスターの経験値とGは与えるものである。モンスターが勝利しても、勇者の経験値が得られない。実は、根本的に間違っている感じがする。過ちに気がつけば、さっさと修正するのが吉だろう。モンスター同士のバトルという明確な目標が決まったので、普通に経験値とGは保持することにした。Heroクラスと共通の要素になるので、親クラスのBattlerに持たせておく。シンプルにするために、攻撃力と守備力もいったんBattlerクラスに預けておく。このあたりのメソッドは最終的にどうなるかは、いろいろと迷うことになるだろう。Battlerクラスのパラメータはこのようになっている。0;max_hpという書き方が気に入らなかったので、微妙に変数名は修正している。納得できるまで名前を変更できるのも、リファクタリング機能のおかげである。Studioでも常識なので特に解説はしない。戦闘に関する基本動作をBattlerクラスに持たせると、Monsterクラスには何も処理がなくなった。このクラスはモンスター固有の攻撃や特殊な振る舞いのために残しておくことにする。■HPを増減させるメソッド各フィールドにはsetter/getterと呼ばれるアクセサメソッドを用意した。getterはよいとしてsetterの場合、setHp(10)→変数hpに10を代入という処理となる。戦いは命の削りあいである。10のダメージを与えたら、hpから10を減らしたい。ようなメソッドを用意する。HPを0から最大HPの範囲で増減させる。hp;}引数が正の場合はHP回復させる。負の場合はダメージを与えることができる。addというネーミングがどうもしっくりとこない。ほかによい名前が浮かんだらメソッド名を変更しよう。MPなど、ほかのメソッドにも同様のメソッドを追加しておいた。上限のないGなどは少しシンプルな処理になる。がんばればいくらだってお金持ちになれる、というユメのあるメソッドだ。厳密にいうとintの上限が存在するのだが......せめてlongにするべきか迷い中である。Gを0以上の範囲で増減させる。■スレッドについてHP、MPのsetterがスレッドセーフじゃないというご指摘をいろんな方からいただいた。考えてみると範囲チェック後、代入する前に別のスレッドが値を書き換える可能性がある。ふたつのスレッドA,Bが実行されているとして、setMpメソッドの動きを考えてみる。それぞれが同時にsetMpを実行したとする。スレッドAの範囲チェックが無意味になる。ギラの消費MPは2である。残りMPが2の場合にギラを唱えようとしている瞬間にMPを吸い取るマホトラの呪文がかけられたらどうなるだろう?このような場合、マルチスレッド下では、ギラ呪文を唱えるために必要なMP消費と、マホトラで奪われるMPのどちらが優先されるかは実行するまで分からない。MPが吸い取られているにも関わらず、ギラが実行されてしまう可能性もあるのだ。synchronizedメソッドを使えば、この問題は回避できる。synchronizedメソッドは、多用すればするほど全体の処理速度が低下する。本当に必要でない限り乱発するのは避けたい。StringBufferに対するStringBuilderクラスのようにスレッドアンセーフを選ぶという道もあるだろう。戦闘は単一スレッドで行うという方針もあるのでこれも保留しようと思う。マルチスレッド時における「同時ギラ-マホトラ問題」と定義しておく。それなりにペンディングが増えてきている。放置していると忘れることは間違いないので、簡単に課題管理表なんてものを作ってみた。課題が増えればtracでチケット管理をすることになるかもしれない。これで下準備はできたと思う。次回はいよいよ攻撃メソッドに着手してみよう。どこか遠くからレベルアップを告げるアラート音が鳴り響く......。18:46HPはヒットポイントですが、MPはマジックパワーではないかと。23:27>wanwanさんコメントありがとうございます。ドラクエIからずっとマジックパワーだったみたいですね。衝撃の事実に戸惑っています(^^)次回から「マジックパワー」に統一させていただきます。貴重な情報ありがとうございます。名前を記憶しておくコメント:SpecialPRスポンサーからのお知らせPRはがねのつるぎスキルを捨てることもまたスキルではないかと、禅問答のような世界に迷い込むフリーエンジニア。久しぶりの対面研修で思ったことよく学びよく遊びよく寝る、頭の回転が良い子供がたくさん育つ国になるといいな。新着記事SpecialPR@ITメールマガジンのお申し込み新着記事をいち早く知りたい、オリジナルコラムを読みたい――メールマガジンに登録して、@ITを120%使いこなそう。ITmediaはアイティメディア株式会社の登録商標です。