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

CodeRuler制作者との舞台裏インタビュー

記事に戻る

世界征服に多忙を極めるのにもかかわらず、ここは一休みして、CodeRulerの制作者であるTim deBoer氏をつかまえてから彼にいくつか質問を投げ掛けることにしました。彼はIBM WebSphere Toolsグループにて働いています。

developerWorks(以下dW) まず、なにゆえCodeRulerなのでしょうか?

deBoer氏(以下敬称略) 私はコンピューター・ゲームをプレイすることを常に堪能しますし、新しいゲームを制作することを同じくらいに楽しみます。

dW: CodeRulerは正式なプロジェクトなのでしょうか?開発チームのサイズはどの程度なのでしょうか?

deBoer: CodeRulerとは、具体的にACM-ICPCに向けて開発され、数年間にわたりACM-ICPC チームとともにアイディアに磨きをかけ続けた末に実現した集大成なのです。特に、John Clevenger 氏(共同設計者)とSam Ashoo 氏には大いに助けられました。

業界を仰天させるために、CodeRuler はかなり少数のチームにより設計そして開発されました。かなり控え目に言えば、チームの人数が(世界中から選ばれたコンピューター・サイエンス専攻の生徒からなる)200人以上に膨張したのがストレスへの耐性を試す良い機会でした。数時間もかけてゲーム、API、そして文書を隅から隅までチェックしても、思いもつかなかったような質問を常に投げ掛けられ、我々が予測もし得なかった方法でゲームが使用されました。

dW: ACM-ICPC以外で、CodeRuler のトーナメントまたはコンテストはどこで開催されたのでしょうか?

deBoer: CodeRulerは、UCSD(University of California at San Diego)でのプログラミング・コンテストやUSA Computing Olympiadを含む様々なコンテストにて採用されています。Javaコミュニティーのゲーマーと教師たちにより採用され続け、卓越したCodeRulerのプレイヤーが育つのを楽しみにしています。

dW: CodeRuler の設計思想についていくつか教えてください。

deBoer: 1つの効果的な作戦だけで勝てるようには、このゲームは設計されていません。農民、ナイト、そして城までをも作戦に組み込み、調和が取れて計画的な方法で活用するのが作戦の真髄です。たいていの場合、農民とナイト用に別々の作戦を考え付き、互いに干渉したり互いの真似をしないように実装する方法を考え出したチームが勝利を手に入れます。例えば、ただ単に土地を占領するように実装された農民は、新たな土地を占領するかわりに互いの通り道に干渉しあい既に占領した領地ばかりを繰り返し通過しようとします。自軍の農民が敵軍のナイトに捕獲されないようにするなど、細かい部分への気配りも忘れてはなりません。

dW: 予期できないほどに斬新で画期的な作戦を最近お目にかかれましたでしょうか?

deBoer: ACM-ICPC Java Challengeに参加した68チームのうち、優勝したLeilu Tarawaチーム(University of Calgary)が最もオリジナルな作戦を披露しました。

自軍のナイトが敵軍の駒(農民、ナイト、城)を相手にした戦闘にて勝利を収めると、それぞれのチームが点数を稼ぎます。城が反撃せず逃げ回らないうえに破壊されないので『再利用可能』な点数稼ぎの源であることに、プレイヤー達は気付きました。敵にわざと自軍の城を明け渡し、占領された城を再度占領して奪回します。そうすれば自軍の育成と他の戦局での勝利から遠ざかりますが、このテクニックを駆使すればそれぞれの対戦で多くの点数を稼げます。これだと自軍の城を占領しようとしている敵軍にも多くの点数を譲ることにもなります。しかし、多くの対戦を積み重ねるうちに自軍の城を占領しようとする敵軍のチームの数が増えるために点数の譲歩が複数のチームに分散され、時間の経過とともに点数稼ぎの競争が安定性を保ちはじめるうちに、(全ての対戦にてこの方法で点数を稼ぎ続ける)自軍は総合得点でリードを確保するようになります。

dW: 我々の読者の中でも先進的な方々は、CodeRulerの裏側にあるシミュレーション・エンジンに興味をいだいております。その技術について何か教えていただけますでしょうか?

deBoer: CodeRuler のシミュレーション・エンジンはCodeRallyにて使用されたエンジンをベースにしています。開発のユーザー・インターフェースとして機能するようにシミュレーションを同時に表示したり、トーナメントを実行して後のプレイバックのためにディスクに保存したりなど、それは様々な異なるモードでシミュレーションが実行されるようにしています。コンテスト参加者のマシンにてデバッグができるようなテスト・トーナメント、参加者同士の対戦をランダムに表示する観戦用ディスプレイ、そして勝者を決定するために複数の対戦とラウンドを実施するフル・トーナメントを実行する様々なモードがあります。

このシミュレーターは状態ベース(ターン制)のゲームです。ターン毎にそれぞれのチームの繰り出す動きを待ちます。それからゲーム内のそれぞれの『キャラクター』(駒)をウォークスルーして動かし、その結果を画面に表示します。

dW: CodeRulerの設計上にて、どのようにしてフェアプレイを保証するのでしょうか?

deBoer: 複数のチームが互いを相手にリアルタイムで対戦できるように、CodeRuler は設計されています。ゲームのエンジンの安全性を保障するために、いくつかの項目を保証しなくてはなりません。

  • 他チームのコードへ直接アクセスしたり影響を及ぼしたりができないようにすべきです。(全ての相互作用はゲームのエンジンを介してのみ行なわれるべきです。)
  • 他チームのコードがローカル・マシンにコピーされてテストされる場合、そのローカル・マシンを所有するチームがそのソースやコンパイルされたデータを使うことがないように、それは暗号化されるべきです。
  • 1つのチームからの出来の悪いコードがゲームのクラッシュを発生させないようにすべきです。
  • 1つのチームが別のチームよりも多くのCPU時間を得るべきではありません。

これらの項目の多くをJavaがネイティブでサポートしますので、Javaを使ってゲームのコードを作成することをおすすめします。Javaの一部を成す下記の項目を使います。

  • それぞれのチームのコードが独自のネーム・スペースにて存在することをJava言語はサポートしますので、別のチームから直接アクセスされません。CodeRuler APIを介して参照が受け渡されるとき、常にチームは直接参照のかわりに別のチームへのプロキシーを与えられます。
  • 他のチームのコードがローカル・マシンにコピーされる場合、それは既に暗号化されています。(暗号化解除されたコードが見られないように)暗号化されたファイルからクラスを直接ロードしてメモリーから実行する特殊なClassLoaderが作成されました。
  • 我々が独自のSecurityManagerを提供しますので、スレッドを作成してゲームを終了させたりするなどの行為を防ぐようにしています。
  • 同時に多くのチームにコードを実行させますと、1つのチームがCPUに過大な負荷をかけたりすることもあります。ゲームの続行をはばむ無限ループを含むのであれば、参加者にメイン・スレッドでの実行を許可するのは危険かも知れません。これを阻止するために、ターン毎にそれぞれのチームのコードを起動するようにスレッドが作成されます。メイン・スレッドはスレッドを監視し、設定されたタイムアウトを超過してもスレッドが続行され続ければそれを停止します。

dW: 最後になりますが、新進気鋭のCodeRulerの候補生たちに向けて何か一言お願いします。

deBoer: 至上のコードが勝利を収めんことを!

記事に戻る

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