|
|
キャラクタを移動させるアルゴリズム
アルゴリズムを作っていて一番うれしいと感じるのは,「自分で作ったアルゴリズムが動くところを見る」ときではないでしょうか? 日本IBM主催で大会が開かれた「Robocode」がその代表的なものでしょう。Javaで仮想的なロボットを制御するアルゴリズムを記述し,対戦させるゲームです。アルゴリズムを組み立てたら,さっそくその内容を試せますし,アルゴリズムが悪ければゲームに負けてしまいます。こうして楽しみながらトライ&エラーでアルゴリズムを組み立てられるところから,新人研修などで最近よく使われているようです。
本連載では,いろいろなアルゴリズムを紹介してきました。これまでの集大成として今回と次回の2回を使って,プログラム同士を対戦させるゲームを取り上げてみます。
今回の対戦ゲームが動作する仕組みを表したのが図1です。ゲームの進行,魔法攻撃の当たり判定,キャラクタの位置やダメージなどの管理などはすべてゲームの進行をつかさどるモジュール(以下ゲーム・システムと呼びます)の関数で実行します。ゲームのプレーヤ(プログラマ)は,自分で管理するデータを初期化する関数や,キャラクタを移動したり魔法を唱えたりといった1回のターンにおける行動を決める関数だけを用意します。ゲーム・システムが必要に応じてこれらの関数を呼び出すことで,ゲームを進めていくわけです。
![]() |
図1●今回のゲームが動作する仕組み |
ゲーム・システムはこちらで用意しましたので,プレーヤはキャラクタ移動などのアルゴリズムだけを記述すれば済むようになっています。連載目次ページからダウンロードして,気軽に取り組んでみてください。
|
ゲームを有利に進めるためにどうすればいいかを考える
ゲームで勝利を得るためには,何よりもまずルールを熟知することが大切です。カコミ記事「ゲームのルール」を眺めてみると,このゲームのポイントはだいたい以下のようになるでしょう。
・魔法の要素を効率よく集める相手を攻撃したり防御をするためには,各地点にある魔法の要素を集めないといけません。ゲームを有利に進めるには,効率よくマップ上を移動して魔法の要素を集めながら進んでいく必要があります。
・限られた要素を限られたポケットへ詰め込むプレーヤが操作できるキャラクタは,魔法の要素を最大10個しか持てません。マップに魔法の要素が豊富にあっても詰め込むには限界があります。その一方で,プレーヤ側に余裕があっても必ずしも目的の要素が得られるとは限りません。そうなると,使いたい魔法があって,それに合わせてマップ上を移動して要素を集めていく「目的型」か,マップ上をまわって,最も多く集めた要素に基づいて使う魔法を決める「成り行き型」という2通りの考え方が生まれると思います。
・敵がどこにいるかを推測するこのゲームでは,そのままでは相手がどこにいるのかがわかりません。攻撃するためには相手の居場所を知る必要があります。魔法で調べたり,周囲を調べる行動を指示することで相手の位置を探っていきます。相手も移動していることを考えると,ある程度移動先を予測しながら攻撃することになります。
・敵に見つからないように移動するとはいえ,じっとしたままでは自分の居場所を相手に推測されてしまいます。相手に見つけられないように,適度に移動していくことが必要です。
・戦略を立てながら行動するアルゴリズムを考えるこうしていろいろな戦略を立てて,それに合わせてアルゴリズムを組み立てていきます。相手もまた戦略を立ててくるので,それを見極めて対抗策を立てることも必要でしょう。いろいろなことを同時に考えていくと奥が深いものです。今回は,こうした中から移動に関する処理を中心に作成してみます。