2011年08月21日

乱数のコントロール

乱数のコントロール

ゲームにおいて乱数というのは多くの場面で使われています。テトリスで次にどんな形状が出現するか、RPGで敵にエンカウントするかどうか、シューティングで敵がどの方向に弾を撃つか。そのような場面で乱数が使われます。

しかし、乱数というのは偏りがあります。長いスパンでみれば、出現する乱数の数値は均一になると思いますが、一時的には偏ることがあります。例えば、テトリスでいつまでたってもテトリス棒が落ちてこない。あるいは、四角ばっかり落ちてくる、そんな経験はないでしょうか。これは乱数の偏りによるものです。

(これはこれで「良し」としても構いません。それに対する攻略も生まれます。)

乱数のコントロールは重要ですが、軽視されがちです。普通のプレイヤーであれば、気づいていないことも多いと思います。(逆にゲームをやりこんでいる人にとっては、乱数のことをすごく研究している人もいると思います。「電源パターン」と呼ばれる攻略法も存在します。)

具体例

テトリスで次にどんな形状が登場するか

昔のテトリス(ゲームセンターに置いてあるセガのテトリス:恐竜とかサルがでてくるやつ,初代ゲームボーイのテトリス)では、乱数により7種類のブロックが落ちてきます。そのため乱数の偏りを受けて、同一ブロックが連続して出現したり、逆に期待するブロックがいつまでも落ちてこないことがあります。

テトリスの場合は、7種類のブロックが均一に出現するのが良いはずです。

近年のテトリス(アリカのTGMシリーズ,DSのテトリスなど)では、独自のアルゴリズムにより偏りを無くすようにしています。アリカのTGMシリーズでは、過去4個の出現したブロックを履歴として記憶しておき、連続するブロックは出現しにくいようになっています。DSのテトリスでは、ブロックの種類を乱数で決めるのではなく、7種のブロックの順番を乱数で決めることで、出現率を一定にしています。

RPGで敵にエンカウントするかどうか

一般的にエンカウント率を設定することで調整します。が、調整したいのは、ある街からある街までの間に何回エンカウントするか、ということを決めたいわけです。10歩あたり1回のエンカウント、と決めたとしても、乱数の偏りによっては1回もエンカウントしないこともありますし、一歩歩く毎にエンカウントすることもあります。

かといって、10歩でエンカウント、と決めてしまうと揺らぎがなくなり、ゲームとして面白くなくなります。

そこで、エンカウント率を低く設定しておき、一歩歩く毎にエンカウント率を上昇させる。最大で10歩歩いたら確実にエンカウントする。などのようにすることで、乱数によるばらつきがありつつも、エンカウント回数を制御することができます。

他には、街の近くではエンカウントしづらい、洞窟などのダンジョンの中ではエンカウントしやすい、扉を開けた直後や画面切り替えの直後にエンカウントしやすい、敵から逃亡した直後はエンカウントしやすい、などといった調整を行ったりします。

シューティングで敵がどの方向に弾を撃つか

シューティングの敵キャラは、時にランダムで弾をばらまきますが、方向を乱数によって決めます。これが偏りがあると、簡単に「安全地帯」が生まれたり、逆に「脱出不可能」になってしまいます。

これを防ぐために、ある程度の範囲を絞って乱数を使います。例えば弾幕系シューティングなどで360度に弾をばらまくとき、乱数で360度を範囲に決めてしまうと、ある角度に偏った弾幕や隙間が生まれることがあります。そこで、10度ずつ36回に分けて乱数を使うと、乱数によるばらつきはありつつも、均等に360度にばらまくことができます。

最後に

冒頭にも書きましたが、乱数のコントロールは軽視されがちですが、重要です。乱数によるばらつきが大きくなれば、ゲームの難易度にも影響が出てきます。

重要なのは、制作側が意図した範囲内に乱数の結果を収めることと、コントロールしすぎてプレイヤー側が冷めない程度にすること、だと思います。(その調整が難しいのですが…)

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

タグ:ゲーム制作
posted by among at 15:41 | Comment(0) | TrackBack(0) | ゲーム制作

2011年08月14日

C#とDXライブラリでゲーム制作2 4回目(最終回)

なんだかもはやDXライブラリは関係なくなってしまいましたが、完成したプログラムを公開します。 テトリスとしての作りは雑ですが、ゲームとしてはプレイできる品質にはなっていると思います。

詳しくは解説しません。ソース中のコメントを参照して下さい。
Tetris.zip

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 19:00 | Comment(0) | TrackBack(0) | ゲーム制作

2011年08月13日

C#とDXライブラリでゲーム制作2 3回目

キーボードリピート処理

キーボードのリピート処理は、あるキーを一定時間押し続けたときに、キーを連打したかのように振る舞う処理です。そこで、「一定時間押し続けた」の判定のためのカウンタ値を用意します。

キーの状態をリードしたときに、そのキーが押下状態であれば、カウンタ値をカウントアップします。そして、カウンタ値が一定数以上になれば、リピート状態になったと判断します。また、キーが放されれば、カウンタ値をゼロにクリアします。

改造した「キーボード押下状態制御クラス」を公開します。
InputController.cs

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 20:00 | Comment(0) | TrackBack(0) | ゲーム制作