chinchiroのロジック解説(8)

パスの処理

今日はパスの処理について書きます。

chinchiroでは、while(true)で親を変えながらゲーム進行のイテレーターのサイクルを回すのがメイン処理だということを前回の記事に書きました。

プレイヤーが親の時と、子の時で処理が違うのでご紹介します。

プレイヤーが親の時

アクションの選択肢でパスを選ぶことにより、親を交代して次のサイクルに移るようになっています。

if ((action === 'pass') && (this.users[0] === this.user1)) {
  const prevDieler = this.users.shift()
  this.users.push(prevDieler)
  continue
} 

前の記事にも書きましたが、usersはユーザーインスタンスの入った配列で、user1はプレイヤーです。そしてusers[0]は親番を表しています。

アクションでパスが選ばれ、かつ親番がプレイヤーの時、users.shift()で先頭のユーザー(親)を配列から取り除き、users.pushで配列の最後に追加します。 そして、continueでその回のサイクルを抜け、次のサイクルに移ります。

プレイヤーが子の時

親と同じようにcontinueを使うと、プレイヤーと親の勝負だけでなく、プレイヤー以外のユーザー2人の勝負も飛ばされることになってしまいます。 そこで、子の時には親の時とは違うパスの処理をすることにしました。

if ((action !== 'pass') || (this.users[1] !== this.user1)) {
  await this.bout(this.users[0], this.users[1])
}
if ((action !== 'pass') || (this.users[2] !== this.user1)) {
  await this.bout(this.users[0], this.users[2])
}

bout()は、親と子のユーザーが勝負するメソッドです。 アクションがパスでない、または親と勝負するユーザーでない場合は勝負が行われます。 つまり逆にいうと、アクションがパスかつ親と勝負するユーザーの時は処理が行われない=パスと言うことになります。

こうすることで、パスの時でもプレイヤー以外のユーザーの勝負は行われ、プレイヤーの勝負だけ飛ばすことができるようなロジックになっています。