目次


CodeRuler で中世世界の王国を攻略

アニメーション入りのグラフィカル・シミュレーターで Java プログラミングのスキルを伸ばそう

Comments

2004 ACM International Collegiate Programming Competition (参考文献を参照) にて登場した CodeRuler は、IBM alphaWorks が提供する最新のファンタジー系ゲーム・シミュレーターの野心作です。このゲームは単純な前提の上で成り立っています。プレイヤーは中世世界の王国の支配者。プレイヤー率いる農民とナイト達は、生存、繁殖、そして繁栄のために、プレイヤーの持つ洗練された戦略的思考、臨機応変な適応能力、そして優れた Java プログラミングのスキルに全てを任せて委ねます。王国の支配者をシミュレートする Java コードを書き出すのが、プレイヤーの持つ使命です。このゲーム・シミュレーターはプレイヤーの操作する支配者を最大 6 体の別の支配者 (または同梱されているサンプル支配者) を相手に戦わせ、勝者を決定します。

この記事は、プレイヤーを中世世界の王国支配に導く近道へといざないます。記事はゲーム環境を明らかにし、ルールを説明し、一般的な戦術を考察し、そして既に完全であり直ぐに使用や修正が可能な機能中の支配者のエントリーを 2 つ提供します。

シミュレーション環境

CodeRuler は、グラフィカルでアニメーションの入ったシミュレーション・ゲーム環境です。中世世界の支配者として、プレイヤーは領地と支配のために他の支配者を相手に戦います。あなたの王国を成すものは、以下の通りです。

  • 土地を占領し耕す農民。
  • 戦闘に参加でき、敵国の農民、ナイト、そして城を捕獲できるナイト。
  • ナイトと農民を生産できる城。占領した土地が広大であれば、生産速度も上昇します。

グラフィカルなゲームの世界

2-D の王国マップに表現される世界で、ゲームは進行します。(背景にある地形のスケッチはただの壁紙としてしか機能せず、ゲーム性に影響を及ぼしたりゲームの進行に伴い変化しません。) 図 1 は、CodeRuler のゲーム進行の様子を表しています。

図 1. CodeRuler のゲーム進行画面
CodeRuler のゲーム進行画面
CodeRuler のゲーム進行画面

図 1 は 2 国間の衝突を表しています。支配者 (ゲーム中の駒の戦略的行動を裏側から操作する軍師) は、このゲームの世界の画面には直接登場しません。ゲーム駒 (農民、ナイト、そして城) は、シミュレートされた世界 (表舞台) の中を動き回る色付きのドットです。駒の形状そして移動可能な方向を示す図解を図 2 に示します。

図 2. CodeRuler のゲーム駒の移動パターン
CodeRuler のゲーム駒の移動パターン
CodeRuler のゲーム駒の移動パターン

図 2 を見れば一目瞭然ですが、ナイト (knight) と農民 (peasant) の移動パターンは同じです。ナイトと農民は、それぞれのターンにて 8 方向のうちの 1 方向にマス目 1 つ分だけ移動できます。それぞれの方向には関連番号 (Java コーディングで使用します) が振られています。それぞれの番号にはコード上で使用できる定義済み定数 (例: 北西を意味する NW) が与えられています。

コンソール上のスコア表示

図 1 の右側にステータス・コンソールがあるのがおわかりでしょう。プレイ中の支配者の名前、そして支配者が所属する組織名がコンソールの上の方に表示されます。表示された 2 つの番号のうち、左側が支配者の現在スコアで右側は農民が占領したマス目の数 (占領地の面積) です。図 3 は、スコア表示の例を示します。

図 3. コンソール上のスコア表示
コンソール上のスコア表示

図 3 を見れば、支配者「#18」は IBM developerWorks に所属し Simple Ruler と呼ばれています。この支配者の現在のスコアは 123 で、774 マス分の土地を王国の支配下に置いています。右上にある赤色の「X」をクリックすることにより、いつでも好きなときにシミュレーションを中断できます。

占領地の概観表示

図 1 にて示されるステータス・コンソールの中心付近に、ゲーム世界の縮図が表示されているのがおわかりでしょう。図 4 にて再現されているその縮図を活用すれば、それぞれの支配者の占領状況を一目で把握できます。図 4 を見れば、青色で表示された支配者がマゼンタ色で示される支配者よりもはるかに広大な土地を占領しているのが一目瞭然です。

図 4. 占領地の概観表示
占領地の概観表示

シミュレーション・クロック

図 1 の右側に表示されるステータス・コンソールの下にあるのは、クロック (時計) です。図 5 にてその拡大図を示します。

図 5. CodeRuler のクロック
CodeRuler のクロック

太陽は時計の文字盤の周囲を回ります。太陽が一周すれば、対戦終了です。時計が1つ時を刻むたびにシミュレーターのターンが進みます。それぞれのターンで、プレイヤーは支配者として駒の行動を決定します。

戦闘のルール

それぞれの支配者は、ゲーム開始の時点で以下の駒を支配下に置いています。

  • 農民 10 駒
  • ナイト 10 駒
  • 城 1 駒

ゲーム進行中、下記の項目に注意したいものです。

  • 自軍の農民を活用し、出来る限り広大な土地を占領しましょう。(一度入手した領地を失わないように。)
  • 自軍のナイトが敵軍の農民を出来る限り多く捕獲するようにして、敵側による占領を防ぎましょう。
  • 自軍のナイトが、可能な限り多くの敵軍のナイトを相手に闘い、捕獲するようにしましょう。そうすることにより、敵軍の防衛能力が低下します。
  • 自軍のナイトで敵軍の城を攻め落としましょう。城はナイトと農民を生産しますので、城がなくてはナイトと農民の数を増やせません。複数の城を所有すれば、農民とナイトを敵軍よりも速く生産する能力を獲得できます。農民とナイトの生産速度を把握するには、補足情報である「新たな農民とナイトを作成そして追加」をご覧ください。
  • 戦略的な行動を駆使して、自軍の城が敵軍に占領されるのを阻止しましょう。
新たな農民とナイトを作成そして追加

城が農民またはナイトを作成・追加し続ける速度は、占領した土地のマス目の数に依存します。

占領地のマス目の数1 駒の農民またはナイトを追加するのに必要とされるターン数
124 以下作成・追加は無し
12514
25012
50010
1,0008
2,0006
4,000 を超える4

ゲーム駒を捕獲

ナイトのみが敵軍の農民、城、そしてナイトを捕獲できます。相手が農民または城の場合、ただ単にナイトを相手のマス目に移動すれば相手を捕獲できます。敵軍のナイトを捕獲するには、まず敵ナイトの兵力値を 0 まで下げなくてはなりません。それぞれのナイトの兵力値は初期値 100 から始まり、敵側による捕獲行為のたびに 15 から 30 の間のランダム数字の分だけ兵力値を失います。(敵がナイトの場合、相手の兵力値を 0 まで下げてから) 敵軍の駒の捕獲を成功させたナイトは兵力値を 20 ポイント獲得します。

スコアの仕組み

対戦にて勝利を収めるには、戦闘終了の時点にて (対戦参加者の中で) 最高得点をスコアしていなくてはなりません。最も広大な土地を占領している支配者が、必ずしもゲームの勝者だとは限りません。このゲームのスコアの仕組みを表 1 に示します。

表 1. 捕獲と関連するスコアの仕組み
自軍が捕獲した敵軍の駒の種類敵軍捕獲により自軍に追加される得点数
農民4 点
ナイト6 点
15 点

表 2 にて示されるとおり、対戦終了時の (自軍の) 駒の残数、占領した城の数、そして占領した土地の面積 (マス目の数) がスコアに加算されます。

表 2. 残存戦力と関連するスコアの仕組み
残存戦力の種類加算される点数
農民1 点
ナイト2 点
25 点
土地10 マス毎に 1 点

ゲームの詳細

それぞれのプレイヤーは、支配者をシミュレートする Java コードを作成します。ゲーム・シミュレーターはプレイヤーの支配者を別の支配者と対戦させ、勝者を決定します。プレイヤーは Java コード上で農民、ナイト、そして城の行動を指揮します。API のセットが、自軍そして対戦相手の駒に関する情報を提供します。この API を使用して、攻撃的、防御的、そして柔軟な戦略を実装するコードを作成できます。

ゲームのコンポーネント

CodeRuler と言うゲームは、支配者のコードを作成、デバッグ、そしてテストするために Eclipse IDE を必要とします。(この記事にある「Eclipse: 統合王国開発環境」を参照してください。)

CodeRuler は以下の項目を含みます。

  • Eclipse IDE へのプラグインとしての、インタラクティブなゲーム・シミュレーター
  • 支配者をコーディングするのに使える API のドキュメント
  • 行動、捕獲、そしてスコアのルール一式
  • プレイヤー自身の支配者をサンプル支配者に対して戦わせるのに使うローカル環境の戦場
  • 公共のトーナメントにプレイヤー自身の支配者を参戦させるため、または独自のトーナメントを設定するための、ネットワーク・メカニズム

シミュレートされた世界の座標システム

ゲームは 4,608 マス (横 72 マス x 縦 64 マス) から出来た世界で成り立っています。マス目は (x,y) の座標システムを基にして番号を振られています。x 軸は左から右に、そして y 軸は上から下に伸びます。CodeRuler の世界のレイアウトを、図 6 にて示します。(0,0) の座標 (原点) は、左上のコーナーに位置します。

図 6. CodeRuler の世界を表現する座標システム
CodeRuler の世界を表現する座標システム
CodeRuler の世界を表現する座標システム

CodeRuler API、そして継承の階層

ゲーム駒に命令を下す前に、CodeRuler API を把握する必要があります。API は非常にオブジェクト指向性が高く、明示的な継承の階層を持ちます。効果的な CodeRuler のコーディングを実行するには、階層の把握が非常に重要となります。継承の階層を、図 7 で表わします。

図 7. CodeRuler の継承の階層
CodeRuler の継承の階層
CodeRuler の継承の階層

図 7 の継承ツリーは Java インターフェースを基にしています。それぞれのゲーム駒はそれ自身と関連するインターフェースを実装しなくてはなりません。農民は IPeasant を実装し、ナイトは IKnight を実装すると言うパターンです。しかしながら、CodeRuler シミュレーターは内蔵された実装を使用しますので、これらのクラスをコーディングする必要はありません。ゲーム駒に関する情報を入手するだけのためにインターフェースに供給される API を使用する必要性を、(支配者として) プレイヤーは持ちます。

IObject インターフェース
IObject インターフェースは、プレイ画面上の全ての駒へのスーパー・インターフェースです。それぞれの駒は、IObject を間接的に実装します。IObject は、全ての駒の持つ共通の振る舞いを制御します。

  • getRuler(): 駒が所属する支配者
  • getX(), getY(): 駒の現在位置
  • isAlive(): 駒が生きているかどうか (捕獲されていないかどうか)
  • getId(): 全ての駒 (農民、ナイト、城) に与えられた固有の ID

IObject スーパー・インターフェースには、2 つのコンビニエンス・メソッドがあります。これらのメソッドは、戦略的な作戦ではかなり便利で、複雑な三角法の計算に労力を費やすことを回避するのに役立ちます。

  • getDirectionTo() は、画面上で指定された座標へ最も近い方向を計算します。
  • getDistanceTo() は、画面上で指定された座標への距離を計算します。

IPeasant インターフェース
IPeasant インターフェースは IObject インターフェースに新規の振る舞いを追加しません。支配者の move() メソッドで農民を動かし、位置を変更できます。農民を使うことにより、土地を占領できます。農民の持つ自動的な振る舞いは、通過する土地を全て占領することです。敵対するナイトは一手で農民を捕獲できます。この場合、兵力値を考慮に入れる計算を伴いません。

ICastle インターフェース
IPeasant インターフェースと同様に、ICastle インターフェースは IObject インターフェースに新規の振る舞いを追加しません。農民またはナイトを次々と生産するのが、城に与えられた自動的な振る舞いです。生産のスピードは、占領している土地の広さに依存します。補足情報「新たな農民とナイトを作成そして追加」で、生産スピードを確認しましょう。

IKnight インターフェース
IKnight インターフェースは、IObject インターフェースに getStrength() と言うメソッドを 1 つ追加します。兵力値が 0 になると、ナイトは捕獲されます。IKnight インターフェースにある getStrength() メソッドを作戦実行時に使えば、ナイトの損失を防ぐことが可能です。ナイトの兵力値計算についての考察をお求めでしたら、前述の「ゲーム駒を捕獲」を参照してください。

図 7 のインターフェース階層は、シミュレーションの世界 (表舞台) で動き回るゲーム駒を表わしています。しかし、支配者はゲーム駒では無く、シミュレーションの世界 (表舞台) で動き回ったりしません。IRuler インターフェースが支配者の振る舞いを指定します。

IRuler インターフェース
IRuler インターフェースは IObject から継承されませんし、その必要もありません。IRuler インターフェースの継承の階層を、図 8 にて示します。

図 8. Iruler インターフェースの継承の階層
Iruler インターフェースの継承の階層

IRuler インターフェースは全ての支配者が実装する一般的な振る舞いを指定します。作戦の実装に役立つ通知メソッドを含みます。

  • getPeasants() は、この支配者の支配下に置かれた農民全員のリストを取得します。
  • getKnights() は、この支配者の支配下に置かれたナイト全員のリストを取得します。
  • getCastles() は、この支配者の支配下に置かれた全ての城のリストを取得します。
  • getLandCount() は、支配者が所有する土地のマス目の数をカウントします。
  • getPoints() は、支配者が稼いだ現在スコアを取得します。
  • getRulerName() は支配者の名前を取得します。
  • getSchoolName() は、支配者を作成した者が所属する組織名を取得します。

Ruler クラスと MyRuler クラス
ゲームのルールに特定された振る舞いを強制し、IRuler インターフェースの実装を支援するために、図 8 に示されるとおり CodeRuler は Ruler クラスを供給します。このクラスは IRuler メソッドのほとんどにデフォルト実装を提供します。Ruler クラスから継承すべき MyRuler クラスのコンテントを書き出します。Ruler クラスは修正する必要はありませんし、絶対にするべきではありません。

MyRuler の実装にて使うべき重要なアクション・メソッドを、Ruler は幾つか提供します。

  • move() は、ゲームの世界にて駒を動かします。
  • capture() は敵軍のゲーム駒を捕獲しようとします。

城の生成モードを変更する幾つかのメソッドをも Ruler は実装します。デフォルトとして、プレイヤーの城は農民を生産し続けます。しかし、これらのメソッドを使って、代わりにナイトを製造するように城に命令することも可能です。

  • createKnights() は城にナイトを製造するように命令します。
  • createPeasants() は城に農民を製造するように命令します。

最後に述べますが決して忘れてはならないのは、Ruler クラスの存在理由のひとつとしてプレイヤー自身の MyRuler クラスにて実装しなくてはならない追加的な抽象メソッドを定義することが挙げられます。シミュレーション・エンジンは実行の途中にてそれらのメソッドを呼び出します。

表 3 にてリストされるメソッドを実装するコードのみを書き出せばよいだけの話です。

表 3. 全ての MyRuler 実装でのメソッド
メソッド説明
getSchoolName()プレイヤーの所属するグループまたは組織を識別する 25 文字以下のストリングを戻します。(元々CodeRuler は大学同士の対戦に向けて開発されましたので、『school (学校)』となっているのです。) 支配者を識別するために、これはゲーム進行中に使われます。図 1 での例として、Simple Ruler の『学校名』は IBM developerWorks です。
getRulerName()プレイヤーの操作する支配者を固有のものとして識別する 25 文字以下のストリングを戻します。例えば、図 1 に登場する支配者のうちの 1 人は、Simple Ruler の名前で通っています。
initialize()ゲームの世界に支配者を最初に配置するときに、システムはこのメソッドを呼び出します。ここで必要な初期化を実行します。初期化は 1 秒間に限られます。初期化にてマシンが実行できる処理の量は CPU の速度と使用中の Java VM に左右されますが、1 秒間もあれば大抵のコードの初期化に関するタスクには十分です。遅い入力や出力に依存するかも知れない処理はここでは避けましょう。
orderSubjects()これは CodeRuler の中核を成します。ターン毎にシステムはこのメソッドを 1 回呼び出します。ここでは作戦を行使して、このメソッドで何をするかを駒に伝えます。

Eclipse: 統合王国開発環境

CodeRuler のシミュレーション環境を実行するには、Eclipse IDE をダウンロードしてインストールします (参考文献を参照)。CodeRuler は Eclipse IDE にプラグインとして統合されますので、開発者に優しい Eclipse 機能を推進します。

Eclipse と CodeRuler をインストール

Eclipse をインストールするには、配布物をディレクトリーに落とし込み、eclipse 実行可能ファイルを実行します (*nix では eclipse で、Win32 システムでは eclipse.exe)。バージョン 1.4.2 以降の JDK/JRE がインストールされるべきです。(バージョン 1.4.2 の方を強く推薦します。なぜならば、CodeRuler はその VM バージョンで開発そしてテストされたからです。) Eclipse のインストールが終わりましたら、CodeRuler のエンジンをダウンロードしてください (参考文献を参照)。CodeRuler をインストールするには、CodeRuler 配布物を<eclipse installation directory>/plugins のディレクトリーに落とし込んでください。そうすれば、 com.ibm.games ディレクトリーを plugins ディレクトリーの下に作成できます。Eclipse を起動または再起動すれば、CodeRuler プラグインはロードされます。これで CodeRuler を実際に動かす準備が整いました。

CodeRuler のプロジェクトを作成

CodeRuler を使用するには新規プロジェクトを Eclipse の中に作成する必要があります。Windows|Preferences をメインメニューから選択すれば、図 9 にて示されるようなダイアログ・ボックスが表示されます。

図 9. 新規 CodeRuler プロジェクトを作成
新規 CodeRuler プロジェクトを作成
新規 CodeRuler プロジェクトを作成

図 9 にて示されるとおり、左側のリストにある IBM Games を選択してください。次に、右側にある Game リスト (プルダウンメニュー) から CodeRuler を選択してください。最後に、OKをクリックしてテンプレートから新規の CodeRuler プロジェクトを作成しましょう。これで独自かつ固有の CodeRuler をコーディングする準備が出来ました。

IDE の左側にあるタブのバーにて、Java Perspective のタブをクリックします。図 10 にこのタブがあるのがわかります。

図 10. Eclipse にて Java パースペクティブを選択
Eclipse にて Java パースペクティブを選択
Eclipse にて Java パースペクティブを選択

src ノードとデフォルト・パッケージの展開は、図 10 に示されるように、MyRuler.java ノードを表示します。MyRuler.java ノードをダブルクリックすれば、ソース・コード・エディターは編集のためにファイルを開きます。ここにコードを配置します。

最初の支配者をコーディング

最初に作成する支配者は簡単です。それは全ての農民をランダムに動かします。この支配者のコードをリスト 1 にて示します。(新たに追加された部分を太字で表記します。)

リスト 1. orderSubjects()の Simple Ruler 実装
import java.util.Random;
...
protected Random rand = new Random();
public String getRulerName() {
return "Simple Ruler";
   }
public String getSchoolName() {
return "IBM developerWorks";
   }
public void orderSubjects(int lastMoveTime) {
IPeasant[] peasants = getPeasants();
   for (int i = 0; i < peasants.length; i++) {
     move(peasants[i], rand.nextInt(8) + 1);
   }
}

リスト 1 のコードは、1 から 8 の番号をランダムに生成するために java.util.Random を使用します。この番号は農民の移動方向を決定します。全ての農民の配列を取得するために Ruler クラスの getPeasants() メソッドを使い、農民を移動するために move() メソッドを使うことに注目してください。

農民をランダムに移動する行動は、土地の占領につながります。この支配者は敵を捕獲するつもりではありませんので、ナイトを動かすコードを必要としていません。

最初の対戦にて戦闘開始

最初の戦いに赴く前に、ツールバーの Save (保存) ボタンをクリックするかメニューから File >Saveを選択することにより、新規に編集された支配者を保存しましょう。保存の行為は、コードをコンパイルします。次のステップに進む前に、スペルミスや構文エラーを修正しましょう。

図 11 に示されるとおり、CodeRuler に特定された 5 つのアイコン・ボタンに気付くはずです。

図 11. Eclipse ツールバー内の統合された CodeRuler ボタン
Eclipse ツールバー内の統合された CodeRuler ボタン

表 4 は、図 11 のボタンの機能を左から右へと順番に説明します。

表 4. CodeRuler ボタンの機能
ボタン説明
サンプルを相手に実行このボタンを使い、プレイヤー自身が選ぶサンプルの支配者を相手に自軍の支配者をテストします。
サンプルを相手にデバッグこのボタンを使い、プレイヤー自身が選ぶサンプルの支配者を相手に自軍の支配者をテストします。デバッグ・モードで自軍の支配者を実行し、プレイヤー自身が設定したブレークポイントで停止します。
別のチームを相手に実行コードをサブミットした後、別のチームの支配者がダウンロードされます。このボタンを使うことにより、別のチームの支配者を相手に自軍の支配者をテストします。
別のチームを相手にデバッグ別のチームの支配者を相手に自軍の支配者をテストする間、IDE のデバッグ・モードで自軍の支配者を実行します。
コードをサブミットこれで自軍の支配者をサブミットしてください。これまでに他のチームによりサブミットされた全ての支配者の暗号化されたバンドルのダウンロードをもします。

最初の実験では、プレイヤーが最初に作成した支配者はサンプルの支配者のみを相手に実行します。(図 11 でハイライト (選択) されている) 最初のボタンのみを使うことをそれは意味します。このボタンをクリックすれば、CodeRuler は起動されプレイヤー自身の支配者をロードします。図 12 にて示されるとおり、対戦相手を選択することができます。

図 12. 対戦相手を選択
対戦相手を選択
対戦相手を選択

「Do Nothing Ruler」を追加してみましょう。プログラムを実行し、自軍の農民がランダムに動き回って土地を占領するのを観察してください。この対戦は楽勝なはずです。

次に、Random Ruler を試してみましょう。この支配者はプレイヤー自身の支配者とほぼ同一の振る舞いを示します。両軍の土地を占領する能力の平均値は、ほぼ同等です。

他のサンプル支配者を対戦相手として選べば、プレイヤー自身が作成した Simple Ruler は多分負けるでしょう。他のサンプル支配者の大半は、プレイヤーの駒を積極的に捕獲しようとします。プレイヤーの Simple Ruler に新たな攻略能力を追加しなくてはならぬ模様です。

攻撃的な支配者を作成

修正された支配者のコードを、リスト 2 にて示します。追加項目を赤、青、緑のハイライトで表わします。

リスト 2. 積極的な敵軍捕獲に向けて修正された Simple Ruler
import com.ibm.ruler.*;
import java.awt.Point;
import java.util.Random;
import java.util.Vector;
public class MyRuler extends Ruler {
  public String getRulerName() {
return "Simple Ruler";
  }
  public String getSchoolName() {
return "IBM developerWorks";
  }
  public void initialize() {
  }
protected Random rand = new Random();
    protected Vector enemies = new Vector();
    public void orderSubjects(int lastMoveTime) {

            IPeasant[] peasants = getPeasants();
    IKnight[] knights = getKnights();
            for (int i = 0; i < peasants.length; i++) {
      move(peasants[i], rand.nextInt(8) + 1);
    }

            enemies.clear();
    IPeasant[] otherPeasants = World.getOtherPeasants();
    IKnight[] otherKnights = World.getOtherKnights();
    ICastle[] otherCastles = World.getOtherCastles();
    for (int i=0; i<otherPeasants.length; i++) {
       enemies.add(otherPeasants[i]);
      }
    for (int i=0; i<otherKnights.length; i++ ){
       enemies.add(otherKnights[i]);
    }
    for (int i=0; i<otherCastles.length; i++) {
       enemies.add(otherCastles[i]);
    }

            int size = knights.length;
    for (int i = 0; i < size; i++) {
          IKnight curKnight = knights[i];
      if (!enemies.isEmpty()) {  IObject curEnemy = (IObject) enemies.remove(0);
         moveAndCapture(curKnight, curEnemy);
       }
       else
          break;        } // of outter for
     }
  

  public void moveAndCapture(IKnight knight, IObject enemy) {
  if ((enemy == null) || !enemy.isAlive())
    return;
   // find the next position in the direction of the enemy
  int dir = knight.getDirectionTo(enemy.getX(), enemy.getY());
  Point np = World.getPositionAfterMove(knight.getX(), knight.getY(), dir);
  if (np == null)
        return;
      if ((np.x == knight.getX()) & (np.y == knight.getY())) {
    move(knight, rand.nextInt(8) + 1);  return;
       }    
  // capture anything that is in our way
  IObject obj = World.getObjectAt(np.x, np.y);
  if ((obj != null)  & (obj.getRuler()!= this))
    capture(knight, dir);
  else
    move(knight, dir);
    }
 }

リスト 2 にて緑色の文字で示されるコードに見覚えがあるはずです。(リスト 1 を参照してください。)

赤字で示されるコードは、シミュレーションの世界にて生きている敵軍のゲーム駒から成る Vector を設定します。情報を得るために World オブジェクトを使用しているのに注目してください。(World.getOtherPeasants()のことです。)

青字で示されたコードは自軍のナイト全ての間でループし、生きている敵軍のゲーム駒に向けてそれぞれのナイトを動かします。ナイトは付近にいる可能性のある敵軍の駒を捕獲します。それは moveAndCapture() メソッドを使って移動と捕獲を実行します。

moveAndCapture() メソッドは、指定されたナイトを指定された敵軍の駒に向けて移動します。ナイトが「どつぼにはまった」場合に、World オブジェクトの getPositionAfterMove() メソッドを使い、ナイトにランダムな行動をさせます。World オブジェクトの getObjectAt() メソッドを使い、行く先を邪魔する敵軍の駒の有無を確認したり (敵軍の駒があれば) 捕獲したりもします。

この新規の Simple Ruler を、サンプルの支配者を相手に試してみましょう。大抵の敵軍を相手に善戦することに気付くことでしょう。当然、まだまだ改善の余地はあります。訓練として、以下のとおりにコードを修正するのもよいでしょう。

  • 自軍のナイトの数が少なくなった場合に、ナイトを製造するように城に命令する。
  • より効率良くナイトに標的を割り当てる。
  • より効率良く土地を占領するように、農民をプログラミングする。
  • 敵軍の捕獲行為を回避するように、農民をプログラミングする。
  • 農民とナイトの数が少なくなった場合に、防御的な生存作戦行動に移行するようにする。

まとめ

単純で実践的なロボットの様な支配者や洗練された作戦を基にしたゲームプレイの法則に裏付けされた軍師を採用するなど、CodeRuler のプレイ方法には様々なやり方があり、全てはプレイヤー次第です。現実の世界と同様に、最も洗練された作戦行動や込み入ったコーディングが必ずしも確実な連戦連勝の方程式を意味するとは限りません。実を言いますと、一部のチャンピオン支配者達は、最も単純かつ洗練されたゲリラ戦法を展開します。もしも戦略的な設計と Java 開発のために生きていると自信を持って言えるのでしたら、是非とも CodeRuler をお奨めします。


ダウンロード可能なリソース


関連トピック

  • CodeRuler シミュレーション・エンジンの最新バージョン、そして IBM alphaWorks からの関連する文書をダウンロードしましょう。
  • Eclipse IDE、文書、メーリング・リスト、そして業界関連のニュースの最新版でしたら、eclipse.org を訪れてみてはいかがでしょうか。
  • CodeRuler のと同じシミュレーション・エンジンで稼動するまた別のシミュレーション・ゲームの名作をご存知でしょうか?Code Rally であなたもラリーに夢中になること間違いなし!
  • Sing Li 氏による記事「闘え、Robocode(ロボコード)!」(developerWorks、2002年 1月) そして「闘え、Robocode(ロボコード): 第 2 ラウンド」(developerWorks、2002年 5月) で、Robocode についてより多くを学びましょう。
  • 数百ものJava 関連の文献を含む幅広い技術書のセレクションでしたら、Developer Bookstore へどうぞ。
  • developerWorks Java technology ゾーンで、Java プログラミングの全ての側面に関する数百もの記事を見付けられます。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology
ArticleID=219338
ArticleTitle=CodeRuler で中世世界の王国を攻略
publish-date=06292004