同じ2チームなら、必ず同じ結果になる仕組み乱数の「種」をチームから決める
画像走のレースには、スキルを出すタイミングや、攻撃をよけられるかどうかなど、運の要素があります。それなのに、同じ2つのチームなら、何度走っても、だれの画面で走っても、展開と勝敗はまったく同じです。その仕組みを紹介します。
なぜ「同じ結果」にしたかったのか
理由は2つあります。
- 挑戦状で、同じレースを見てもらうため:挑戦状を送った人と受け取った人の画面で、勝敗が食い違っては困ります。でも画像走にはサーバーで結果を管理する仕組みがありません(画像を外に送らないためです)。それぞれの端末が別々に計算しても、同じ結果になる必要がありました。
- 「画像選び」を作戦にするため:やり直すたびに結果が変わるなら、勝てるまで同じ画像で何度も走ればよいことになります。結果が決まっていれば、勝つには画像を選び直すしかありません。どの写真が強いかを考えること自体が、遊びになります。
コンピューターの「乱数」は、実は決まっている
ゲームの運の要素には、乱数(でたらめな数)を使います。ただ、コンピューターが作る乱数の多くは、本当のでたらめではありません。ある計算式に最初の数を入れると、それをもとに次々と数が作られていく仕組みで、最初の数のことを「種(シード)」と呼びます。
同じ種から始めれば、出てくる数の並びは毎回まったく同じになります。逆に、種が違えば、まったく違う並びになります。つまり、種さえそろえれば、別々の端末でも同じ「運」を再現できるのです。
種を、2つのチームの色から作る
画像走では、この種を2つのチームの色から作っています。
- チームを文字にする64人の色を、挑戦状のリンクに入れるのと同じ192文字の文字列にします(色の文字への直し方は「画像を外に送らずにゲームを作る」で紹介しています)。
- 2チームの順番をそろえる「自分」と「相手」は、見る人によって入れ替わります。そこで、2つの文字列を決まった順番(辞書の順)に並べてからつなげます。こうすると、送った人の画面でも受け取った人の画面でも、同じ並びになります。
- 文字列から1つの数を作るつなげた文字列を、ハッシュ関数という計算で1つの数にまとめます。文字列が1文字でも違えば、まったく違う数になります。この数を乱数の種にします。
あとは、この種から作った乱数の並びを、決まった順番で使ってレースを進めるだけです。だれがいつスキルを出すか、攻撃をよけられるかは、すべてこの並びで決まります。
「同じ順番で使う」ことも大事
種をそろえても、乱数を使う順番が変わってしまえば、結果は変わります。たとえば、画面の描画の速さによって計算の回数が変わるような作りだと、速い端末と遅い端末で結果がずれてしまいます。
画像走では、レースの計算を画面の描画とは切り離しています。レースは決まった長さの「1コマ」の積み重ねとして最初から最後まで計算され、画面はその結果を再生しているだけです。端末の性能によって再生がなめらかかどうかは変わっても、計算そのものは変わりません。
本当に同じになるかを、試験で確かめる
こうした仕組みは、少しの変更で壊れてしまうことがあります。そこで、プログラムを変えるたびに、自動の試験で次のことを確かめています。
- 同じ2チームで何度計算しても、結果が同じになること
- 「自分」と「相手」を入れ替えて計算しても、勝敗が一致すること
- リンクに入れた色を読み戻したとき、元の色と同じになること
運があるのに、運任せではない
1回のレースの中では、スキルが当たったり外れたりして、展開はめまぐるしく変わります。でも、同じ2チームなら結末はいつも同じ。運の要素で見ていて楽しく、結果が決まっていることで作戦が立てられる。この2つを両立させるための仕組みでした。