# 分析器模块

源码: server/analyser/

依据 gameRecords 模块记录的信息(即 Game 实例)进行分析,给出一些操作结果 (operations)。

注: 暂时使用 EndlessCheng/mahjong-helper (opens new window) 包装了一个初级分析器。效果不如机器学习的模型。希望有能力的开发者写出更有力的分析器模块。

# 输入输出

输入:

  • game.round (即 Game 实例中的当前 Round 实例,记录了当前牌桌。只读。)
  • 吃碰杠目标牌(可能需要)。

输出:JSON 格式,表示操作结果。

# API

# Analyser

Analyser 类须继承 BaseAnalyser 类(/server/types/Analyser.ts),即必须包含如下的方法:

(注:Tile 类型即 '1p' '2m' '3z' 等,请参考 server/types/General.ts)

export abstract class BaseAnalyser {
  // 分析舍张
  // - choice:表示舍张
  // - info:无实际意义,可输出作为用户参考
  abstract analyseDiscard (round: Round): { choice: Tile, info: string }

  // 分析吃
  // - targetTile:表示要吃的那张牌(即别人打出的)
  // - choice:表示是否副露
  // - info:无实际意义,可输出作为用户参考
  abstract analyseChi (round: Round, targetTile: Tile): { choice: boolean, info: string }

  // 分析碰
  // - targetTile:表示要碰的那张牌(即别人打出的)
  // - choice:表示是否副露
  // - info:无实际意义,可输出作为用户参考
  abstract analysePeng (round: Round, targetTile: Tile): { choice: boolean, info: string }

  // 分析普通杠
  // - targetTile:表示要杠的那张牌(即别人打出的)
  // - choice:表示是否副露
  // - info:无实际意义,可输出作为用户参考
  abstract analyseGang (round: Round, targetTile: Tile): { choice: boolean, info: string }

  // 分析暗杠
  // - targetTile:表示要杠的那张牌
  // - choice:表示是否暗杠
  // - info:无实际意义,可输出作为用户参考
  abstract analyseAnGang (round: Round, targetTile: Tile): { choice: boolean, info: string }

  // 分析加杠
  // - targetTile:表示要杠的那张牌
  // - choice:表示是否加杠
  // - info:无实际意义,可输出作为用户参考
  abstract analyseAddGang (round: Round, targetTile: Tile): { choice: boolean, info: string }

  // 分析立直
  // - choice:表示是否立直
  // - discard:立直宣言牌
  // - info:无实际意义,可输出作为用户参考
  abstract analyseLiqi (round: Round): { choice: boolean, discard: Tile, info: string }

  // 分析是否选择荣和
  // - choice:表示是否选择荣和
  // - info:无实际意义,可输出作为用户参考
  abstract analyseHule (round: Round): { choice: boolean, info: string }

  // 分析是否选择自摸
  // - choice:表示是否选择自摸
  // - info:无实际意义,可输出作为用户参考
  abstract analyseZimo (round: Round): { choice: boolean, info: string }

  // 分析是否选择拔北
  // - choice:表示是否选择拔北
  // - info:无实际意义,可输出作为用户参考
  abstract analyseBabei (round: Round): { choice: boolean, info: string }
}