chinchiroのロジック解説(9)

イカサマ

今回はイカサマのロジックについて解説します。

if (action === 'ikasama') {
  if (this.users[0] !== this.user1) {
    await this.user1.bet()
  }
  this.jigoro_dice._lisk += 20
  if (this.jigoro_dice._lisk > 100) {
    this.jigoro_dice._lisk = 100
  }
  this.user1._dice = this.jigoro_dice
  if (Math.floor(Math.random() * 100) < this.jigoro_dice._lisk) {
    console.log('\u001b[91mdiscovered!\u001b[0m')
    this.user2._dice = this.pinzoro_dice
    this.user3._dice = this.pinzoro_dice
  } else {
    console.log('\u001b[92mnot discovered\u001b[0m')
  }
}

上から順に説明します。まず、アクションの選択でイカサマが選ばれた場合にこれらの処理が行われます。

users[0]がuser1でない時、つまりプレイヤーが親でない時に掛け金を決めます。親の時は子が掛け金を決めたのを受ける形のため、掛け金を決めるbet()メソッドを行いません。

また、イカサマがバレる判定の前に掛け金を決めないといけないので、最初の方にこの処理を持ってきています。

ジゴロさい

ロジック解説(1)でも書きましたが、ジゴロさいはプレイヤー専用のサイコロで、コンストラクタで_liskの属性をもっているオブジェクトです。

通常のサイコロと違い、4〜6の値しか出ないため有利にゲームを進められます。

class JigoroDice {
  constructor () {
    this._lisk = 0
  }

  get lisk () {
    return this._lisk
  }

  set lisk (probability) {
    this._lisk = probability
  }

  roll () {
    return Math.floor(Math.random() * 3) + 4
  }
}

ただし、イカサマのたびに発覚のリスクの数値が20%ずつ上がり、イカサマが発覚するとペナルティがあります。

if (Math.floor(Math.random() * 100) < this.jigoro_dice._lisk) 

この部分でランダムな0〜100未満の数値とリスクを比べ、リスクの数値の方が高い場合に発覚、としました。

見つかった場合その回に限り他のユーザーのサイコロが、必ずピンゾロが出るピンゾロさいになります。(漫画カイジを少し再現)