イベント
[CEDEC 2014]ナムコ作品で見る乱数の歴史。「ゲーム世界を動かすサイコロの正体 〜 往年のナムコタイトルから学ぶ乱数の進化と応用」レポート
この講演のユニークな点は,旧ナムコの作品を「乱数」という視点から振り返るということだ。バンダイナムコスタジオ HE技術部のプログラマーである加来量一氏は,旧ナムコの初期作品50本を解析し,それぞれの時代でどのような乱数が使われていたかを特定した。そこから見えてくる乱数技術改良の歴史を見ていくというのが,講義の主旨なのである。
ゲームにおいても,乱数は重要な役割を担っている。敵の動きやAIの振る舞いなどが毎回変化し,展開が単調にならないのは乱数のおかげだ。乱数は,次に何の数が出るか分からない「真の乱数」と,ある程度の法則性がある「疑似乱数」に分類できるが,現代のゲームでは疑似乱数が使われている。これは,真の乱数を使うと,自分のプレイを後から再生できるリプレイ機能などがうまく働かないためであるという。
疑似乱数の仕組み。上部のseed(乱数のもととなる数)に,アルゴリズムで加工を加えることで乱数を生み出していく。偏りのない乱数を生み出すため,これまでもさまざまな改良が繰り返されてきた |
今回の研究のテーマとなる8ビット時代では,かなり限られた条件下で乱数を作らなければならなかった |
時代と共に変化していく乱数
・混沌の時代
加来氏は,ナムコ最初期を乱数技術における「混沌の時代」であると分類する。CPUの処理能力やメモリの制限が大きい中,プログラマーが乱数を発生させる方法を模索し,それぞれのタイトルで色々な手法が使われていたためだ。
画面同期を行った回数を乱数の替わりに用いたほか,「パックマン」ではseedを使ってメモリのどこかのアドレスにアクセスし,そこに存在する数値を乱数として用いたり,「ギャラガ」のようにメモリをリフレッシュするための「Rレジスタ」をseedにするといった工夫が用いられていたという。
混沌の時代では,プログラマーごとに異なった方法で乱数を生成していた |
パックマンではseedを使ってメモリにアクセスし,そこにある数値を乱数として使用していたという。スライド中に書かれたコードは,それぞれの乱数発生方式を加来氏がC言語で解釈し直したもの |
・線形合同法(LCG)の時代
その後,乱数生成に「線形合同法」(LCG)というアルゴリズムが用いられるようになる。LCGはC言語標準ライブラリの乱数で使われていることでも有名で,ひと言で表わすと「足し算とかけ算の組み合わせ」だ。当時CPUとして使われていたZ80はかけ算ができなかったため,足し算を連続させることで擬似的なかけ算とし,LCGを実現していたというから,いかに制限が大きかったかがうかがえる。
・線形帰還シフトレジスタ(LFSR)の時代
簡単に実装でき,ばらつきのある乱数を出力できることから,LCGに次いで次いで「線形帰還シフトレジスタ」(LFSR)が使われるようになった。「ギャラクシアン」や「ギャラガ」の背景できらめく星々も,実はLFSRによる乱数から作られている。画面を1ドット描くごとに乱数が作られ,星の有無や色などが決められているそうだ。
「ギャラクシアン」や「ギャラガ」においてLFSRはハードウェア的に実装され,星々を描くのに使われている |
加来氏解析による,LFSRを使用した代表的なナムコタイトル |
そして「乱数の話をする際には欠かせないだろう」ということで紹介されたのが「ドルアーガの塔」だ。本作は,主人公のギルが迷路状のフロアを突破していくという60面構成のゲーム。現在のゲームであれば,プログラムの中に60階分のマップデータが内蔵されているところだが,本作にはそうしたものは存在しない。ステージ開始時の音楽が鳴っている最中,乱数を使って迷路の壁が生成されているという。
乱数のseedとなるのは,ステージごとに決められた数値。seedが決められているため,毎回同じ形の迷路が生成されることになる。ランダムな結果を導き出すはずの乱数が,毎回同じでなければならないマップを作るのに使われている逆転現象が面白い。
同作の迷路で特徴的なのが,通路が右下へ伸びるジグザグの階段状になっていることで,これはLFSRが1回の計算で1ビットの乱数を生成するところを,2ビット組み合わせて使っていることから,規則的な階段状の構造が生まれるのだという。加来氏によれば,ドルアーガの塔については「このテーマだけで講演時間を全て使っても説明しきれない」ほどにディープな話題なのだそうだ。
・LCG+LFSRの時代
ある程度まんべんなく乱数が出力できるものの,偏りも生まれやすく,下位のビットが周期化しやすいLCG。ハードウェア的には簡単に実装できるものの,1回の操作で1ビットしか乱数が出力できないため,ビット数の多い乱数を生成するためには計算回数が増えてしまうLFSR。それぞれにメリットとデメリットを持つ2つの形式だが,80年代中盤には両者を組み合わせた使用法がメインになった。これにより,両者の良い所取りが可能になっていったという。
・テーブルの時代
使えるメモリが少なかった時代は,テーブル(乱数表)を内部に持つようなことが難しかったが,80年代末にメモリが増えたことから,テーブルを使った乱数が主流になっていく。
・C言語の時代
90年代のゲーム開発ではC言語が盛んに使われるようになる。前述したようにC言語は標準ライブラリで乱数を生成できるため,これまでのような自作アルゴリズム乱数は姿を消していったそうだ。ただ,標準ライブラリの乱数はLCGによるものなので,LCGの問題が再燃したことから,現在では近代的なアルゴリズムが使われているという。
最後に加来氏は「癖のある乱数も,使い方次第でドルアーガの塔のようにゲームに味を加えることができます。乱数の性質を見極めて正しく使って下さい」と語って講演を締めくくった。
CEDEC 2014記事一覧
- この記事のURL: