Skip to content

プレイヤーごとに異なる乱数を使う

プレイヤーごとに異なる乱数を使うには、g.Game#localRandom を利用します。

凡例

javascript
const randomValue = g.game.localRandom.generate(); // 0 以上 1 未満の乱数を生成。この値は各プレイヤーで異なる
const randomValue = g.game.localRandom.generate(); // 0 以上 1 未満の乱数を生成。この値は各プレイヤーで異なる

プレイヤー全員に同じ乱数を生成するには g.game.random を利用してください。

詳細

g.game.localRandom は、各プレイヤーでシード値が異なる乱数生成器です。すなわち、同じ回数生成しても、プレイヤーごとに異なる値が得られます。

Akashic Engine の乱数生成器には、他に g.game.random があります。こちらは全プレイヤーが同じシード値を持ちます。 例えば対戦型のゲームで、ステージをランダムに生成する時は、全プレイヤーが同じデータを生成する必要があるので g.game.random を使います。

これに限らず、ほとんどの状況で乱数生成には g.game.random を使用してください。 例えば「各プレイヤーの初期ステータスを乱数で決める」ような、一見プレイヤーごとに異なる場合でも、 g.game.random が適当です。 Akashic Engine のマルチプレイでは「全員のデバイス上で、全プレイヤーの初期ステータスを、同じ順序で生成した乱数で決める」ことによって、状態 (初期ステータス) を共有するからです。

この例外がローカルイベントの処理です。 ローカルイベントの処理中に乱数を生成する場合は、常に g.game.localRandom を使用してください 。 ローカルイベントは、それを発生させたプレイヤー自身にしか通知されないイベントです。 その処理中に g.game.random を使ってしまうと以降の乱数の系列がずれてしまい、他プレイヤーと状態が一致しなくなってしまいます。

javascript
const localRect = new g.FilledRect({
  ..., // その他のプロパティ
  local: true, // ローカルであることを指定
  touchable: true // クリック・タッチ可能
});
scene.append(localRect);

localRect.onPointDown.add(function() {
  // 0 以上 100 未満の乱数を得る。
  // localRect はローカルエンティティなので、ここで g.game.random は *使ってはならない* 。
  const randomWidth = g.game.localRandom.generate() * 100;

  // クリック・タッチしたプレイヤーの手元でのみ、localRect の幅を変える。
  // 幅はプレイヤーごとに、またクリックする度に異なる値になる。
  localRect.width = 30 + randomWidth;
  localRect.modified();
});
const localRect = new g.FilledRect({
  ..., // その他のプロパティ
  local: true, // ローカルであることを指定
  touchable: true // クリック・タッチ可能
});
scene.append(localRect);

localRect.onPointDown.add(function() {
  // 0 以上 100 未満の乱数を得る。
  // localRect はローカルエンティティなので、ここで g.game.random は *使ってはならない* 。
  const randomWidth = g.game.localRandom.generate() * 100;

  // クリック・タッチしたプレイヤーの手元でのみ、localRect の幅を変える。
  // 幅はプレイヤーごとに、またクリックする度に異なる値になる。
  localRect.width = 30 + randomWidth;
  localRect.modified();
});

補足

ランキングモードで動作する場合のニコ生ゲームは、実行方法が通常のマルチプレイと異なるため g.game.random もプレイヤーごとに異なります。詳細はこちらを参照してください。

関連情報