· 技術 · NOTE_04

同じ2チームなら、必ず同じ結果になる仕組み乱数の「種」をチームから決める

画像走のレースには、スキルを出すタイミングや、攻撃をよけられるかどうかなど、運の要素があります。それなのに、同じ2つのチームなら、何度走っても、だれの画面で走っても、展開と勝敗はまったく同じです。その仕組みを紹介します。

なぜ「同じ結果」にしたかったのか

理由は2つあります。

コンピューターの「乱数」は、実は決まっている

ゲームの運の要素には、乱数(でたらめな数)を使います。ただ、コンピューターが作る乱数の多くは、本当のでたらめではありません。ある計算式に最初の数を入れると、それをもとに次々と数が作られていく仕組みで、最初の数のことを「種(シード)」と呼びます。

同じ種から始めれば、出てくる数の並びは毎回まったく同じになります。逆に、種が違えば、まったく違う並びになります。つまり、種さえそろえれば、別々の端末でも同じ「運」を再現できるのです。

種を、2つのチームの色から作る

画像走では、この種を2つのチームの色から作っています。

  1. チームを文字にする64人の色を、挑戦状のリンクに入れるのと同じ192文字の文字列にします(色の文字への直し方は「画像を外に送らずにゲームを作る」で紹介しています)。
  2. 2チームの順番をそろえる「自分」と「相手」は、見る人によって入れ替わります。そこで、2つの文字列を決まった順番(辞書の順)に並べてからつなげます。こうすると、送った人の画面でも受け取った人の画面でも、同じ並びになります。
  3. 文字列から1つの数を作るつなげた文字列を、ハッシュ関数という計算で1つの数にまとめます。文字列が1文字でも違えば、まったく違う数になります。この数を乱数の種にします。

あとは、この種から作った乱数の並びを、決まった順番で使ってレースを進めるだけです。だれがいつスキルを出すか、攻撃をよけられるかは、すべてこの並びで決まります。

「同じ順番で使う」ことも大事

種をそろえても、乱数を使う順番が変わってしまえば、結果は変わります。たとえば、画面の描画の速さによって計算の回数が変わるような作りだと、速い端末と遅い端末で結果がずれてしまいます。

画像走では、レースの計算を画面の描画とは切り離しています。レースは決まった長さの「1コマ」の積み重ねとして最初から最後まで計算され、画面はその結果を再生しているだけです。端末の性能によって再生がなめらかかどうかは変わっても、計算そのものは変わりません。

本当に同じになるかを、試験で確かめる

こうした仕組みは、少しの変更で壊れてしまうことがあります。そこで、プログラムを変えるたびに、自動の試験で次のことを確かめています。

運があるのに、運任せではない

1回のレースの中では、スキルが当たったり外れたりして、展開はめまぐるしく変わります。でも、同じ2チームなら結末はいつも同じ。運の要素で見ていて楽しく、結果が決まっていることで作戦が立てられる。この2つを両立させるための仕組みでした。